ubuntu16.04 docker 和 nvidia-docker 的安装及 GPU 的调用

ubuntu16.04 docker 和 nvidia-docker 的安装及 GPU 的调用

一、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、离线安装
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、离线安装
# 按照顺序依次安装即可,一般安装在 /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://dockerpull.cn",
        "https://cr.laoyou.ip-ddns.com",
        "https://docker.hlmirror.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),容器可以共享宿主机目录下的内容
	-p 8080:80, 将容器的端口 80 映射到宿主机的端口 8080
	-e "MY_VAR=my_value", 设置容器内的环境变量 
	-it: 以交互模式运行容器
	-d: 后台运行(遇见需要输入密码的镜像,需要指定此参数,然后 docker exec -it container_name bash 启动即可)
	--entrypoint "/bin/bash", 设置容器的入口点,覆盖 Dockerfile 中的 ENTRYPOINT
	$IMG=tf2:v1 镜像名称,格式为:(仓库:标签)或镜像 ID
	$CMD=bash 入口命令
	***直接在 docker run 命令后指定命令***: 只是简单地想要执行某个命令(例如 python /workspace/app.py),你可以直接将命令附加在 docker run 后面
	--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:容器中路径 主机文件路径

# 容器启动时执行你指定的命令(直接将命令附加在 docker run 后面,不需要使用 --entrypoint 参数)
docker run --restart always -d -v /path/to/your/app:/workspace python:3.9 python /workspace/app.py

3、找不到 libGL.so
# 错误
ImportError: libGL.so.1: cannot open shared object file: No such file or directory

# 原因
when a program (usually related to graphical applications, such as those that use OpenGL) cannot find the necessary library file libGL.so.1

# 解决
sudo apt update
sudo apt install libgl1-mesa-glx

六、参考资料

0、Docker-从入门到实践(第三版)
0、Docker 菜鸟教程
1、https://docs.docker.com/install/linux/docker-ce/ubuntu/
2、https://docs.docker.com/install/linux/docker-ce/centos/
3、https://docs.docker.com/install/linux/linux-postinstall/
4、https://github.com/NVIDIA/nvidia-docker
5、https://github.com/NVIDIA/nvidia-container-runtime
6、中科大 Docker 镜像使用帮助
7、Docker 中国官方镜像加速
8、阿里云 Docker 镜像加速
9、史上最全(全平台)docker安装方法!
10、https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/
11、Docker: 限制容器可用的内存
12、Docker: 限制容器可用的 CPU
13、Docker IO资源限制
14、Ubuntu18.04上安装 Docker + Nvidia GPU驱动
15、Ubuntu 18.04安装Docker CE及NVIDIA Container Toolkit流程
16、https://github.com/ufoym/deepo
17、https://homenew.console.aliyun.com/阿里云

### 回答1: 1. 首先,需要安装NVIDIA驱动程序。可以通过以下命令安装: sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt-get update sudo apt-get install nvidia-384 2. 安装Docker。可以通过以下命令安装: sudo apt-get install docker.io 3. 安装nvidia-docker。可以通过以下命令安装: curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install nvidia-docker2 sudo pkill -SIGHUP dockerd 4. 验证nvidia-docker是否安装成功。可以通过以下命令验证: sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi 如果nvidia-smi显示了GPU信息,则说明nvidia-docker已经成功安装。 ### 回答2: 安装nvidia-docker是为了在Ubuntu 16.04上使用NVIDIA GPU进行深度学习机器学习等任务。以下是在Ubuntu 16.04安装nvidia-docker的步骤: 1. 在终端中,使用以下命令添加NVIDIA Docker软件包的存储库: ``` $ 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 $ sudo apt-get update ``` 2. 安装nvidia-docker软件包: ``` $ sudo apt-get install -y nvidia-docker2 $ sudo pkill -SIGHUP dockerd ``` 3. 使用以下命令验证安装是否成功: ``` $ docker run --gpus all nvidia/cuda:11.0-base nvidia-smi ``` 如果成功安装并配置正确,将显示GPU的信息。 通过以上步骤,你可以在Ubuntu 16.04上成功安装nvidia-docker,并使用NVIDIA GPU进行深度学习机器学习等任务。请注意,确保你的系统安装了合适的NVIDIA GPU驱动程序,并且能够与nvidia-docker兼容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值