构建自己的Docker镜像
-
Create a new image from a container’s changes
-
根据一个容器的修改创建一个新的image
docker container commit 简写方式 : docker commit Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- Demo
docker pull centos // 拉取一个centos latest版本的image docker run -it centos // 创建一个centos的container并交互运行 yum install -y vim // 给该container安装vim exit // 退出该container docker ps -a // 查看该container的NAME docker commit romantic_saha brannua/centos-vim // 根据该container的NAME romantic_saha 创建一个名为brannua/centos-vim的image docker images // 查看新创建的image
- 对比centos latest版本镜像和brannua/centos-vim镜像的分层情况如下
- Usage : docker history [OPTIONS] IMAGE
docker images // 查看当前所有镜像的镜像ID docker history 470671670cac // 查看centos latest版本的分层情况 docker history 68ad6fa2113a // 查看brannua/centos-vim的分层情况
- 可以发现brannua/centos-vim比centos latest多了一层,这一层就是用来安装vim
- 但是这种根据一个自己修改过的container,commit出来的image,对于他人来说并不安全,所以并不提倡这种创建image的方式
- Demo
推荐如下创建image的方式
-
Build an image from a Dockerfile
-
根据 Dockerfile 去 build 出一个image
-
首先我创建了一个空目录
mkdir docker-centos-vim
- 然后进入该目录创建一个Dockerfile
cd docker-centos-vim
vim Dockerfile
- 写入Dockerfile代码如下,并保存退出
FROM centos
RUN yum install -y vim
- 但是这里有个问题,base image只读,但需要运行命令在centos上安装vim,如何办到?
- 基于当前目录的Dockerfile,build出一个新的image
docker build -t brannua/centos-vim-new .
- 输出如下
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 470671670cac // 输出IMAGE ID,表明直接引用centos这一层( layer )作为base image
Step 2/2 : RUN yum install -y vim
---> Running in 7f25d1acd9c8 // 输出CONTAINER ID,表明基于base image生成新一层image,并创建运行一个临时的container,用来安装vim
// 此处省略 N 行输出.............................................................................
Complete!
Removing intermediate container 7f25d1acd9c8 // 正在remove临时的container
---> 1fc685c0d5de // 输出IMAGE ID,表明基于修改过的临时的container,commit出了一个新的image
Successfully built 1fc685c0d5de
Successfully tagged brannua/centos-vim-new:latest
-
上面那个疑问迎刃而解,centos image作为base image被直接引用,基于base image创建运行了一个临时的container,用来安装vim,参考docker笔记(四),vim安装成功后,用这个临时container,commit出了一个新的image,这个新的image就比原来多出了安装vim的一层,然后remove掉了临时container,最后给这个创建出的全新image打上了tag。整个过程和docker笔记(二)中的image模式图十分吻合。
-
Dockerfile相比于image,体积小很多,方便分享
-
他人只需要获取到这个Dockerfile,就可以build出一个完全一样的image
-
他人也可以根据Dockerfile的代码,十分清楚地看出这能build出一个什么样的image,方便且安全。