文章

Docker Engine 网络受影响的情况下的本地部署的配置流程

Docker Engine 网络受影响的情况下的本地部署的配置流程

在某些网络访问受限的情况下, 例如不能访问 Docker hub, Docker Apt 源, Nvidia Apt 源, 或者设备与自建/公共的镜像托管服务网络连接不稳定等情况, 仍然需要安装 Docker 并运行GPU应用, 可以参考以下方案:

网络受限的情况下安装Docker Engine的方案

  1. 卸载旧版docker和删除残留

    1
    
     sudo apt remove docker docker-engine docker.io containerd runc
    
  2. 安装安装所需依赖工具

    1
    
     sudo apt -y install ca-certificates curl gnupg lsb-release
    
  3. 添加阿里云镜像的公钥

    1
    
     curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    

    打印返回(返回OK即为成功)

  4. 添加Docker软件源

    注意 arch=amd64 这里的CPU架构需要根据安装的机器架构更改

    1
    
     sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
  5. 安装docker

    1
    
     apt -y install docker-ce docker-ce-cli containerd.io
    
  6. 将当前用户添加到docker组

    避免每次使用Docker时都需要使用sudo(默认情况下,只有root用户和docker组的用户才能运行Docker命令)

    1
    
     sudo usermod -aG docker $USER
    
  7. 重启docker服务

    1
    
     service docker restart
    
  8. 查看docker状态

    1
    
     systemctl status docker
    

Docker Pull 低质量网络环境下EOF异常解决方案

/etc/docker/deamon.json 中配置以下内容

1
2
3
4
5
6
{
   "max-concurrent-downloads": 1,
   "max-concurrent-uploads": 1,
   "max-download-attempts": 50,
   "features": {"containerd-snapshotter": true}
}

在低质量网络连接下启用,防止镜像Pull失败

  • 限制镜像Pull并发数
  • 限制镜像Push并发数
  • 增加重试次数
  • 启用containerd作为运行时, 以启用镜像pull的断点重传

在无法访问官方储存库的情况下安装NVIDIA Container Toolkit的方案

能直接访问 nvidia.github.io 的情况下优先使用的官方安装方案 Installing the NVIDIA Container Toolkit

如果无法访问 nvidia.github.io 按照以下步骤操作

  1. 单独下载 nvidia.github.io/libnvidia-container/gpgkey 公钥文件,并复制到目标服务器上

  2. 导入公钥

    1
    
     sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg ./gpgkey
    

    其中 ./gpgkey 是复制到服务器上对的公钥文件的路径

    sudo gpg --dearmor: 將 gpgkey 文件(通常是 ASCII armored 格式)转换为 APT 所需的二進制格式。

  3. 配置 mirrors.ustc.edu.cn 的鏡像源

    创建或编辑APT软件源列表文件:

    打开终端并使用sudo权限进行创建或编辑。 /etc/apt/sources.list.d/nvidia-container-toolkit.list 文件

    1
    
     sudo nano /etc/apt/sources.list.d/nvidia-container-toolkit.list
    

    將以下內容粘贴到 nvidia-container-toolkit.list

    1
    
     deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://mirrors.ustc.edu.cn/libnvidia-container/stable/deb/amd64/ ./
    

    注意 signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg 公钥文件的路径需要和上一步导入公钥的时候设置的 gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg 路径的对应

    /amd64/ 这里需要根据安装服务器的CPU架构指定, 查询支持的架构可以访问 libnvidia-container/stable/deb/ 查看

  4. 更新包索引并安装 NVIDIA Container Toolkit

    1
    
     sudo apt update && sudo apt install nvidia-container-toolkit
    
  5. 配置 Docker 运行时

    1
    
     sudo nvidia-ctk runtime configure --runtime=docker
    

    重启 docker

    1
    
     sudo systemctl restart docker
    

配置第三方Docker Hub镜像加速

/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

1
2
3
4
5
{
  "registry-mirrors": [
    "https://mirrors-example.com"
  ]
}

如果使用的镜像加速站点没有使用Https或者是内网的自建Register服务, 没有Https可以配置 --insecure-registry 来使用, 默认情况下Docker 会拒绝从没有启用Https的镜像站拉取镜像

要配置--insecure-registry, 也需要打开/etc/docker/daemon.json 中写入如下内容

1
2
3
{
  "insecure-registries": ["http://mirrors-example.com"]
}

之后重新启动Docker服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

重启后可以使用 info 命令查询配置的信息是否生效

1
docekr info

如果Docker配置正确,则命令的输出中应该包含之前添加的镜像站或者不安全镜像仓库的URL

如果是配置了上面所有配置项的 /etc/docker/daemon.json 最终看起来应该像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "max-concurrent-downloads": 1,
  "max-concurrent-uploads": 1,
  "max-download-attempts": 50,
  "features": {"containerd-snapshotter": true},
  "registry-mirrors": [
    "https://mirrors-example.com"
  ],
  "insecure-registries": [
    "http://mirrors-example.com"
  ],
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}

参考

本文由作者按照 CC BY 4.0 进行授权