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目录挂载的总结 保存对容器的修改 导出和导入容器