滥用Docker容器当作虚拟机的方法
把Docker当虚拟机用,虽然真的很不优雅,做出来的镜像又糙又肮脏,但是这真的很方便啊。
注意事项
Best Practice
理想情况下Docker Image最好使用Dockerfile来构建。把Docker Container当做虚拟机来构建Docker Image这个方法虽然非常省事,但该方法很容易做出来很大一坨镜像,很不轻量,所以仅推荐在测试时使用,不推荐在正式场合(如企业的生产环境)使用。
权限问题
Docker的安装和使用(创建销毁容器等)都需要超级用户权限。若非系统管理员,务必确认环境里已经安装了Docker和拥有Docker的使用权限(已加入docker
用户组)
注:Docker也有Rootless模式,但需要额外的配置。
基础知识
容器与镜像
镜像可以说是容器在某一个时刻的所有文件数据,包括运行环境,程序,临时文件等。而容器才是能产生进程运行程序的东西。所以镜像是静态的,容器是动态的。他们的生命周期和转换关系如下
1 | |---------push--> (Docker Hub) |
命名
容器的名字没有太多讲究,镜像名字的构成是:镜像名:Tag
,如Ubuntu:18.04
的镜像名是Ubuntu
,Tag是18.04
。
其他实用命令
docker ps
查看运行中的容器docker ps -a
查看所有容器(包含未运行的容器)
docker rm -f
删除容器docker images
查看已下载的镜像docker pull
下载镜像docker rmi
删除镜像
DockerHub下载加速
暂未找到什么很好的加速方法
创建容器
推荐命令:
1 | docker run -id --name your_ct_name --privileged --network host --restart always ubuntu:18.04 bash |
参数含义:
-d
+-i
+bash
组合会启动容器里的bash
,目的是让容器挂在后台--restart always
主机重启后自动启动容器,挂在后台ubuntu:18.04
推荐使用Ubuntu 18.04镜像--privileged
允许容器使用更多的内核功能--network host
使用主机网络(禁用网络空间隔离)
也可以使用老黄家的CUDA开发环境镜像:
1 | docker run -id --name your_ct_name --privileged --network host --restart always --gpus all nvidia/cuda:11.0.3-devel-ubuntu18.04 bash |
参数含义:
nvidia/cuda:11.0.3-devel-ubuntu18.04
是包含CUDA 11.0.3对应工具链的Ubuntu 18.04镜像
- 镜像的CUDA版本需要和驱动支持的版本对应,
nvidia-smi
右上角会显示最高支持的CUDA版本devel
版镜像包含nvcc
编译器等工具链,runtime
版不含工具链--gpus all
使用所有可用的GPU
所有黄家容器列表:https://hub.docker.com/r/nvidia/cuda/tags?page=1&ordering=last_updated
进入容器(交互式bash)
1 | docker exec -it your_ct_name bash |
参数含义:
-i
+-t
启动交互式模式
进入容器后如果想换apt源,建议使用下面的命令来换,因为镜像为了节约空间,往往不包含文字编辑器
1 sed -i "s#archive.ubuntu.com#mirrors.sustech.edu.cn#g" /etc/apt/sources.list
容器、镜像、文件的转换
容器到镜像
1 | docker commit your_ct_name your_images_name:your_tag |
镜像到文件
1 | docker save your_images_name:your_tag -o your_file.tar |
文件到镜像
1 | docker load -i your_file.tar |