ubuntu16.04 docker 和 nvidia-docker 的安装及 GPU 的调用
文章目录
- ubuntu16.04 docker 和 nvidia-docker 的安装及 GPU 的调用
- 一、docker 简介
- 二、安装 docker
- 1、卸载旧版本
- 2、在线安装:[官方文档参考](https://docs.docker.com/engine/install/debian/)
- 3、离线安装
- 4、验证及后处理
- 三、安装 NVIDIA Container Toolkit:[官方文档参考](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#install-guide)
- 1、在线安装
- 2、离线安装
- 3、镜像源更改及 GPU 设置
- 四、查看 docker 的状态并设置开机自启动
- 五、镜像、容器以及 Docker Hub 镜像源
- 1、镜像相关命令
- 2、容器相关命令
- 六、参考资料
一、docker 简介
- Docker 使用容器创建虚拟环境,它能与系统的其余部分隔离开来且能够与其主机共享资源(访问目录、使用 GPU、连接到互联网等)
- Docker 的三大核心概念:镜像(Image)、容器(Container)、仓库(Docker Hub)
- 镜像(Image):类似系统盘,它是构建容器的模板,通过一个镜像我们可以构造出很多相互独立但运行环境一样的容器
- 容器(Container):基于某个镜像生成且动态运行的实例(可类比运行起来的操作系统)
- 仓库(Docker Hub):类似代码仓库,是 Docker 官方提供的用于集中存储、管理镜像的服务
二、安装 docker
1、卸载旧版本
- 卸载旧版本的 docker:
- sudo apt-get remove docker docker-engine docker.io containerd runc
- sudo apt-get purge docker*
- 删除所有镜像、容器和数据卷:
- sudo rm -rf /var/lib/docker
2、在线安装:官方文档参考
# ubuntu 系统软件包一般缓存在 /var/cache/apt/archives
# 1、更新软件包列表并安装一些软件包(使得可通过 https 访问 repo)
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 2、添加 docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 3、使用如下命令来建立稳定的储存库
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 4、更新软件包列表,安装最新版本的 Docker Engine and containerd
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
3、离线安装
- 查看系统内核版本和发行代号:
1、uname -a
Linux su 4.15.0-45-generic #48~16.04.1-Ubuntu SMP Tue Jan 29 18:03:48 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
2、lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.6 LTS
Release: 16.04
Codename: xenial
- 打开 https://download.docker.com/linux/ubuntu/dists/ ,进入上述代号xenial目录,然后再进入 pool/stable/,选择机器所属架构(amd64、arm64、armhf、ppc64el、ppc64le、s390x 等),进入下载列表下载日期最新的三个文件
- 安装 docker:百度网盘链接:https://pan.baidu.com/s/18WVBYQ_pi2ltO-9BrqQlvA 提取码:x7tq
sudo dpkg -i containerd.io_1.2.13-1_amd64.deb
sudo dpkg -i docker-ce-cli_19.03.8~3-0~ubuntu-xenial_amd64.deb
sudo dpkg -i docker-ce_19.03.8~3-0~ubuntu-xenial_amd64.deb
4、验证及后处理
- 验证安装是否成功以及查看 docker 的版本和信息
- sudo docker run hello-world
- sudo docker version
- sudo docker info
- 创建 docker 组并添加用户:在不带 sudo 的情况下运行 docker 命令
- sudo groupadd docker:create the docker group
- sudo adduser $USER docker or sudo usermod -aG docker $USER:add your user to the docker group,$USER 是获取当前用户名
- reboot now:make sure that your group membership is re-evaluated
- docker run hello-world:verify that you can run docker commands without sudo
三、安装 NVIDIA Container Toolkit:官方文档参考
1、在线安装
# ubuntu 系统软件包一般缓存在 /var/cache/apt/archives
# 设置系统版本变量
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
# 增加 GPG 密钥
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
# 设置 stable 存储库
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
# 对于 ubuntu20.04 可省略
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
# 更新软件源
sudo apt-get update
# 报错(连接失败 [IP: 185.199.111.153 443])解决办法
# 1、尝试添加 -E 参数重新执行,sudo -E apt-get update
# 2、把 ip 地址写入 host 文件中,sudo vi /etc/hosts,复制如下 ip 到 host 中
185.199.108.153 nvidia.github.io
185.199.109.153 nvidia.github.io
185.199.110.153 nvidia.github.io
185.199.111.153 nvidia.github.io
# 安装 nvidia-docker2
sudo apt-get install -y nvidia-docker2
# sudo apt-get install -y nvidia-container-toolkit
# sudo apt-get install -y nvidia-container-runtime # 一般安装在 /usr/bin/ 下
# 重启 docker
sudo systemctl restart docker
2、离线安装
- 百度网盘下载:链接 https://pan.baidu.com/s/1mxxJGqRZQ0QV8QwWoOLVuw 提取码:58ty
# 按照顺序依次安装即可,一般安装在 /usr/bin/ 下
sudo dpkg -i libnvidia-container1_1.0.7-1_amd64.deb
sudo dpkg -i libnvidia-container-tools_1.0.7-1_amd64.deb
sudo dpkg -i nvidia-container-toolkit_1.0.5-1_amd64.deb
sudo dpkg -i nvidia-container-runtime_3.1.4-1_amd64.deb
3、镜像源更改及 GPU 设置
# 可以一次添加多个镜像源、私有仓库及 nvidia-container-runtime
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://aji9675d.mirror.aliyuncs.com", # 阿里的源(需要先在 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 注册)
"https://hub-mirror.c.163.com", # 网易的源
"https://docker.mirrors.ustc.edu.cn", # 中科大的源
"https://registry.docker-cn.com", # 中国区官方源
],
"insecure-registries": [ # 设置私有源
"10.68.4.10:5000"
],
"runtimes": { # GPU 设置方式 1
"nvidia": {
"path": "nvidia-container-runtime", # 一般位于 /usr/bin/ 下面
"runtimeArgs": []
}
}
}
# GPU 设置(注意别忘了加反斜杠)方式 2
sudo vim /lib/systemd/system/docker.service
# 第一个是更改镜像和容器的默认存储位置(默认是存放在根目录下的,容易占满了)
ExecStart=/usr/bin/dockerd --graph=/home/manzp/study/5.docker -H fd:// --containerd=/run/containerd/containerd.sock \
# 加上下面两句
--add-runtime nvidia=/usr/bin/nvidia-container-runtime \
--default-runtime=nvidia
# reload and restart
sudo systemctl daemon-reload
sudo systemctl restart docker
# 查看 Registry Mirrors 以及 Default Runtime 是否已经生效
docker info
>>> 可输出系统的各种参数信息(以下是部分重要参数)
Server Version: 19.03.8
Runtimes: nvidia runc
Default Runtime: nvidia
Kernel Version: 4.15.0-45-generic
Operating System: Ubuntu 16.04.6 LTS
CPUs: 12
Total Memory: 31.34GiB
Docker Root Dir: /var/lib/docker
Registry: https://index.docker.io/v1/
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://docker.mirrors.ustc.edu.cn/
https://registry.docker-cn.com/
https://hub-mirror.c.163.com/
# 拉取 nvidia/cuda:10.0-base 的镜像或者 tf/pytorch 做好的官方镜像都可以支持 GPU 调用
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi # Test nvidia-smi with the latest official CUDA image
四、查看 docker 的状态并设置开机自启动
# 启动 docker 引擎并设置开机启动
sudo systemctl start docker
sudo systemctl enable docker # It starts automatically on DEB-based distributions. On RPM-based distributions, you need to start it manually using the appropriate systemctl or service command.
# 查看 docker的状态看是否安装成功
sudo systemctl status docker
# 启动、停止、重启 docker
sudo systemctl start docker
sudo systemctl stop docker
sudo systemctl restart docker
五、镜像、容器以及 Docker Hub 镜像源
1、镜像相关命令
# 从 docker hub 中搜寻镜像
docker search ubuntu16.04
# 从 docker hub 拉取镜像,如果不显示的指定 TAG,默认选择 latest 标签
docker pull NAME[:TAG]
docker pull ubuntu or docker pull ubuntu:16.04
docker pull 10.68.4.10:5000/REPO:TAG # 从私有仓库拉取
# 载入镜像
docker load -i BJAI.img or docker load < BJAI.img
# 查看所有镜像信息
docker images
# 删除镜像(停止容器、删除容器、删除镜像)
docker rmi image_id
# 从运行的容器创建新镜像
docker commit CHANGED_CONTAINER_ID NEW_REPO:NEW_TAG
# 保存镜像
docker save -o new_name.img NEW_REPO:NEW_TAG
# 上传镜像
docker push NAME:TAG # 默认上传到 docker hub 官方仓库,首次需要配置和登录
docker push REGISTY_HOST:REGISTY_HOST/NAME:TAG # 上传到私有仓库,已经存在该镜像,则会增量更新
eg:docker push 111.111.111.111:5000/tf114:v1
# 使用 tag 命令添加镜像标签(类似软链接)
docker tag OLD_REPO:OLD_TAG NEW_REPO:NEW_TAG
# remove all images without at least one container associated to them
docker image prune --all
2、容器相关命令
# 创建容器、挂载目录并运行(在 pycharm run config 文件中配置 --gpus=all 才能调动 GPU)
docker run --gpus=all --name=tf2 --ipc=host --net=host --restart=always --privileged -v /home/manzp:/home/manzp -it tf2:v1 env LC_ALL=C.UTF-8 /bin/bash
--gpus:GPU 设置,一般设置为 all 或 'all,"capabilities=compute,utility"' ,有多块显卡也可以指定设备 '"device=2,3"'
- compute:required for CUDA and OpenCL applications.
- compat32:required for running 32-bit applications.
- graphics:required for running OpenGL and Vulkan applications.
- utility:required for using nvidia-smi and NVML.
- video:required for using the Video Codec SDK.
- display:required for leveraging X11 display.
- Note:宿主机的 nvidia driver 在容器内是仅作为 utility 存在的,如果加上 compute,宿主机的英伟达 driver 将对容器提供计算支持(所谓的计算支持也就是 cuda 支持)
--name: 容器临时名称,不能重复
--net: 网络模式,host 或者 none
--restart: 在容器退出时总是重启容器
--privileged: 具有较高权限(真正的 root,否则只是普通用户权限),可以使用宿主机所有的设备
--env:设置环境变量,eg: LANG=C.UTF-8, LC_ALL=C.UTF-8
-v: /home/manzp:/root/manzp 将宿主机目录(/home/manzp)映射到容器目录(/root/manzp),容器可以共享宿主机目录下的内容
-it: 以交互模式运行容器
-d: 后台运行
$IMG=tf2:v1 镜像名称,格式为:(仓库:标签)或镜像 ID
$CMD=bash 入口命令
--cpu-shares=0: 允许容器使用 CPU 资源的相对权重,默认值为 1024,设置为 0 表示使用 1024
--cpus=2:允许容器使用几个线程的 CPU(N*100%,不一定分布在同一块 CPU 上,可能用 4×50%),默认为全部的资源
--cpuset-cpus="0-3": 允许容器使用哪几个 CPU
--memory: 内存使用限制, 数字需要使用整数,对应的单位是 b, k, m, g中的一个
--memory-swap: Swap=memory+memory-swap: '-1' to enable unlimited swap
--ipc:host,use the host's IPC namespace inside the container,多个容器直接采取共享内存可以提高进程数据交互速度
# 注意:-v 可以使用多次,映射多个目录,如果容器中没有相应的目录,则会新建。
# 查看当前容器CPU、内存资源等的使用情况
docker stats
# 退出容器
CTRL+D 或 exit
# 查看所有容器、查看运行中的容器
docker ps -a
docker ps
# 进入运行中的容器
docker exec -it container_id bash
# 启动容器、停止容器、删除容器
docker start container_id
docker stop container_id
docker rm container_id
# 复制文件到容器中
docker cp -rf 主机文件路径 容器id:容器中路径
# 复制容器中文件到主机
docker cp -rf 容器id:容器中路径 主机文件路径