[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} 下载

该方法有两个缺点:

  1. 无法使用 apt 自动检测更新,想更新必须手动重新下载和安装
  2. 必须使用 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 上的代理服务举例,有需要就自行替换。

参考了 https://neucrack.com/p/286

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 命令行启动方法

      分成两步,构建镜像和启动容器。

      1. 构建镜像

        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 \
        	.
        
      2. 启动容器

        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版本。

照抄 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#with-apt-ubuntu-debian

安装环境依赖:

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章看看吧。

posted @ 2026-01-17 23:28  KeJF  阅读(3)  评论(0)    收藏  举报