使用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

  此时,查看容器列表,可以看见上面运行的容器。

docker 创建镜像 加标签 docker创建镜像有哪几种方式_nginx

  · Nginx 访问

  通过http://192.168.20.50/访问Nginx首页,可以看到常见的Nginx默认首页。

docker 创建镜像 加标签 docker创建镜像有哪几种方式_docker 创建镜像 加标签_02

  docker commit 创建私有镜像

  对Nginx进行私有化处理,将Nginx默认首页更改为自定义的页面,将容器重新打包成镜像,以便保存我们的修改。

  · Nginx 修改

  参照Docker 进入容器方式详解中进入容器的方式,进入容器。

docker exec -it fa4690a84ff2 /bin/bash

  进入容器后,由于是精简版的Linux系统,首先需安装vim命令,以便对文件进行编辑。

apt-get update
apt-get install -y vim

  进入容器和安装vim的完整过程如下:

docker 创建镜像 加标签 docker创建镜像有哪几种方式_commit_03

  通过vim命令编辑/usr/share/nginx/html/index.html,修改为如下的内容:

docker 创建镜像 加标签 docker创建镜像有哪几种方式_Docker_04

  · 镜像创建

  通过如下命令在已有容器上创建镜像,通过docker images命令可以看到nginx:securitit即是创建的镜像。

docker commit -a "Securitit" -m "This is Securitit's define image" fa4690a84ff2 nginx:securitit

docker 创建镜像 加标签 docker创建镜像有哪几种方式_nginx_05

  通过nginx:securitit镜像启动容器。

docker 创建镜像 加标签 docker创建镜像有哪几种方式_nginx_06

  · Nginx 访问

  此时访问Nginx首页,可以看见是修改过的文件。

docker 创建镜像 加标签 docker创建镜像有哪几种方式_nginx_07

  总结

  当运行一个容器的时候(如果不使用卷的话),对容器内文件所做的修改都会被记录于容器的存储层中。docker commit命令可以将容器的存储层保存下来形成镜像。即是在原有镜像的基础上,再叠加容器的存储层,并构成新的镜像。

  docker commit对所有镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,说的通俗点,就是对镜像所做的修改不是透明的,无法有效的记录镜像的生成过程,对于后期维护来说,是非常痛苦的。

  同时,docker commit仅在当前层进行标记、添加、修改,而不会改动上一层,这样的操作会使得镜像变得更加的臃肿,同时Union FS是有最大层数限制,也会限制docker commit生成的镜像的修改次数。

  若文中存在错误和不足,欢迎指正!