[Docker] Ubuntu / Debian 安装 Docker + Docker-Compose + NVIDIA-Container + 配置代理
网上现有教程有的已经落后现有版本,有的仅包含安装 docker 而不包含安装 docker-compose 。
此博客一站式提供安装 Docker + Docker-Compose + NVIDIA-Container 的方法,同时提供设置代理的多种方法。
本方法仅适用于 Ubuntu/Debian ,其他 OS 不一定支持。
1. 安装 Docker + Docker-Compose
1.1. 更新 apt 仓库索引
sudo apt-get update
1.2. 在 apt 中添加 Docker 仓库
下面有两个不同 OS 的步骤,注意不要执行错了(执行错了会报错,重新执行正确的就行)。
-
Ubuntu 的版本:
sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update -
Debian 的版本:
# Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
1.3. 安装 Docker 以及 Docker Compose
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
有的教程选择去
https://github.com/docker/compose/releases/download/${version}/docker-compose-linux-${arch}下载该方法有两个缺点:
- 无法使用 apt 自动检测更新,想更新必须手动重新下载和安装
- 必须使用
docker-compose命令(要加横杠)而不是 docker 原生支持的docker compose命令(不加横杠)因此我选择apt安装
docker-compose-plugin而不是去 github 下载安装
1.4. 验证 apt 安装结果
查看安装版本:
docker -v
docker compose version
2. 设置代理
墙内对 docker hub 的访问已经被 ban 了,虽然好像有几个镜像站但不稳定,不如自己设置代理。如果在墙外可以跳过这一步。
这一步首先需要你有一个可以访问 docker hub 的代理服务,这里拿运行在宿主机
127.0.0.1:7890上的代理服务举例,有需要就自行替换。
2.1. 设置 镜像拉取 代理
docker pull 拉取镜像时,不会走环境变量设置的代理,而是被 systemd 接管,所以要需要通过 systemd 设置代理。
创建文件夹:
sudo mkdir /etc/systemd/system/docker.service.d
新建配置文件:
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
写入内容:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=127.0.0.1,localhost"
重启服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2. 设置 构建镜像/启动容器 的代理
docker build / docker run 和 docker pull 使用代理的方式不一样,这个代理由 docker 自身接管。
首先需要知道容器是有自己的 IP 的(除非特别设置),如果需要访问宿主机的某个端口(例如 7890 ),一般需要访问 172.17.0.1:7890 ,其中 172.17.0.1 是宿主机相对于容器的默认 IP 地址(少数情况下会是其他 IP ,失败的话就 ifconfig 查看本机 IP ,挨个儿试带“docker”的网络 IP 去吧)。
设置代理有两种方式:一种需要在构建镜像/启动容器时手动设置,灵活性高;另一种需要设置全局配置文件,灵活性差但是一劳永逸。个人推荐前者。
-
手动设置方法
可以在不同的容器设置不同的代理,灵活性高。如果选择这种方法,可以跳过这一节,配置完 docker 后启动项目再回来看。
有了 docker compose 之后,构建镜像/启动容器可以使用 docker compose 方式,也可以使用原始 docker 的方式。
-
docker compose 启动方法
在
docker-compose.yaml配置:services: your_service_name: # 可以使用`docker logs your_service_name`来查看日志等 container_name: your_container_name # 启动后容器的名字,使用`docker ps -a`查看 image: your_image_name # 编译出的镜像的名字,使用`docker images`查看 build: context: . dockerfile: dockerfile args: # 镜像编译时的环境变量 http_proxy: 'http://172.17.0.1:7890' https_proxy: 'http://172.17.0.1:7890' no_proxy: "localhost,127.0.0.1/8,172.17.0.1/8" volumes: - ./workspace/:/workspace/:rw - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro environment: # 容器运行时的环境变量 http_proxy: 'http://172.17.0.1:7890' https_proxy: 'http://172.17.0.1:7890' no_proxy: 'localhost,127.0.0.1/8,172.17.0.1/8' restart: always tty: true stdin_open: true shm_size: 16g deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [ gpu ]然后使用
docker compose build构建镜像,最后docker compose up启动容器。(当然这里如果你还没安装 NVIDIA-Container 的话,gpu的部分不支持会报错,删掉 “deploy” 这一行及之后的内容即可。) -
原始 docker 命令行启动方法
分成两步,构建镜像和启动容器。
-
构建镜像
sudo docker build \ --build-arg http_proxy=http://172.17.0.1:7890 \ --build-arg https_proxy=http://172.17.0.1:7890 \ --build-arg no_proxy=localhost,127.0.0.1/8,172.17.0.1/8 \ -f dockerfile \ -t your_image_name \ . -
启动容器
sudo docker run -d \ --name your_container_name \ --restart always \ --tty \ --interactive \ --shm-size=16g \ --gpus all \ -e http_proxy=http://172.17.0.1:7890 \ -e https_proxy=http://172.17.0.1:7890 \ -e no_proxy=localhost,127.0.0.1/8,172.17.0.1/8 \ -v $(pwd)/workspace:/workspace:rw \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ your_image_name(和上面同理,如果你还没安装 NVIDIA-Container 的话,gpu的部分不支持会报错,删掉 “--gpus all” 这一行即可。)
-
-
-
设置全局配置文件方法
创建文件夹:
mkdir ~/.docker修改配置文件:
vim ~/.docker/config.json写入内容:
{ "proxies": { "default": { "httpProxy": "http://172.17.0.1:7890", "httpsProxy": "http://172.17.0.1:7890", "noProxy": "localhost,127.0.0.0/8,172.17.0.1/8" } } }这样就可以使代理设置在本用户范围内全局生效,当然如果你在构建镜像/启动容器时手动设置(方法1)可以临时覆盖掉这个默认代理设置。
3. 设置 docker 用户组
docker 默认要管理员权限才能使用,容器内对宿主机的文件操作都是以 root 身份操作的。
设置 docker 用户组可以让授权用户使用 docker ,普通不需要管理员身份也能运行 docker 。
创建 docker 用户组:
sudo groupadd docker
将用户加入 docker 用户组
sudo usermod -aG docker ${USER}
重启 docker 服务
sudo systemctl restart docker
生效用户组配置
sudo newgrp docker
重新登录用户。
使用 VSCode 时,不知道为何重新登录后,不使用 sudo 还是会报错,解决方案是给 /var/run/docker.sock 权限:
sudo chmod 666 /var/run/docker.sock
4. 测试
安装并运行 hello-word 镜像:
docker run --rm hello-world
5. 安装 NVIDIA-Container
这玩意儿是英伟达开发的支持容器内使用N卡的技术。
安装之前需要先安装N卡驱动,容器内cuda-runtime的版本需要小于等于宿主机的cuda-runtime版本。
安装环境依赖:
sudo apt-get update
sudo apt-get install -y --no-install-recommends curl gnupg2
配置 apt 仓库:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
如果你想尝试实验性功能,执行:
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
更新 apt 仓库索引:
sudo apt-get update
使用 apt 安装 NVIDIA Container Toolkit :
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.1-1
sudo apt-get install -y \
nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}
重启 docker 服务:
sudo systemctl restart docker
好了恭喜你,Docker + Docker-Compose + NVIDIA-Container 都安装好了。
如果你还没配置代理,回到第2章看看吧。

此博客一站式提供安装 Docker + Docker-Compose + NVIDIA-Container 的方法,同时提供设置代理的多种方法。
浙公网安备 33010602011771号