滥用Docker容器当作虚拟机的方法

把Docker当虚拟机用,虽然真的很不优雅,做出来的镜像又糙又肮脏,但是这真的很方便啊。

注意事项

Best Practice

理想情况下Docker Image最好使用Dockerfile来构建。把Docker Container当做虚拟机来构建Docker Image这个方法虽然非常省事,但该方法很容易做出来很大一坨镜像,很不轻量,所以仅推荐在测试时使用,不推荐在正式场合(如企业的生产环境)使用。

权限问题

Docker的安装和使用(创建销毁容器等)都需要超级用户权限。若非系统管理员,务必确认环境里已经安装了Docker和拥有Docker的使用权限(已加入docker用户组)

注:Docker也有Rootless模式,但需要额外的配置。

基础知识

容器与镜像

镜像可以说是容器在某一个时刻的所有文件数据,包括运行环境,程序,临时文件等。而容器才是能产生进程运行程序的东西。所以镜像是静态的,容器是动态的。他们的生命周期和转换关系如下

1
2
3
4
5
6
7
8
9
      |---------push--> (Docker Hub)
|---------save--> (tar File)
|
Docker Image----run---> Docker Container
↑ |
|---------commit--------|
|---------pull----(Docker Hub)
|---------load----(tar File)
|---------build---(Dockerfile)

命名

容器的名字没有太多讲究,镜像名字的构成是:镜像名: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