初学记录,如有问题,请留言
docker 安装与使用
个人理解:
我们把所有的环境、依赖、所需要的数据文件等都集成到一个镜像文件中;再通过镜像去生成容器,就可以使用了,跨设备移植非常方便
镜像是基础,容器是体现;也就是说一个镜像可以产生多个容器;类似一个Win10镜像可以安装在多台电脑上,因此当使用镜像生成一个容器后,我们就只要在容器里面进行操作即可;
-
前提要求:安装好对应的Nvidia 驱动版本,无需安装cuda和cudnn(安装了也没关系);选择下载GPU docker镜像时注意对应自己的NVIDIA驱动,如下表,一般来说,按照当前主机的CUDA进行选择;若下表的匹配不成功,将会导致 Pytorch 无法调用GPU
目的:拉取别人做好的基础版本镜像,再把自己要加的内容给加进去;(当然,也可以自己做自己的镜像,但是比较麻烦,这里不讨论)
1. 安装docker(CPU使用)
sudo apt-get install docker.io
1.1 添加权限
执行Docker需要用户具有sudo权限,所以可以将需要使用Docker的普通用户加入docker用户组
先查看下是否存在docker用户组
cat /etc/group | grep docker
(注意不是dockerroot),如果不存在则创建groupadd docker
。然后将普通用户添加至docker用户组中usermod -aG docker $USER
1.2 测试
sudo docker run hello-world
输出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
2. 安装NVIDIA-Docker (GPU使用)
2.1 如果之前安装过 nvdia-docker1.0,需要先删掉该版本和之前创建的容器
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
2.2 添加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
不出意外的话就添加好了;本人安装时出现的坑:
-
第一步添加gpg就失败了,参考:https://ubuntuqa.com/article/7602.html
gpg: 找不到有效的 OpenPGP 数据。
原因说是网络问题,访问不到gpg
解决方法:
直接将gpg下载下来(下载到当前目录,名称为 "gpgkey"),再手动添加,也就是将上面1步分为2步wget https://nvidia.github.io/nvidia-docker/gpgkey sudo ape-key add gpgkey
第三步,添加软件源失败,这里直接打开第三步网址,得到软件源,手动添加
在浏览器中打开:https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list
得到:
deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/$(ARCH) /
将其复制到系统软件源文件:/etc/apt/sources.list
sudo vi /etc/apt/sources.list
复制进去后再刷新列表
sudo apt-get update
能够看到nvidia-docker的更新字样表示成功
安装docker2
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
测试:
sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
能够输出显存占用列表则成功
参考:https://blog.csdn.net/weixin_42749767/article/details/82934294
增加sudo权限
Docker 需要用户的具有sudo权限,为了避免每次命令都输入 sudo,可以把用户加入Docker用户组
sudo usermod -aG docker $USER
2. 常用命令
2.1. 列出本机所有的镜像(image)以及删除镜像
# 列出本机的所有 image 文件
docker image ls
# 删除 image 文件
docker image rm [ImageName]
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作
2.2. 从镜像生成容器
docker container run -it [options] [ImageName/ImageId]
options
- --name 为容器指定一个名称
- -d 后台运行容器,并返回容器Id,即 启动守护式容器
- -i 以交互式运行容器,通常与 -t 同时使用
- -t 为容器重新分配一个伪输入终端,通常与 -i 连用
- -P 随机端口映射;
- -p 指定端口映射
2.3. 进入一个正在运行的容器,dockerdocker container exec
docker container exec
命令用于进入一个正在运行的 docker 容器。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了
docker container exec -it [containerID] /bin/bash
2.4. 列出当前正在运行的容器
docker ps [options]
- -a 列出当前所有正在运行的容器+历史上运行过的
- -l 显示最近创建的容器
- -n 显示最近创建的 n 个容器
2.5. 退出一个容器
exit
或者 CTRL+P+Q
2.6. 停止一个容器
docker stop [ContainerId/ContainerName]
docker kill [ContainerId/ContainerName]
2.7. 删除一个容器
docker rm [ContainerId/ContainerName]
2.8 宿主机和容器的文件挂载
目录挂载时需要采取绝对路径,不能采用相对路径
nvidia-docker run -it -v /home/mtc/data/:/tcdata [ImageId] /bin/bash
参考:https://blog.csdn.net/sunhuaqiang1/article/details/88317987
3. 深度学习训练
这里以 mmdetection 目标检测框架为例子
- 先拉取(pull)带有cuda cudnn, python 等一系列环境依赖的镜像(image),可以即拉即用,环境什么的别人都给你配好了,下载下来就可以用
镜像如下网址:https://tianchi.aliyun.com/forum/postDetail?spm=5176.12586973.0.0.28cd6448Q9CpTh&postId=67720
docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
- 下载好后,通过
docker images
可以看到当前所有的镜像 - 从镜像生成容器,且将容器命名为 mmdet, 方便后续打开:
这里要求设置 shm-size 为了数据加载时候的存储占用,默认是64M,即container中挂载的 /dev/shm的容量
nvidia-docker run -it --shm-size=8g --name mmdet registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
mtc:~$ nvidia-docker run -it --name mmdet registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
root@d9541e9160c7:/mmdetection# nvidia-smi
Tue Feb 11 04:54:57 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26 Driver Version: 430.26 CUDA Version: 10.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce RTX 208... Off | 00000000:01:00.0 On | N/A |
| 22% 41C P8 31W / 250W | 160MiB / 11018MiB | 37% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce RTX 208... Off | 00000000:02:00.0 Off | N/A |
| 22% 33C P8 14W / 250W | 1MiB / 11019MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
root@d9541e9160c7:/mmdetection# python
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>>
从镜像生成容器是若容器要求GPU的话需要用 Nvidia-Docker;
3.1 安装软件,比如 zip 之类的
需要先更新软件源,再对应安装,由于在docker中就是root,所以无需sudo
apt-get update
apt-get install zip
3.2 添加自己的文件(如训练测试数据)到镜像中去
最简单的方法
docker cp [主机上的地址文件] [容器上的地址]
docker cp test.zip mmdet:/mmdetection
进入容器中可以看到:
$ docker container exec -it mmdet /bin/bash
root@4e36037199c1:/mmdetection# ll
total 414540
drwxr-xr-x 1 root root 4096 Feb 11 12:44 ./
drwxr-xr-x 1 root root 4096 Feb 11 12:50 ../
drwxr-xr-x 3 root root 4096 Dec 12 07:06 .eggs/
drwxr-xr-x 8 root root 4096 Dec 12 07:00 .git/
drwxr-xr-x 3 root root 4096 Dec 12 07:00 .github/
-rw-r--r-- 1 root root 1364 Dec 12 07:00 .gitignore
-rw-r--r-- 1 root root 315 Dec 12 07:00 .isort.cfg
-rw-r--r-- 1 root root 538 Dec 12 07:00 .pre-commit-config.yaml
-rw-r--r-- 1 root root 126 Dec 12 07:00 .style.yapf
-rw-r--r-- 1 root root 1321 Dec 12 07:00 .travis.yml
-rw-r--r-- 1 root root 11400 Dec 12 07:00 LICENSE
-rw-r--r-- 1 root root 7152 Dec 12 07:00 README.md
drwxr-xr-x 4 root root 4096 Dec 12 07:06 build/
-rw-rw-r-- 1 1000 1000 107924711 Dec 23 07:47 test.zip
drwxrwxr-x 1 1000 1000 4096 Feb 9 13:15 configs/
drwxr-xr-x 2 root root 4096 Dec 12 07:00 demo/
drwxr-xr-x 2 root root 4096 Dec 12 07:00 docker/
drwxr-xr-x 2 root root 4096 Dec 12 07:00 docs/
drwxr-xr-x 1 root root 4096 Dec 12 07:00 mmdet/
drwxr-xr-x 2 root root 4096 Dec 12 07:06 mmdet.egg-info/
-rw-r--r-- 1 root root 293 Dec 12 07:00 pytest.ini
-rw-r--r-- 1 root root 122 Dec 12 07:00 requirements.txt
-rw-r--r-- 1 root root 6484 Dec 12 07:00 setup.py
drwxr-xr-x 2 root root 4096 Dec 12 07:00 tests/
drwxr-xr-x 3 root root 4096 Dec 12 07:00 tools/
3.3 从已经构建好的容器映射成镜像
docker commit [ContainerId/ContainerName] [NewImageName]
$ docker commit mmdet mmdet_zql
sha256:309a7a3976077727d7dc974516fdbffb69e21eb338c601fb4737eabe03a4bfa0
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mmdet_zql latest 309a7a397607 14 seconds ago 10.6GB
helloworld latest 56b1259900c4 46 hours ago 929MB
<none> <none> ca9a69dcc726 46 hours ago 929MB
koa-demo latest 064588efbfa2 47 hours ago 675MB
ubuntu latest ccc6e87d482b 3 weeks ago 64.2MB
registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection pytorch1.3-cuda10.1-py3 80d6aa11963c 2 months ago 8.26GB
registry.cn-shanghai.aliyuncs.com/tcc-public/python 3 a4cc999cf2aa 9 months ago 929MB
hello-world latest fce289e99eb9 13 months ago 1.84kB
node 8.4 386940f92d24 2 years ago 673MB
4. 阿里云 天池Docker使用
进去网址 https://www.aliyun.com/product/acr?spm=5176.12586973.0.0.228d2232ZXzGRe 注册并开通镜像托管;开通后进入镜像仓库:https://cr.console.aliyun.com
切换标签页到命名空间,创建地址唯一的命名空间
根据任务/比赛要求选择对应的地域
选择代码源为本地仓库,灵活度大,完成创建。(后期熟悉选择Github版本迭代更方便)
点击管理,可查看详情。
详情页如下,有基本的操作命令,仓库地址一般使用公网地址即可;操作指南下面有对应的如何在命令行登陆,push本地镜像到云仓库