最近看到一些网上在售的NAT服务器,买了一个发现是用Docker实现的虚拟化,遂稍微研究了下,用KVM虚拟化的云服务器(系统为Debian12)和docker(Ubuntu22镜像)简单试了一下,特此记录。

  1. 首先需要准备两个文件,分别为/etc/shadow和/etc/ssh/sshd_config。其中shadow文件存储了Linux系统中用户的加密密码,sshd_config为服务器中SSH的配置文件,就地取材即可。

    sudo -s
    mkdir /opt/ubuntu
    mkdir /opt/ubuntu/ubuntu22
    cp /etc/shadow /opt/ubuntu/ubuntu22
    cp /etc/ssh/sshd_config /opt/ubuntu/ubuntu22
    touch Dockerfile
  2. 编辑Dockerfile文件,构建一个基本能够连接的ubuntu22镜像(默认镜像甚至无法使用SSH)。

    cd /opt/ubuntu/ubuntu22
    vim Dockerfile
    
    FROM ubuntu:jammy
    
    RUN apt-get update && apt-get upgrade -y && apt install locales openssh-server openssh-client -y && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
    ENV LANG en_US.utf8
    COPY ./shadow /etc/shadow
    COPY ./sshd_config /etc/ssh/sshd_config
  3. 构建这个Dockerfile(应确保Dockerfile、shadow、sshd_config都在/opt/ubuntu/ubuntu22目录下)。

    cd /opt/ubuntu/ubuntu22
    docker build -t akhyui/ubuntu22:v1 .
  4. 构建完成后,准备docker-compose环境(如果有,可跳过这步),可以从GitHub上下载一个。

    cd /root
    # 服务器是x86_64架构,所以我下载了docker-compose-linux-x86_64
    wget https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64
    mv docker-compose-linux-x86_64 docker-compose
    chmod +x docker-compose
    mv docker-compose /usr/local/bin/
  5. 此时服务器应当可以使用docker-compose。

    root@localhost:/opt/ubuntu# docker-compose 
    
    Usage:  docker compose [OPTIONS] COMMAND
    
    Define and run multi-container applications with Docker.
    ## 此处省略
    Run 'docker compose COMMAND --help' for more information on a command.
  6. 在/opt/ubuntu下创建一个文件,其名为docker-compose.yml,并编辑以下内容。

    cd /opt/ubuntu
    vim docker-compose.yml
    version: '3.3'
    services:
     ubuntu:
         mem_limit: 128m
         cpus: 1
         ports:
             - 1022:22
             - 7000:7000
             - 7001:7001
             - 7002:7002
             - 7003:7003
             - 7004:7004
         image: 'akhyui/ubuntu22:v1'
         networks:
           vserver:
             ipv4_address: 172.10.1.2
         storage_opt:
           size: 10G
         command: sh -c "/etc/init.d/ssh start && tail -f /dev/null"
    
    networks:
      vserver:
     driver: bridge
     ipam:
       driver: default
       config:
         - subnet: 172.10.1.0/24
           gateway: 172.10.1.1

    mem_limit: 128m可将内存限制在128m。
    cpus: 1可将CPU核心数限制在1核。
    ports为docker容器映射的端口(左边是宿主机右边是容器)。
    storage_opt中指定存储大小。
    command: sh -c "/etc/init.d/ssh start && tail -f /dev/null"这个命令使ssh服务持续启动,可以维持容器的持续运行。
    networks部分会创建一个名为vserver的网络,services中的network按照底部创建好的网络设定容器IP,配置文件中的容器IP被设定为了172.10.1.2,底部network创建的网络配置网段为172.10.1.0/24,网关为172.10.1.1。

  7. 以上配置完成后,使用docker-compose执行这个配置文件。

    cd /opt/ubuntu
    docker-compose up -d

    执行完成后尝试进行连接(xxx.xxx.xxx.xxx为宿主机IP,若无法连接,可检查宿主机防火墙是否已放行1022端口)。

    ssh xxx.xxx.xxx.xxx -p 1022
  8. 此方案仅用于尝试和实践,请注意此方案不适用于生产环境,不要用来执行任何设计重要数据的文件!