使用Docker的过程中,很多时候Docker仓库中提供的镜像已经足够我们使用,但难免会出现,由于业务原因或其他特殊原因需要对镜像进行改造的场景,此时,需要对镜像进行扩展,以使镜像可以满足我们的需求。
创建镜像一般有三种方式:
· 基于已有镜像创建镜像。
· 基本本地模板导入镜像。
· 基于dockerfile创建镜像。
今天,就先来说说基于已有镜像创建镜像。
docker commit 语法及语义
语法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数:OPTIONS参数说明。
-a:提交的镜像作者。
-c:使用Dockerfile指令来创建镜像。
-m:提交时的说明文字。
-p:在commit时,暂停容器。
语义:将容器打包成镜像。
公共Nginx镜像 示例
· 镜像拉取
通过docker pull命令拉取nginx最新版本的镜像。
docker pull nginx:latest
· 容器启动
使用获取的nginx镜像创建并启动容器。
docker run --name securititnginx -d -p 80:80 nginx:latest
此时,查看容器列表,可以看见上面运行的容器。
· Nginx 访问
通过http://192.168.20.50/访问Nginx首页,可以看到常见的Nginx默认首页。
docker commit 创建私有镜像
对Nginx进行私有化处理,将Nginx默认首页更改为自定义的页面,将容器重新打包成镜像,以便保存我们的修改。
· Nginx 修改
参照Docker 进入容器方式详解中进入容器的方式,进入容器。
docker exec -it fa4690a84ff2 /bin/bash
进入容器后,由于是精简版的Linux系统,首先需安装vim命令,以便对文件进行编辑。
apt-get update
apt-get install -y vim
进入容器和安装vim的完整过程如下:
通过vim命令编辑/usr/share/nginx/html/index.html,修改为如下的内容:
· 镜像创建
通过如下命令在已有容器上创建镜像,通过docker images
命令可以看到nginx:securitit即是创建的镜像。
docker commit -a "Securitit" -m "This is Securitit's define image" fa4690a84ff2 nginx:securitit
通过nginx:securitit镜像启动容器。
· Nginx 访问
此时访问Nginx首页,可以看见是修改过的文件。
总结
当运行一个容器的时候(如果不使用卷的话),对容器内文件所做的修改都会被记录于容器的存储层中。docker commit命令可以将容器的存储层保存下来形成镜像。即是在原有镜像的基础上,再叠加容器的存储层,并构成新的镜像。
docker commit对所有镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,说的通俗点,就是对镜像所做的修改不是透明的,无法有效的记录镜像的生成过程,对于后期维护来说,是非常痛苦的。
同时,docker commit仅在当前层进行标记、添加、修改,而不会改动上一层,这样的操作会使得镜像变得更加的臃肿,同时Union FS是有最大层数限制,也会限制docker commit生成的镜像的修改次数。
若文中存在错误和不足,欢迎指正!