docker commit使用示例

我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动。

$ docker diff webserver
C /root
A /root/.bash_history
C /run
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp

现在我们定制好了变化,我们希望能将其保存下来形成镜像。

要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit 的语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

我们可以用下面的命令将容器保存为镜像:

$ docker commit \--author "Tao Wang <twang2218@gmail.com>" \--message "修改了默认网页" \webserver \nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214

其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。

我们可以在 docker image ls 中看到这个新定制的镜像:

$ docker image ls nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v2                  07e334659748        9 seconds ago       181.5 MB
nginx               1.11                05a60462f8ba        12 days ago         181.5 MB
nginx               latest              e43d811ce2f4        4 weeks ago         181.5 MB

我们还可以用 docker history 具体查看镜像内的历史记录,如果比较 nginx:latest 的历史记录,我们会发现新增了我们刚刚提交的这一层。

$ docker history nginx:v2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
07e334659748        54 seconds ago      nginx -g daemon off;                            95 B                修改了默认网页
e43d811ce2f4        4 weeks ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon    0 B
<missing>           4 weeks ago         /bin/sh -c #(nop)  EXPOSE 443/tcp 80/tcp        0 B
<missing>           4 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx/   22 B
<missing>           4 weeks ago         /bin/sh -c apt-key adv --keyserver hkp://pgp.   58.46 MB
<missing>           4 weeks ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.11.5-1   0 B
<missing>           4 weeks ago         /bin/sh -c #(nop)  MAINTAINER NGINX Docker Ma   0 B
<missing>           4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:23aa4f893e3288698c   123 MB

新的镜像定制好后,我们可以来运行这个镜像。

docker run --name web2 -d -p 81:80 nginx:v2

这里我们命名为新的服务为 web2,并且映射到 81 端口。访问 http://localhost:81 看到结果,其内容应该和之前修改后的 webserver 一样。

至此,我们第一次完成了定制镜像,使用的是 docker commit 命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。

慎用 docker commit

使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。

首先,如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,将会导致镜像极为臃肿。

此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。这种黑箱镜像的维护工作是非常痛苦的。

而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

参考链接:https://www.kancloud.cn/docker_practice/docker_practice/469784

使用docker commit将修改后的容器保存为镜像及其使用注意事项相关推荐

  1. docker 容器保存为镜像_Docker容器和镜像操作

    前言 Docker 容器和镜像操作,记录下来! 容器 创建一个新的容器(ubuntu)并启动 $ docker run -dit --name ubuntu ubuntu 在容器内执行命令(容器在后台 ...

  2. docker如何将运行中的容器保存为docker镜像?

    答: 使用docker commit和docker save保存镜像 $ sudo docker commit <当前运行的container id> <仓库名称>:<t ...

  3. nc63修改后点击保存没有反应(新增的数据可以,老数据不行)

    我遇到的情况是数据库有老数据,这写老数据是其他节点写入的,导入的时候,由于组织和集团的pk写反了,所以导致老数据无法修改后保存但是新增的可以,这个时候update一下就好了,

  4. OpenGLES(八)GPUImage滤镜链与将滤镜修改后的图片保存到相册

    1.滤镜链 在一个复合滤镜中,多种滤镜效果处理时,通常都是图片 -> 设置顶点/纹理坐标 -> 滤镜效果处理 -> 帧缓冲区 -> 新的纹理 -> 滤镜效果处理 -> ...

  5. mysql容器保存为镜像实战操作(拷贝方法)

    如果"容器A"与宿主机进行了目录挂载,并且"容器A"中存在大量的数据库表的话,使用该"容器A"去保存为"镜像A",并去创 ...

  6. 我的docker随笔26:制作arm平台的python-pandas镜像

    需求: 构建 arm (linux_armv7l) 平台上用于测试机器训练的 python 镜像,带 numpy. pandas.sklearn,等. 本文构建所用操作系统为 ubuntu 16.04 ...

  7. Docker 容器里镜像的迁移,或者将修改后的新的容器重新做成一个镜像

    ----继上次docker制作nginx容器... [Docker  容器里镜像的迁移,或者将修改后的新的容器重新做成一个镜像,] 1.进入容器里nginx镜像里. 2.写测试内容到nginx的默认首 ...

  8. 通过容器提交镜像(docker commit)以及推送镜像(docker push)笔记

    在本地创建一个容器后,可以依据这个容器创建本地镜像,并可把这个镜像推送到Docker hub中,以便在网络上下载使用. 查看镜像 [root@docker-test1 ~]# docker image ...

  9. docker commit (从容器创建一个新的镜像)

    从容器创建一个新的镜像 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] -a :提交的镜像作者:-c :使用Dockerfile指令来创建镜像 ...

最新文章

  1. iPhone销售增长50%,净利润增长93%,但苹果股价还是跌了
  2. Mopaas 初体验
  3. http网址捆綁代理php_PHP获取IP,HTTP代理问题
  4. LeetCode-动态规划基础题-63. 不同路径II
  5. Martix工作室考核题 —— 2019-3-8 第三题
  6. CSS快速入门-箭头和图标
  7. 你觉得一个人有几个手机号合适?
  8. Zygo保存zxg(Zemax File)文件(光学领域知道Zygo的一定要看)
  9. 初识PowerShell
  10. mysql中替代 =_SELECT * WHERE var == [MySQL中的许多替代方法之一]?
  11. cad2020 开始_中望cad2020发布,附简体中文免费版安装教程
  12. 数据库多表查询关联查询SQL语句
  13. 一个简易的QQ魔法卡片炼卡消耗计算器
  14. android toast 怎么用,Android学习 Android Toast的使用
  15. 阿里云云平台的物理安全防御措施
  16. facebook登录和分享
  17. 入股不亏的文案编辑工具
  18. 万字长文Python面试题,年后找工作就靠这了
  19. index ffs、index fs原理考究-1109
  20. 用python3根据配置自动生成自定义图片logo(一键解决图片侵权困扰)

热门文章

  1. vs中imshow函数报错_opencv编程:8 imshow不显示图像和waitkey函数
  2. 趣学python3(32)-enumerate,zip
  3. 牛客多校三 B Black and white
  4. AGC002E Candy Piles
  5. 【机器学习】5行代码在小数据集上涨点
  6. 【NLP】如何清理文本数据?
  7. 【学术相关】10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
  8. 【NLP】使用Google的T5提取文本特征
  9. 复现经典:《统计学习方法》第22章 无监督学习方法总结
  10. 目前看的图神经网络(GNN)论文的一些总结