一. 安装docker
1. 卸载旧版本
当前的docker称为Docker Engine-Community软件包docker-ce,Docker的旧版本称为docker,docker.io或docker-engine,如果已安装旧版本,请执行卸载:
# apt-get remove docker docker-engine docker-ce docker.io
2. 更新apt包索引
# apt-get update
3. 安装apt依赖包
安装apt依赖包,用于通过HTTPS来获取仓库:
# apt-get install -y apt-transport-https ca-certificates curl software-properties-common
4. 添加Docker的官方GPG密钥
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
5. 设置稳定版仓库
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
6. 更新apt包索引
# apt-get update
7. 安装docker
7.1. 安装最新版docker
# apt-get install -y docker-ce
7.2. 安装特定版本docker
a. 列出可用版本
要安装特定版本的Docker Engine-Community,请在仓库中列出可用版本,然后选择一种安装:
# apt-cache madison docker-ce
b. 安装特定版本
使用上一个步骤输出内容第二列中的版本字符串安装特定版本,如5:18.09.1~3-0~ubuntu-xenial:
# apt-get install docker-ce=<VERSION_STRING>
8. 测试Docker是否安装成功
输入以下指令,打印出以下信息则安装成功:
# docker run hello-world
9. 修改docker的镜像、容器、配置文件存储目录
docker数据默认存储在/var/lib/docker目录,考虑到docker的镜像、容器、配置等文件可能占用较大的磁盘空间,可修改其数据存储目录,由系统盘调整至数据盘。
a. 停止docker
# systemctl stop docker.socket
# systemctl stop docker
b. 在数据盘创建新的docker数据存储目录
# cd /mnt/data/
# mkdir docker
c. 修改docker配置
调整docker配置文件daemon.json,设置data-root属性,指定docker运行时使用的根路径:
# vi /etc/docker/daemon.json
{
"data-root": "/mnt/data/docker",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
d. 删除docker数据的默认存储目录
# cd /var/lib/
# rm -rf docker/
e. 重新加载服务配置文件并重启docker
# systemctl daemon-reload
# systemctl restart docker
二. 安装nvidia-container-toolkit
Docker中的容器无法直接使用GPU算力,除非在容器中再安装一遍GPU驱动,这将非常麻烦。为解决这一问题,nvidia官方提供了nvidia docker环境,用于将宿主机的GPU运行时映射到容器中。
nvidia docker环境已经经历了nvidia-docker、nvidia-docker2,再到NVIDIA Container Toolkit的迭代。
1. 卸载nvidia-docker
nvidia-docker已经被官方废弃了,如今使用nvidia-container-toolkit替代。如果已安装nvidia-docker,先卸载并清理配置:
# apt-get purge -y nvidia-docker
2. 添加GPG密钥
# curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
3. 配置nvidia-docker.list
a. 读取系统版本名称
读取系统版本名称,如ubuntu16.04,并赋值给任意变量名,如distribution:
# distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
b. 配置nvidia-docker.list
从网络下载与系统版本对应的nvidia-docker.list文件,并将其内容写入/etc/apt/sources.list.d/nvidia-docker.list:
# curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list
4. 更新apt包索引
# sudo apt-get update
5. 安装nvidia-container-toolkit
# apt-get install -y nvidia-container-toolkit
6. 重启docker
# systemctl restart docker
7. 验证安装
使用docker运行一个基础CUDA container,附上参数:--gpus all,确认容器能否使用GPU。
# docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
Unable to find image 'nvidia/cuda:11.0.3-base-ubuntu20.04' locally
11.0.3-base-ubuntu20.04: Pulling from nvidia/cuda
d5fd17ec1767: Pull complete
ea7643e57386: Pull complete
622a04926279: Pull complete
18fcb7509e42: Pull complete
21e5db7c1fa2: Pull complete
Digest: sha256:1db9418b1c9070cdcbd2d0d9980b52bd5cd20216265405fdb7e089c7ff96a494
Status: Downloaded newer image for nvidia/cuda:11.0.3-base-ubuntu20.04
Fri Jul 8 14:10:46 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.91.03 Driver Version: 460.91.03 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla P100-PCIE... On | 00000000:00:08.0 Off | 0 |
| N/A 38C P0 34W / 250W | 11586MiB / 16280MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
如果有GPU信息输出,说明安装成功,今后docker运行容器时附上参数:--gpus all即可令容器具备使用GPU的能力。