Docker | 如何在 Linux 服务器使用 docker


(致谢技术非常强的专家

00 需求

需要配置一些新的服务器,只能通过 ssh boss@172.16.1.100 来连接,然后在 /data1 磁盘下创建自己的 docker,用 ssh 连接 docker 来使用服务器。

(boss 和 172.16.1.100 地址均为虚构,在使用时,需要替换成自己希望配置的服务器地址,和可以使用的账号)

系统:Ubuntu 20.04,有 nvidia 显卡。

01 安装 docker

(我需要配置的服务器里已经安装了 docker,因此没有做这个步骤。以下教程是 LLM 生成的)

# 首先,确保系统中没有旧版本的 Docker sudo apt-get remove docker docker-engine docker.io containerd runc  # 然后,更新包列表并安装必要的包 sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common  # 添加 Docker 的官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -  # 设置 Docker 的稳定版仓库 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"  # 更新包列表以包含 Docker 仓库中的软件包 sudo apt-get update  # 安装 Docker CE、Docker CLI 和 Containerd sudo apt-get install docker-ce docker-ce-cli containerd.io  # 检查 Docker 的安装版本 docker --version  # 验证 Docker 是否安装成功,这个命令会下载并运行一个测试镜像 sudo docker run hello-world  # 最后,配置 Docker 开机自启 sudo systemctl enable docker 

为了不使用 sudo 运行 Docker 命令,可以将当前用户添加到 docker 组:

sudo usermod -aG docker $USER 

重新登录或重启系统以使组更改生效。

02 准备工作

新建准备放 docker 的目录,并改变目录权限:(<user_name> 是我的名字,在跑命令时,需要替换成希望 docker 拥有的名字)

sudo mkdir /data1/<user_name> sudo chown boss /data1/<user_name>/ -R sudo chgrp boss /data1/<user_name>/ -R mkdir /data1/<user_name>/docker mkdir /data1/<user_name>/project 

配置 ssh 的 authorized_keys:

cd /data1/<user_name>/docker/ vim authorized_keys # 把本地电脑 user/.ssh 里面的 id_rsa.pub 的内容复制上去 

03 配置 Dockerfile 和 docker composer

新建 Dockerfile:

cd /data1/<user_name>/docker/ vim Dockerfile 

Dockerfile 的具体内容:

# 看一下 docker images 里面有哪些镜像 FROM nvidia/cuda:11.6.0-devel-ubuntu20.04  # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone  # 安装基础软件 RUN apt-get update &&      apt-get install -y      openssh-server      python3      python3-pip      vim      git      wget      curl      unzip      sudo      net-tools      iputils-ping      build-essential      cmake      htop      && apt-get clean      && rm -rf /var/lib/apt/lists/*   # 安装其他软件 RUN apt-get update &&      apt-get install -y      tmux      && apt-get clean      && rm -rf /var/lib/apt/lists/*  # 创建用户(保持与宿主机相同的 UID 避免权限问题) RUN useradd -m -u 1001 -s /bin/bash <user_name>  # sudo without password RUN echo "<user_name> ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers  USER <user_name> WORKDIR /home/<user_name>  # 创建 .ssh 目录并设置权限 RUN mkdir -p /home/<user_name>/.ssh &&      chown -R <user_name>:<user_name> /home/<user_name>/.ssh &&      chmod 700 /home/<user_name>/.ssh  # 安装 Conda RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh &&      bash miniconda.sh -b -p /home/<user_name>/miniconda &&      rm miniconda.sh RUN /home/<user_name>/miniconda/bin/conda init bash  CMD ["/bin/bash"] 

配置 docker composer 之前,先确认哪个端口可用:

sudo netstat -tuln # 找一个不被列出的端口,比如 8012 

然后,新建 docker composer:

cd /data1/<user_name>/docker/ vim docker-compose.yml 

docker-compose.yml 的具体内容:

version: '3.8'  services:   <user_name>:     container_name: <user_name> # 设置容器名称     build: . # 使用当前目录下的 Dockerfile 构建镜像     image: <user_name> # 镜像名称     restart: unless-stopped     runtime: nvidia # 启用 GPU 支持     ports:       - "8012:22" # 选择一个未被占用的端口(请确认 8012 可用)     volumes:       - /data1/<user_name>/project:/home/<user_name>/project # 挂载项目目录       - /data1/<user_name>/docker/authorized_keys:/home/<user_name>/.ssh/authorized_keys  # SSH      environment:       - NVIDIA_DRIVER_CAPABILITIES=all     command: /bin/bash -c "sudo service ssh start && sleep infinity"  

一个兼容旧版本 docker 的 docker composer(我并不懂什么旧版本,都是专家写的)

services:   container_name: <user_name> # 设置容器名称   build: . # 使用当前目录下的 Dockerfile 构建镜像   restart: unless-stopped   ports:     - "8012:22" # 选择一个未被占用的端口(请确认 8012 可用)   volumes:     - /data1/<user_name>/project:/home/<user_name>/project # 挂载项目目录     - /data1/<user_name>/docker/authorized_keys:/home/<user_name>/.ssh/authorized_keys  # SSH    environment:     - NVIDIA_DRIVER_CAPABILITIES=all   command: /bin/bash -c "sudo service ssh start && sleep infinity" 

04 启动 docker

然后,启动 docker:

cd /data1/<user_name>/docker/ docker compose build  # build Dockerfile docker compose up -d  # 启动 docker # 旧版本 docker docker-compose build  # build Dockerfile docker-compose up -d  # 启动 docker  # 进入 docker 看一下 docker exec -it <user_name> bash # 然后 ls,会看到 miniconda 和 project 两个目录,所有需要映射到磁盘、不希望丢失的文件都需要放到 project 里  # 查看目录权限 ls -al  # 发现权限有问题,退出 docker,再改一下目录的权限 sudo chown boss /data1/<user_name>/ -R sudo chgrp boss /data1/<user_name>/ -R  # 如果发现 Dockerfile 写错了,或者想加一些东西,可以再跑 docker compose build  # build Dockerfile docker compose up -d  # 会变成 Recreating <user_name>  # 假设已经进入了 docker,想改 docker 的 ./ssh 的权限 docker exec -it <user_name> bash sudo chown <user_name> ~/.ssh -R sudo chgrp <user_name> ~/.ssh -R  # 暂时停止和启动 docker docker compose stop docker compose start  # 把 docker 杀掉 docker compose down 

05 测试能否 ssh 连接这个 docker(可能需要结合 04 来 debug)

# 在本地电脑上连接 ssh -p 8012 <user_name>@172.16.1.100 

ssh 连接不成功(比如让输密码),很可能是 docker 内外的 .ssh 或 authorize_keys 的权限出了问题,docker 外要改成 boss,dockers 内要改成 <user_name>。

如果连接时出现

ECDSA host key for [172.16.1.100]:8012 has changed and you have requested strict checking. Host key verification failed. 

则需要把 known_host 里面的 172.16.1.100 删除,上面的错误提示会给出需要执行的命令。

发表评论

评论已关闭。

相关文章