Hexo

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Docker——Docker访问GPU笔记


NVIDIA Docker 工具链

  • 若直接安装 docker 并启动 GPU 程序,会出现报错

  • 比如,下面使用 Megatron 官方教程的命令(会使用到 GPU):

    1
    sudo docker run --ipc=host --shm-size=512m --gpus 2 -it nvcr.io/nvidia/pytorch:24.02-py3
  • 执行上面的命令时出现下面的错误

    1
    docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
  • 出现上面问题的原因是,Docker 无法找到合适的 GPU 驱动程序

    • Docker 访问 GPU 需要专门为 Docker 做的工具链 NVIDIA Docker
    • 上述问题一般是:NVIDIA Docker 工具链未正确安装或配置导致的
  • NVIDIA Docker 工具链安装方式:

    • 第一步:确保 NVIDIA 驱动已经安装

      1
      nvidia-smi
      • 若未安装,则需要先安装驱动,Ubuntu系统可参考:Ubuntu——显卡驱动安装
    • 第二步:安装 NVIDIA Docker 工具链

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 添加NVIDIA的包仓库
      distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
      curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
      curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

      # 安装nvidia-container-toolkit
      sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

      # 重启Docker服务
      sudo systemctl restart docker

Docker——访问官方镜像库-代理配置


终端科学上网说明

  • 配置好科学上网后,网页能科学上网

  • 为了在终端科学上网,需要配置代理(修改环境变量为 VPN 的指定端口)

    1
    2
    export HTTP_PROXY="http://127.0.0.1:7897/"
    export HTTPS_PROXY="http://127.0.0.1:7897/"
  • 确认一下 Ubuntu 终端已经科学上网,即已经配置下面的情况

    1
    2
    3
    4
    # echo $HTTP_PROXY
    http://127.0.0.1:7897/
    # echo $HTTPS_PROXY
    http://127.0.0.1:7897/
    • 从输出可以看到,终端已经配置了代理(HTTP_PROXY 和 HTTPS_PROXY 均指向 http://127.0.0.1:7897/)
  • 此时在终端执行 curl 能成功

    1
    curl https://www.google.com
    • 注意此时用 ping 命令不一定能成功,因为 ping 使用的是 ICMP 协议
  • 综上已经确定了终端可以科学上网

  • 特别注意:一般来说终端的代理配置仅对当前终端会话生效 ,除非把环境变量配置添加到 ~/.bashrc 文件


docker 的问题

  • 通过网页访问 docker 核心库没问题(有返回没验证的说明就是 OK 的)
  • Docker 服务默认不会继承终端的代理环境变量 ,这常常是 Docker 拉取镜像仍失败的关键原因
  • 需要将代理配置同步给 Docker 服务,确保 Docker 能通过代理访问镜像仓库

为 Docker 配置代理(确保与终端代理一致)

第一步:创建 Docker 代理配置文件

  • Docker 服务的代理配置需通过专门的系统目录(/etc/systemd/system/docker.service.d/)生效,执行以下命令创建配置文件:
    1
    2
    3
    4
    5
    # 创建配置目录(若不存在)
    sudo mkdir -p /etc/systemd/system/docker.service.d

    # 创建代理配置文件
    sudo nano /etc/systemd/system/docker.service.d/proxy.conf

第二步:写入代理配置(与终端代理保持一致)

  • 在 proxy.conf 文件中添加以下内容(注意代理地址 127.0.0.1:7897 需与你终端的 HTTP_PROXY 完全一致,包括结尾是否带 /):

    1
    2
    3
    4
    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:7897/"
    Environment="HTTPS_PROXY=http://127.0.0.1:7897/"
    Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.local.golang.org,.docker.internal"
    • NO_PROXY:指定无需代理的地址(避免本地服务/容器间通信走代理,防止冲突),无需修改

第三步:重启 Docker 服务,使代理生效

1
2
3
4
5
6
7
8
# 重新加载 systemd 配置(识别新的 proxy.conf)
sudo systemctl daemon-reload

# 重启 Docker 服务
sudo systemctl restart docker

# 验证 Docker 是否加载了代理配置
sudo systemctl show --property=Environment docker
* 若输出中包含 `HTTP_PROXY=http://127.0.0.1:7897/` 和 `HTTPS_PROXY=http://127.0.0.1:7897/`,说明 Docker 代理配置成功

再次尝试拉取 Docker 镜像

  • 现在 Docker 已通过代理访问外部仓库,执行拉取命令:
    1
    2
    3
    4
    5
    # 先测试小镜像 hello-world,验证代理是否生效
    sudo docker pull hello-world

    # 若 hello-world 成功,再拉取目标镜像
    sudo docker pull xxx
1…257258259…352
San Ye

San Ye

Stay Hungry. Stay Foolish.

704 posts
53 tags
© 2026 San Ye
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4