docker镜像之Commit方式

20 篇文章 0 订阅

目录

1、docker镜像简介

1.1  镜像概念

 1.2  镜像技术-分层存储

2、镜像的制作方式:Commit方式

2.1  简介

2.2  制作过程

2.3  总结


1、docker镜像简介

1.1  镜像概念

       我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系 统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件 系统。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文 件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

 1.2  镜像技术-分层存储

       分层存储 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计 时,就充分利用 Union FS 的技术(前面博客已经详解过该技术),将其设计为分层存储的架构。所以严格来说,镜像并非是 像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成, 而是由一组文件系统组成,或者说,由多层文件系统联合组成。 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后 一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除 前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看 到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小 心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理 掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为 基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

  • bootfs:用于系统引导的文件系统,包括boot引导、内核,容器启动完成后会被卸载以节约内存资源。
  • rootfs:位于bootfs之上,表现为docker容器根文件系统
    • 传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式。
    • docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个可写层。

       

2、镜像的制作方式:Commit方式

2.1  简介

       注意: docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现 场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。这里仅限学习使用。

需求:启动一个centos 6.9镜像的容器,并安装好ssh服务,使得远程可以连接该容器。

步骤:

  • 下载一个centos 6.9的镜像并启动容器,安装ssh服务(默认没有安装)
  • 将安装好服务的容器使用commit提交为镜像
  • 启动新镜像来部署容器并测试该服务是否能使用

2.2  制作过程

  1. docker pull centos6.9 【下载centos 6.9镜像】
  2. docker run -d -p 1220:22 --name centos 2199b8eb8390使用centos 6.9镜像创建容器名为centos,与主机映射的端口1220:22,并在后台启动
  3. docker ps【查看是否成功,若不成功使用tail -F命令】
  4. docker exec -it 734121d6126f /bin/bash【进入刚刚创建的centos容器】
  5. curl www.baidu.com【测试是否联网,这里使用网络yum
  6. yum -y install openssh-server【yum安装ssh客户端,此处是容器联网状态下】
  7. service sshd restart 【启动服务】
  8. /etc/init.d/sshd restart 启动服务,若serivce命令不能用就这种方式启动
  9. netstat -an|grep 22 查看容器内的22端口是否监听
  10. passwd root 设置密码,否则ssh连不上容器
  11. exit 【退到宿主机进行测试连接】
  12. ssh 172.16.201.181 -p 1220 连接容器测试,IP为宿主机IP地址,-p映射 的端口,最后输入密码即可连接
  13. docker commit centos ybb01:v1 【使用commit命令创建镜像】

          centos 【要创建为镜像的容器的名字】

          ybb01:v1 【制作的镜像的名字】

  1. docker images 【查看】
  2. docker run -d -p 1000:22 --name ssh e06b075246b9 【使用新创建的镜像部署 容器,与宿主机的端口映射为1000:22】
  3. docker exec -it 734121d6126f /bin/bash 【进入容器】
  4. service sshd start//etc/init.d/sshd start 启动ssh服务】
  5. exit 【退出到宿主机】
  6. ssh 172.16.201.181 -p 1000 【连接容器测试】
  7. 完成

【慎 用 docker commit,制作完镜像,默认服务是关闭的,需启动】

2.3  总结

使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境 中并不会这样使用。 首先,如果仔细观察之前的 docker diff nginx的结果,你会发现除了安装ssh服务外,由于命令的执行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不清理,将会导致镜像极为臃肿。

此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。 这种黑箱镜像的维护工作是非常痛苦的。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44250083

微信号:c_x_y_000

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值