把数据保存到本地,有以下两种方式:
1.volumes数据卷
# 创建一个卷
docker volume create my_volume
# 运行容器并挂载卷
docker run -d --name my_container -v my_volume:/app/data my_image
2.bind mounts挂载
与volume不同的是,绑定挂载直接使用宿主机文件系统中的路径(需要给出绝对路径)
docker run -d --name my_container -v /host/path:/container/path my_image
多阶段构建镜像
参考:https://www.orchome.com/8191
多阶段构建可以由多个 FROM 指令识别,每一个 FROM 语句表示一个新的构建阶段,阶段名称可以用 AS 参数指定
构建的容器占内存太多
解决办法:
- 用dockerfile构建
- 尽量使用官方给的镜像,而不是自己从头开始构建
基于官方的ubuntu20.04镜像,然后自己手动装了ros,cuda,cudnn之后,生成的镜像竟然就达到了16.8GB
想着能不能直接用nvidia官方的cuda镜像呢?在https://hub.docker.com/r/nvidia/cuda/tags?page=1&page_size=&name=11.8&ordering=里可以找到nvidia/cuda的镜像,然后根据tags搜索自己想要的cuda版本,比如说11.8。
发现了我想要的ubuntu20.04+cuda11.8+cudnn8的镜像,但是有两个版本,一个是runtime,另一个是devel,体积比runtime大了不少。
区别:
devel
镜像:适用于开发和编译 CUDA 应用程序。runtime
镜像:适用于运行已编译的 CUDA 应用程序。
一开始不懂,就下了更小的runtime版本,但是从镜像创建出容器,使用nvcc --version指令会报错找不到nvcc,但还是不死心,又试着装了openpose库,在cmake的时候报错找不到cuda,这才重新下载devel版本。
不知道为啥官网4.99G,但下载下来有9.7G
创建容器:
docker run -it --gpus all --privileged=true -v /dev/:/dev/ -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -w /workspace nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04 /bin/bash
验证一下cuda版本:
运行以下指令验证cudnn版本:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
找不到这个文件,不过没关系,用ls /usr/lib/x86_64-linux-gnu | grep cudnn指令找到了libcudnn,说明cudnn库是安装好了的
ls /usr/lib/x86_64-linux-gnu | grep cudnn
在openpose的cmake中,也一切正常
感觉用官方的cuda镜像,在镜像大小上面没有比自己手动安装小多少,不过比较省事,直接拉取就可以了