NVIDIA Container Toolkit
Docker运行NVIDIA容器 已经被 NVIDIA Container Toolkit 取代,用于构建和运行GPU加速的 Container 。 NVIDIA Container Toolkit 包含了一个容器运行库 libnvidia-container
备注
在Host主机上只需要 安装NVIDIA Linux驱动(Ubuntu) ,不需要完整安装 NVIDIA CUDA
NVIDIA Container Toolkit概要
NVIDIA Container Toolkit是一系列拥有构建和运行GPU加速容器的库和工具包括:
The NVIDIA Container Runtime (nvidia-container-runtime)
The NVIDIA Container Toolkit CLI (nvidia-ctk)
The NVIDIA CDI Hooks (nvidia-cdi-hook)
The NVIDIA Container Runtime Hook (nvidia-container-runtime-hook)
NVIDIA的 经典方案 ,基于 OCI(Open Container Initative,开放容器倡议)规范中的
prestart(预启动)阶段工作
The NVIDIA Container CLI (nvidia-container-cli)
The NVIDIA Container Library (libnvidia-container1)
Ubuntu/Debian系统安装
首先安装必要的工具:
sudo apt-get update && sudo apt-get install -y --no-install-recommends \
ca-certificates \
curl \
gnupg2
配置仓库:
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
备注
配置仓库时 curl 很可能被防火墙阻挡无法下载,首先设置 SSH Tunneling: 动态端口转发 :
Host *
ServerAliveInterval 60
ControlMaster auto
ControlPath ~/.ssh/%h-%p-%r
ControlPersist yes
StrictHostKeyChecking no
Compression yes
Host MyProxy
HostName <SERVER_IP>
User admin
DynamicForward 1080
IdentitiesOnly yes
IdentityFile ~/.ssh/proxy/id_rsa
则只需要执行 ssh MyProxy 就立即建立起动态端口转发
需要配置 curl代理 :
export ALL_PROXY=socks5h://localhost:1080
备注
另外可选配置使用测试性软件包:
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
更新仓库:
sudo apt-get update
备注
在添加NVIDIA仓库之后,也同样需要配置 APT代理 :
/etc/apt/apt.conf.d/proxy.confAcquire::http::Proxy "socks5h://127.0.0.1:1080";
Acquire::https::Proxy "socks5h://127.0.0.1:1080";
Acquire::socks::Proxy "socks5h://127.0.0.1:1080";
安装
NVIDIA Container Toolkit软件包:
NVIDIA Container Toolkitexport NVIDIA_CONTAINER_TOOLKIT_VERSION=1.19.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}
配置
根据NVIDIA官方文档 Installing the NVIDIA Container Toolkit ,NVIDIA Container Toolkit支持4种 容器运行时(Container Runtimes) :
特性 |
Docker (Moby) |
Containerd |
Podman |
CRI-O |
|---|---|---|---|---|
定位 |
全栈容器平台 |
工业级标准运行时 |
红帽系、无守护进程 |
纯粹为 K8s 设计 |
GPU 支持 |
最成熟,插件化自动配置 |
需手动配置 OCI Runtime |
需配合 NVIDIA CDI |
需配合 NVIDIA CDI |
复杂度 |
低(一键式体验) |
中(需理解底层调用) |
中(Rootless 特性) |
高(依赖 K8s 生态) |
架构 |
Daemon 模式 |
Daemon 模式 |
Daemonless (更安全) |
Daemonless |
适用场景 |
本地开发、单机 AI 实验 |
生产环境、K8s 节点 |
高安全性、替代 Docker |
大规模 K8s 集群 |
考虑到我的HomeLab需要灵活构建镜像以及方便维护,我选择"开箱即用"的 Docker ,这样能够灵活使用 Docker Compose 快速构建多容器组合运行。当然,如果在生产环境使用 Kubernetes ,精简工作节点的架构,则推荐采用 containerd运行时(runtime) 。
安装 Docker CE
为了能够灵活和强大配置,我选择安装Docker官方提供的Docker CE:
设置Docker官方apt仓库:
# Add Docker's official GPG key:
sudo apt update
sudo apt 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
# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
安装Docker软件包
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动docker服务:
sudo systemctl start docker
将当前用户加入
docker组,这样后续就无需sudo就可以管理
docker 用户组sudo usermod -aG docker $USER
配置 Docker
使用
nvidia-ctk命令来配置容器运行时:
sudo nvidia-ctk runtime configure --runtime=docker
输出显示
INFO[0000] Config file does not exist; using empty config
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted.
然后重启Docker服务:
sudo systemctl restart docker