docker 基本使用
-do1.安装docker:
Redirecting…
0. docker内使用gpu, 安装nvidia-docker:
https://github.com/NVIDIA/nvidia-docker,
安装后使用:nvidia-container-cli -k -d /dev/tty list, 验证正确,无报错,即为正确
1. docker 启动image,如果启动gpu 版本必须用nvidia-docker, -d detach, -i interactive, -t with fake terminal , -network=host 与本机一样的网络
nvidia-docker run -dit --name icdl --restart=always --network=host <image> bash
连接到已有容器 sudo docker exec -it 775c7c9ee1e1 /bin/bash,
加入--always, 就是这个docker 挂掉以后,dockerd会自动把这个container启动。systemd把dockerd启动,dockerd守护always的container
2.用docker 代替nvidia-docker 启动带有gpu, cuda 的container
docker run --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia0 -v nvidia_driver_367.48:/usr/local/nvidia:ro -dit --name=test7 --network=host docker.io/bvlc/caffe:gpu /bin/bash
新版不用这么麻烦了,按照https://github.com/NVIDIA/nvidia-docker,只需docker --runtime=nvidia ...
docker19.03后的版本使用:docker --gpus all
3.带gdb支持的container, run 时候加上--cap-add=SYS_PTRACE
echo 0 /proc/sys/kernel/yama/ptrace_scope
4. docker attach 以后,使用Ctrl+P and Ctrl+Q离开
5.docker 离线安装 1)https://download.docker.com/linux/static/stable/x86_64/ 下载后,解压到/usr/local/bin下面,2)然后
vi
/etc/fstab
#在结尾添加
none
/sys/fs/cgroup
cgroup defaults 0 0
重启
3)如果使用gpu, 就用2中命令启动container
6.有哪些container: docker ps -a
7.有哪些image: docker images
8.删除不用的container: docker rm -f face/face1:version1
9.删除image : docker rmi <image>
10.将当前container 保存成image, commit部分,face/face1是仓库名称,version1是tag, 如果docker里面要使用gpu,那么一定不能用11的方式,一定要commit成image, 再load, 否则回报特别多的错误,/usr/lib/x86_64-linux-gnu/libnvidia-*,下面有些文件大小会是0,就算从host拷贝过去,也会遇到其它非常多的错误。nvidia-docker相当于把host的driver直接透传到docker内部
docker commit c3f279d17e0a face/face1:version1
将image 导出成压缩包:docker save -o /home/sam/aa.tar face/face1:version1
导入压缩包到image :docker load --input aa.tar
11.直接把container 导出,然后导入,这样文件大小会大大缩小
docker export test20 -o ./faceexport.tar
gzip --best faceexport.tar
cat /home/faceexport.tar | docker import - face:latest
12. 添加卷
ln -s /u01 /var/lib/docker/volumes/volu01
docker volume create volu01
docker run -dit --restart=always --mount source=volu01,target=/u01 --name icdl1 --network=host 93682a1555c1 bash
如果只是-d 没有it,是无法启动的, volu01后边逗号后不能有空格
更复杂的是:
docker run -dit --gpus all --restart=always --log-opt max-size=10m -e LANG='en_US.utf8' -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro -e PATH=/root/anaconda3/bin:/bin/:/usr/bin/ -e MXNET_CUDNN_AUTOTUNE_DEFAULT=0 -e LD_LIBRARY_PATH=:/root/anaconda3/pkgs/cudatoolkit-10.0.130-0/lib/ --name aiex4_v20200104 --network=host aiex4:v20200104 /bin/bash -c ". /root/anaconda3/etc/profile.d/conda.sh && echo && conda activate mxnet && cd /algorithm_hub; python run.py"
docker run --gpus all -itd --restart=always --log-opt max-size=10m --log-opt max-file=1 --ipc=host -h face-machine -e DISPLAY=:0 -e LANG='en_US.utf8' --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -v /data:/data/ -v /etc/localtime:/etc/localtime -v /data/face_terminal/cameraConfigs/camera_xiaofang.json:/data/face_terminal/cameraConfigExample.json --name face_xiaofang ai/face:1012 /data/face_terminal/docker-run.sh
13.开机启动, 之前已经对卷建立软连接,ln -s /u01 /var/lib/docker/volu01
在/etc/rc.local里面加入如下行
systemctl start docker
docker volume create volu01
docker start icdl1
docker exec -d icdl1 starticdl.sh
其中,starticdl.sh位于container内部/usr/bin/目录下面,内容如下,其中server.py里面,加入了守护程序
#!/bin/bash
cd /idcardDriverlisenceRecog/src/ && python server.py
守护程序部分见:python守护程序_northeastsqure的专栏-CSDN博客_python守护程序
14. alpine极简版linux,含有busybox
安装bash: RUN apk add --update bash && rm -rf /var/cache/apk/*
内无管理员权限,在dockerfile里面:USER root
15.docker内部程序开机启动:
cd /idcardDriverlisenceRecog/src/
python /idcardDriverlisenceRecog/src/IDcardVehiclelisenceRecog_facepp_youtu.py
exit 0
16. 让docker 某 container 与docker 一同起来,即永远不停机
docker update CONTAINER --restart always
17. 制作ubuntu1604,docker
从这里连接制作,跟着18命令,https://github.com/tianon/docker-brew-ubuntu-core/tree/010bf9649b1d10e2c34b159a9a9b338d0fdd4939/xenial
18. 从dockerfile得到docker image
docker build --tag='ubuntu1604:Dockerfile' .
19. 运行docker命令,比如docker ps,遇到:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/containers/json: dial unix /var/run/docker.sock: connect: permission denied
把当前用户加入到docker组,然后重新登录
sudo usermod -a -G docker $USER
不重新登录执行:sg docker -c "bash"
20. 把文件夹复制到docker container里面,或者拷贝出来
docker cp src/opencv-2.4.13.6 seetaface_ubuntu1604:/
两个参数倒过来,就是拷出来
21.遇到错误:stderr: nvidia-container-cli: initialization error: cuda error: unknown error\\\\n\\\
百思不得其解,很多说是驱动问题,我想,驱动什么问题呢,然后查看nvidia docker的架构,启动docker image,是不依赖与host的cuda的,那么为什么报cuda error, 没有理解。后面重启系统,结果好了,系统很久没有重启了。问题还是没有理解,为什么报cuda error呢,不装cuda也是可以的呀。
22.搜索docker错误的时候,遇到说用dmesg查看,那么它是干什么的?
dmesg是打印 kernel ring buffer
23.什么是kernel ring buffer?
在syslog daemon启动以前,操作系统把日志保存到kernal ring buffer里面,写到/var/log/dmesg,里面。syslog daemon启动后,内核的消息也是写到这里,同时写到syslog里面。
24.什么是nvidia-uvm?
uvm:unfied virtual memory. 每个gpu有自己的显存,系统有自己的ram内存,那么如何分别访问呢?如果没有uvm,那么编程者,要指定我的程序是在 ram,还是在gpu, 有了uvm,那么所有的存储空间是统一的。
CUDA 6 Unified Memory explained - StreamHPC
可见,cuda编程,这个模块是必须的,所以nvidia docker启动必须加载这个模块。
25.开启图形显示
xhost local:docker
docker run -it --name xwin -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/ckhung/data:/tmp/exdata ubuntu:18.04 bash
apt-get install -y x11-apps
与外面主机用户同名
useradd -m -s /bin/bash -u 1000 silva
su silva
26. container 启动以后如何更改container 的主机名称?
lsns
nsenter --target 1785 --uts hostname hostname_abc
https://serverfault.com/questions/716719/how-do-i-change-docker-host-name-after-the-image-creation/717191
27.如何离线安装 nvidia container toolkit?
下载 Release v1.17.2 · NVIDIA/nvidia-container-toolkit · GitHub
然后tar xf解压
然后dpkg -i 安装