docker 安装与使用

初学记录,如有问题,请留言

docker 安装与使用

个人理解:

我们把所有的环境、依赖、所需要的数据文件等都集成到一个镜像文件中;再通过镜像去生成容器,就可以使用了,跨设备移植非常方便
镜像是基础,容器是体现;也就是说一个镜像可以产生多个容器;类似一个Win10镜像可以安装在多台电脑上,因此当使用镜像生成一个容器后,我们就只要在容器里面进行操作即可;

  • 前提要求:安装好对应的Nvidia 驱动版本,无需安装cuda和cudnn(安装了也没关系);选择下载GPU docker镜像时注意对应自己的NVIDIA驱动,如下表,一般来说,按照当前主机的CUDA进行选择;若下表的匹配不成功,将会导致 Pytorch 无法调用GPU


    image.png
  • 目的:拉取别人做好的基础版本镜像,再把自己要加的内容给加进去;(当然,也可以自己做自己的镜像,但是比较麻烦,这里不讨论)

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 目标检测框架为例子

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

image.png

切换标签页到命名空间,创建地址唯一的命名空间

image.png

根据任务/比赛要求选择对应的地域


image.png

选择代码源为本地仓库,灵活度大,完成创建。(后期熟悉选择Github版本迭代更方便)


image.png

点击管理,可查看详情。

image.png

详情页如下,有基本的操作命令,仓库地址一般使用公网地址即可;操作指南下面有对应的如何在命令行登陆,push本地镜像到云仓库
image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 一、安装docker 1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来...
    大胡子歌歌阅读 1,665评论 0 1
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,377评论 0 27
  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,693评论 0 9
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,720评论 1 21
  • 一、安装与配置 1.安装依赖包 2.设置阿里云镜像源 3.安装 Docker-CE 重建 Yum 缓存。 安装 D...
    uu祈阅读 230评论 0 1