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:容器中路径 主机文件路径