利用docker commit命令生成镜像

Docker镜像是多层存储,每一层是在前一层的基础上进行的修改。而容器是镜像为基础层的多层存储。

如果不使用数据卷,运行一个容器的时候,对任何文件的修改都会被记录于容器存储层。

docker commit 命令可以将容器存储层保存下来成为镜像。也就将原有镜像的基础层和容器存储层,并构成包含原有容器最后的文件变化的新镜像。

但在实际环境中,推荐使用Dockerfile来完成定制镜像,而不是使用docker commit 命令。

原因如下:

  • 大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。
  • 使用 docker commit命令生成的是黑箱镜像,除了制作镜像的作者清楚具体的改动,他人只能通过docker diff命令获取很少的线索,难以维护。

示例:

[root@CentOS-7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 6a2f32de169d 6 days ago 117.2 MB
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker run --name TestCommitImages -d -it ubuntu bash
ca9cb66a39ca0271149fadce05523d41488a5c047196de510fe54c0f26a46b25
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca9cb66a39ca ubuntu "bash" 4 seconds ago Up 2 seconds TestCommitImages
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker exec -it TestCommitImages bash
root@ca9cb66a39ca:/# echo "this is a test !" >> testcommit.log
root@ca9cb66a39ca:/# ls -l testcommit.log
-rw-r--r-- 1 root root 17 Apr 19 03:04 testcommit.log
root@ca9cb66a39ca:/# cat testcommit.log
this is a test !
root@ca9cb66a39ca:/# exit
exit
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker diff TestCommitImages
C /run
A /run/secrets
C /root
A /root/.bash_history
A /testcommit.log
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker commit --author "anliven" --message "touch new file" TestCommitImages ubuntu:commit
sha256:87575bc0c80f7dd9230072626a31cdeea5c6163e70b559f5432eaac881bd2376
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu commit 87575bc0c80f 36 seconds ago 117.2 MB
docker.io/ubuntu latest 6a2f32de169d 6 days ago 117.2 MB
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker history ubuntu:commit
IMAGE CREATED CREATED BY SIZE COMMENT
87575bc0c80f 9 minutes ago bash 106 B touch new file
6a2f32de169d 6 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 6 days ago /bin/sh -c mkdir -p /run/systemd && echo 'doc 7 B
<missing> 6 days ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 2.759 kB
<missing> 6 days ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 B
<missing> 6 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 745 B
<missing> 6 days ago /bin/sh -c #(nop) ADD file:b8a2c16d65e533a2bc 117.2 MB
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker run --name NewImages -it ubuntu:commit bash
root@cfa4b8cf7d2c:/# ls -l testcommit.log
-rw-r--r-- 1 root root 17 Apr 19 03:04 testcommit.log
root@cfa4b8cf7d2c:/# cat testcommit.log
this is a test !
root@cfa4b8cf7d2c:/# exit
exit
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cfa4b8cf7d2c ubuntu:commit "bash" 2 hours ago Exited (0) 6 seconds ago NewImages
ca9cb66a39ca ubuntu "bash" 2 hours ago Up 2 hours TestCommitImages
[root@CentOS-7 ~]#
[root@CentOS-7 ~]# docker logs NewImages
root@cfa4b8cf7d2c:/# ls -l testcommit.log
-rw-r--r-- 1 root root 17 Apr 19 03:04 testcommit.log
root@cfa4b8cf7d2c:/# cat testcommit.log
this is a test !
root@cfa4b8cf7d2c:/# exit
exit
[root@CentOS-7 ~]#

Docker - 生成镜像的更多相关文章

  1. 快速解决docker生成镜像时提示Could not resolve ‘archive.ubuntu.com’问题

    今天在其中一台Linux 中使用Docker命令创建镜像时失败,报错提示: Temporary failure resolving ‘archive.ubuntu.com’ 典型的DNS解析问题,尝试 ...

  2. Docker发布镜像至Docker Hub

    第一步:Docker生成镜像 docker@default:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE metal-workbench- ...

  3. 【docker】将Java jar文件生成镜像、上传镜像并生成镜像压缩文件

    概述 将Springboot的web服务打包成Jar包后,自动化脚本将jar打包成镜像.上传镜像.并生成镜像的压缩文件: Dockerfile FROM 10.254.9.21/library/ora ...

  4. docker 部署 flask(三)高级编写及生成镜像,安装requirements.txt

    简介: 上一篇,我写了如何使用别人的docker基础镜像,生成我们的docker镜像. 也就最基本的flask,没有别的库(包)支持.连数据库支持都没有. 也就让大家了解一下怎么生成镜像而已. 本篇介 ...

  5. Docker技术入门与实战 第二版-学习笔记-4-Dockerfile外其他生成镜像的方法

    其它生成镜像的方法 即除了标准地使用Dockerfile来生成镜像外,还有一些其他的方法 1)从 rootfs 压缩包导入 格式:docker import [选项] <文件>|<U ...

  6. docker 部署 flask(二)编写及生成镜像。

    简介: 上一篇文章,我们简单的测试了一下服务器环境和docker基础镜像.并没有涉及我们自己编写的flask python程序. 现在,我们就要把我们自己的flask程序,放进docker镜像. 但是 ...

  7. docker 生成mysql镜像启动时自动执行sql

    文章转载自:https://www.jianshu.com/p/12fc253fa37d 在docker 创建 mysql 容器时,往往需要在创建容器的过程中创建database 实例,代码如下: # ...

  8. Docker | 使用dockerfile生成镜像,清理docker空间

    用dockerfile生成镜像并挂载数据卷 编写dockerfile文件 创建dockerfile01 文件 # 基础镜像 FROM centos VOLUME ["volume01&quo ...

  9. Docker:镜像操作和容器操作

    镜像操作 列出镜像: $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 0a6b ...

随机推荐

  1. Map集合概述和特点

    A:Map集合概述和特点(Set底层依赖的是Map) 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 B:Map接口和Collection接口的不同 Map是双列的(是双列集 ...

  2. 我的日志文件java logger

    操作读取日志文件, 1.使用默认的日志文件,并验证默认级别 public void originalConfig() { Logger logger = Logger.getLogger(Logger ...

  3. git 远程仓库管理

    要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写.同他人协作开发某 个项目时,需要管理这些远程仓库 ...

  4. DBProxy 入门到精通系列(二):DBProxy快速入门教程

    这里主要用来了解有关DBProxy方面的部署及基本的配置,以及模拟架构 1 DBProxy方面的安装部署 1)基础环境的部署 # .x86_64 Percona-Server-client-.x86_ ...

  5. Android Doze模式启用和恢复

    从Android 6.0(API level 23)开始,Android提出了两个延长电池使用时间的省电特性给用户.用户管理可以在没有充电的情况下管理app的行为.当用户一段时间没有使用手机的时候,D ...

  6. 老李分享: JSON

    老李分享: JSON    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478, ...

  7. 老李谈HTTP1.1的长连接 1

    老李谈HTTP1.1的长连接   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  8. 在Selenium Webdriver中使用XPath Contains、Sibling函数定位

    前言 在一般情况下,我们通过简单的xpath即可定位到目标元素,但对于一些既没id又没name,而且其他属性都是动态的情况就很难通过简单的方式进行定位了. 在这种情况下,我们需要使用xpath1.0内 ...

  9. UIScrollView的布局

    一.UIScrollView的子控件布局不能跟其它的控件一样进行布局,因为UIScrollView会根据子控件计算出ContentSize的大小,那么我们应该如何进行布局呀. 遵循以下两点就行 1.参 ...

  10. DataTables源码分析(一)

    DataTables源码分析 写在前面 作为一名常年奋战在java世界中的程序猿,当我接触到现在所谓的前端技术时,内心其实是崩溃的.因为,前端的技术给我的第一个感觉就是"乱",这里 ...