docker 使用小记

由于最近需要在几台电脑上配置相同的环境,几台电脑的操作系统不一样,而且配置一台所需要的步骤是比较繁琐的,因此就想到了用 docker,下面是使用 docker 构造镜像并且在不同的电脑上使用这个镜像的记录。

docker 支持多个平台,各个平台上具体的安装步骤可参考官方文档

docker 提供了一个镜像仓库,当从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改

  1. 从已经创建的容器中更新镜像,并且提交这个镜像
  2. 使用 Dockerfile 指令来创建一个新的镜像

这里采用的是第一种方法,由于我这里需要的是 python 环境,因此先 pull 一个 python 镜像作为基础镜像(可以通过 docker search python 找到相关的镜像,这里 pull 的是官方的 pytohn 3.5 镜像), 命令如下

docker pull python:3.5

等到镜像 pull 下来后,可以通过以下命令进入镜像中

docker run -t -i python:3.5 /bin/bash

这里 -t -i 含义如下

-t : 在新容器内指定一个伪终端或终端。 -i : 允许你对容器内的标准输入 (STDIN) 进行交互

这样便可进入装有 python 3.5 的系统(默认是 ubuntu),然后在其中像普通的系统一样通过 apt 和 pip 配置所需要的软件和库即可

配置完成后注意不能马上退出这个容器,因为在这个容器中的修改默认是不会影响到原来的镜像的,也就是说如果退出后在进入 python:3.5 镜像所创建的容器中,所安装的这些库会完全消失,因此需要将这个配置过的容器另存为一个新的镜像,具体做法如下

首先原来的容器不能退出,另开一个终端,通过 docker ps 命令获得修改过的容器的 id ,如下图所示

docker ps

然后 docker commit id new_image 命令将这个修改过的容器存为新的镜像,这里的 id 不一定要写全,只要能跟其他的容器 id 区分开来,写前几个字符也可以。

如下所示是将前面的容器另存为镜像 modified_python, 并且通过 docker images 查看到该创建的镜像的时间和大小。

docker commit

如果要将这个容器分发到其他机器,可以先将这个镜像上传到 docker 官方的中央仓库 (需要注册账号),其他机器再从中央仓库 pull 下来,但是这样可能会存在着网速过慢的问题,因此可以在本地导出容器,然后直接拷贝到其他机器导入,具体操作如下

首先通过 docker ps -a 查看本地使用的容器,然后通过 docker export id > tar_file 将容器导出到 tar_file 中,其中容器 id 的书写规则同上。如下是将上面配置过的 python 环境导出到 ubuntu_python.tar

docker export

通过这个文件导入为镜像也很简单,通过 cat tar_file | docker import image_name 即可将 tar_file 导入为 image_name 镜像

docker import

其他的一些值得注意的地方就是 -v 参数可以将本地的目录挂到 docker 的目录中,从而可以在容器中写入本地磁盘,具体语法为 -v local_dir:contain_dir, 当容器中的 container_dir 不存在时会自动创建这个目录。


参考资料:

Install Docker Docker 教程 关于 Docker 目录挂载的总结 保存对容器的修改 导出和导入容器