本文介绍 2019_11_14_03_docker葵花宝典

2019_11_14_03_docker葵花宝典

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

实际上,这一篇内容就够了,使用docker,真正的使用docker。我们通常带着这些疑问使用:

  • 如何快速的进入docker?
  • docker image和container有啥关系?
  • 如何使用volume使得docker内的数据persistence并且不同的container共享?

基本上能够理解上面问题,docker就很容易了。首先我们一个一个来。比如我们现在 docker image ls 看到很多image,那么我如何使用这些image来开启一个container呢?

note: 下文中使用的所有远程docker url都是私有化的,个人使用无效,大家可以更换为一些公开的url测试。

葵花宝典第一式:docker上手

先看看如何开启一个container:

docker run --gpus all --rm --ipc=host -it registry.cn-shenzhen.aliyuncs.com/xx/nvidia-pytorch:19.09-py3

假如你的镜像已经在本地了,那么可以直接进入一个container里面去了:

=============
== PyTorch ==
=============

NVIDIA Release 19.09 (build 7911588)
PyTorch Version 1.2.0a0+afb7a16

Container image Copyright (c) 2019, NVIDIA CORPORATION.  All rights reserved.

Copyright (c) 2014-2019 Facebook Inc.
Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
Copyright (c) 2012-2014 Deepmind Technologies    (Koray Kavukcuoglu)
Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
Copyright (c) 2011-2013 NYU                      (Clement Farabet)
Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)
Copyright (c) 2006      Idiap Research Institute (Samy Bengio)
Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)
Copyright (c) 2015      Google Inc.
Copyright (c) 2015      Yangqing Jia
Copyright (c) 2013-2016 The Caffe contributors
All rights reserved.

Various files include modifications (c) NVIDIA CORPORATION.  All rights reserved.
NVIDIA modifications are covered by the license terms that apply to the underlying project or file.

NOTE: MOFED driver for multi-node communication was not detected.
      Multi-node communication performance may be reduced.

root@15d15b52f20a:/workspace# nvidia-smi
Thu Nov 14 07:11:21 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.56       Driver Version: 418.56       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| 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 GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
| 30%   53C    P0    62W / 250W |   2067MiB / 11168MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
root@15d15b52f20a:/workspace# history
    1  nvidia-smi
    2  history
root@15d15b52f20a:/workspace# 

并且发现没有?可以直接访问宿主的GPU!这可以说是很方便了,假如你在用 docker run --gpus all 的时候遇到错误,试一下安装一下:

sudo apt-get install -y nvidia-container-toolkit 

这样,你就可以在docker里面,自由的访问并使用你的GPU了,并且自带了一些显卡驱动。

葵花宝典第二式:使用volume让container和主机通信

然后有个问题就是,如何让container跟主机通信,方式其实也很简单,就是:

docker run --gpus all -v /local/docker_data00/:/data -it registry.cn-shenzhen.aliyuncs.com/xxx/nvidia-pytorch:19.09-py3

通过这个 -v 的标志,意味着把本机的一个路径和container里面的data进行挂载。

葵花宝典第三式:为什么要加 --rm

尽管这样,我们似乎还是没有理解清楚,image和container的区别,container是你每次进入image的时候都会创建一个的,对比这两条命令:

docker run --gpus all --rm --ipc=host -it registry.cn-shenzhen.aliyuncs.com/xx/nvidia-pytorch:19.09-py3
docker exec -it 801768a188f1 bash

上面的意思是,你进入一个image,然后docker会自动帮你开一个container,假如你同时进入同一个image,那么就是两个container,因此你退出这个container,再次运行进入image,此时就是一个不同的container了。

下面这个意思是,你运行指定的container,请注意,假如你docker run的时候没有 --rm,那么你退出之后,container依旧存在,你可以通过 docker exec 继续运行那个容器,你之前做的一些修改也会存在于那个容器之内。你也可以在 docker run --name来指定你的这个container的名字,下次直接 docker exec --it name就跑你那个名字的container即可。

葵花宝典第四式:不加 --rm 退出后无法再进入container?

最后你发现,你没有加 --rm,因为你name了你的container,你想再次使用它。那么再次运行:

docker exec -it your-container-name bash

的时候却没有反应。

原因是什么?原因是这个container真的是没有在运行啊,你退出之后它就关掉了,但是,这是关掉不是删除!开一下就行:

docker start your-container-name

然后就可以再次进入这个container了。

最后,你做了修改,需要将container commit到image上面去,那么就:

docker commit -am 'add some installation steps' your-container-name local/image/path:tag-name

这样,你的修改就被永久的保存在了这个image里面了。

至此,葵花宝典修炼完成。

OK,基本上会以上这么一些操作,所有的docker应该掌握的差不多了你。