This article was original written by XRBLS, 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 image ls
看到很多image,那么我如何使用这些image来开启一个container呢?
note: 下文中使用的所有远程docker url都是私有化的,个人使用无效,大家可以更换为一些公开的url测试。
先看看如何开启一个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了,并且自带了一些显卡驱动。
然后有个问题就是,如何让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里面了。
至此,葵花宝典修炼完成。