docker使用记录

守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart

修复在docker里不能用gpu的问题,一是要在docker的命令里加上–runtime=nvidia 选项,二是见这篇帖子,据说是注册docker-nvidia。喔对了记得sudo apt-get install 这个包:nvidia-container-runtime。Ref: https://blog.csdn.net/weixin_32820767/article/details/80538510

然后就是我们进入到docker程序里的时候,都是以root帐号进行登录的,在这篇博客里可以设置,以后可以看下: https://blog.csdn.net/qq_42606051/article/details/82589377

如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器。如果使用exit退出,那么在退出之后会关闭容器,可以使用下面的流程进行恢复: 1. 使用docker restart命令重启容器 2. 使用docker attach命令进入容器(attach后面的是容器名或者容器id)。还有其它的进入容器的方法:https://www.cnblogs.com/xhyan/p/6593075.html


在导入某个包的时候老报错ImportError: libGL.so.1: cannot open shared object file: No such file or directory, 然后是这个from PyQt5 import QtCore, QtGui, QtWidgets的最后一层import的错误,然后搜了https://github.com/conda-forge/pygridgen-feedstock/issues/10</code”>很多都是说sudo apt install libgl1-mesa-glx,然而我这样修了并没有用。一开始还尝试了把docker里的PyQt5的版本uninstall了然后装成和宿主机上一样的版本(因为宿主机上是好端端的),然而并不能fix。于是就又查了查,看到了之前好像就遇到过的matplotlib的锅,在这个帖子的启发下,修改了vim /opt/conda/lib/python3.6/site-packages/seaborn/utils.py 里的import matplotlib.pyplot as plt为那个三行(use(‘Agg’)那个),然后好像解决了问题。

(ps: 20190429更新:今天发现了新的报错,在import matplotlib.pyplot as plt时报错,然后把那三行直接在python里执行的时候,发现有个另外的库文件已经set了,也把/opt/conda/lib/python3.6/site-packages/matplotlib/pyplot.py这个文件加上matplotlib.use("Agg")就好了)

查看 CUDA 版本:

cat /usr/local/cuda/version.txt

查看 CUDNN 版本:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

CUDA版本对于我们的docker镜像的影响很大,我遇到好几次下面的错误,因为就是docker 镜像的cuda版本大于了宿主机的cuda版本:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused “process_linux.go:424: container init caused \”process_linux.go:407: running prestart hook 1 caused \\”error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli –load-kmods configure –ldconfig=@/sbin/ldconfig.real –device=all –compute –utility –require=cuda>=10.0 brand=tesla,driver>=384,driver<385 –pid=21206 /var/lib/docker/overlay2/d5c42eec581b8f9b70e5f2e1233926f878a6ce1b64cc2a37942deb8eeef9ad0e/merged]\\nnvidia-container-cli: requirement error: unsatisfied condition: brand = tesla\\n\\”\””: unknown.


20190412 update:
又遇到docker: Error response from daemon: Unknown runtime specified nvidia. 解决方法的错误,参考了这篇帖子后好了:https://blog.csdn.net/weixin_32820767/article/details/80538510


20190418 Update:

对于docker有了新的层面上的认识,我认为它是我们用新服务器来快速执行一段代码的不二选择。下面举我们需要跑一段用GPU执行tensorflow的例子:

  1. 安装docker

sudo apt-get install docker.io

  1. 给docker命令分配sudo权限,避免之后每一次需要输入sudo docker

sudo groupadd docker #如果还没有 docker group 就添加一个
sudo gpasswd -a ${USER} docker #将当前用户添加到docker属组
sudo service docker restart
newgrp – docker #切换当前会话到新 group 或者重启 X 会话(因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错)

  1. 拉取最新的tensorflow的GPU版本的镜像

docker pull tensorflow/tensorflow:latest-gpu

  1. 创建一个不支持nvidia的docker镜像 安装NVidia

docker run -it –name test -v ~/:/ds tensorflow/tensorflow:latest-gpu

其中-v的参数是将宿主机(本地)的~目录挂载到容器内的/ds目录下。之后,当我们进入容器的/ds目录,即可以看到宿主的~目录的内容。

进入容器后,同时按住ctrl p q三个键,可以从容器内脱离(detach)出来。然后我们此时可以docker ps查看到这个正在执行的容器。如果需要退出容器,我们可以在容器内输入exit,或者ctrl d. 在退出后,还需要再进入之前的容器,我们此时通过docker ps -a可以看到这个已经关闭的容器,通过docker restart testdocker attach test即可重新进入这个容器。

  1. 创建一个支持nvidia的docker镜像

在步骤四创建的docker镜像,由于其引擎不支持nvidia,所以我们是不可以在上面用GPU跑任务的。安装NVidia支持的Docker引擎的步骤如下:

i. 更新apt源

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

ii. 安装nvidia-container-runtime

sudo apt-get install nvidia-container-runtime

iii. 注册nvidia-docker

  1. tensorflow-gpu安装
    在tensorflow/tensorflow:latest-gpu版本中,只有python2的安装了tensorflow-gpu,没有pip3与python3的tensorflow-gpu.

需要安装一下:

apt-get update
apt-get install python3-pip

然后利用pip3安装tensorflow以及keras:

apt-get install libcupti-dev
apt-get install python3-pip python3-dev python-virtualenv
virtualenv –system-site-packages -p python3 targetDirectory
pip3 install -i https://pypi.tuna.tsinghua.edu.cn tensorflow-gpu keras

Ref

  1. https://www.cnblogs.com/mafeng/p/8683914.html
  2. https://blog.csdn.net/xialingming/article/details/81463964
  3. https://www.jb51.net/article/135441.htm

关于docker里的某一个进程死掉了情况:

docker ps,找到你想要的那个的id,然后
cd /sys/fs/cgroup/memory/docker/d14e1a6182eeed7c8f2a7c0a315a790a16bfbab1fdc7a73813cdeee494e8050a/(注意这个后面的那么长的值是前面那个ps的id的完整版,可以tab比对一下)。进程号就存在一个文件里面,cat cgroup.procs。查看所有进程,找出对应的进程树分支。

还有一种更有效的获取容器进程的方法,这种方法依赖docker程序,要是程序卡住就无法使用了。docker top ContainerID

还可以单独查看指定容器所属docker子进程的PID。docker inspect -f '{{.State.Pid}}' CONTAINERID

Ref:

https://www.cnblogs.com/keithtt/p/7591097.html

点赞
  1. ohazyi说道:

    nohup jupyter notebook --ip=0.0.0.0 --no-browser --allow-root --port=8333 --NotebookApp.token=zy &

  2. ohazyi说道:

    select sentence into outfile '/tmp/sentences.txt' lines terminated by '\r\n' from API_usage;

  3. ohazyi说道:

    vim /opt/conda/lib/python3.6/site-packages/fastai/imports.py

  4. ohazyi说道:

    import matplotlib
    matplotlib.use("Agg")
    import matplotlib.pyplot as plt
    import matplotlib.pyplot as rcParams
    import matplotlib.pyplot as animation

  5. ohazyi说道:

    python manage.py runserver 0.0.0.0:8765 &

  6. ohazyi说道:

    docker命令中的hamelsmu/ml-gpu 是docker需要的镜像文件,他首先会在本地文件中去找有没有,没有的话就会去远程仓库中去下载

  7. ohazyi说道:

    20190411Update: 在sudo apt-get install nvidia-runtime的时候,那个原网页的第一步也需要!

  8. ohazyi说道:

    作为发布者,务必用标签把代码、命令什么的包起来,而且拜托不要让全角符号出来害人啦。

  9. ohazyi说道:

    在更新cuda到版本10后,最后还是报下面的错,无语了:docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:424: container init caused \"process_linux.go:407: running prestart hook 1 caused \\\"error running hook: exit status 1, stdout: , stderr: exec command: [/usr/bin/nvidia-container-cli --load-kmods configure --ldconfig=@/sbin/ldconfig.real --device=all --compute --utility --require=cuda>=10.0 brand=tesla,driver>=384,driver<385 --pid=11369 /var/lib/docker/overlay2/ddf45fca4f2009ba795d7e3d05bcb82bea85289ec7f28e43c5bc38767979387b/merged]\\\\nnvidia-container-cli: initialization error: cuda error: operation not supported\\\\n\\\"\"": unknown.

  10. ohazyi说道:

    上一条评论更新,发现nvidia-container-cli 和 nvidia都跑不了了,重启了后都好了,包括开启一个镜像

发表评论

电子邮件地址不会被公开。 必填项已用*标注