设为首页 收藏本站
查看: 1143|回复: 0

[经验分享] 6、《每天5分钟玩转Docker容器技术》学习-构建镜像

[复制链接]

尚未签到

发表于 2019-2-22 07:48:25 | 显示全部楼层 |阅读模式
  ------------------------------------重要说明------------------------------------
  本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
  原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
  https://blog.运维网.com/cloudman
  ------------------------------------重要说明------------------------------------
  对于 Docker 用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的数据库、中间件、应用软件等都有现成的 Docker 官方镜像或其他人和组织创建的镜像,我们只需要稍作配置就可以直接使用。
  使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验。特别是使用那些官方镜像,因为 Docker 的工程师知道如何更好的在容器中运行软件。
  当然,某些情况下我们也不得不自己构建镜像,比如:
  1、 找不到现成的镜像,比如自己开发的应用程序。
  2、 需要在镜像中加入特定的功能,比如官方镜像几乎都不提供 ssh。
  Docker 提供了两种构建镜像的方法:
  1、 docker commit 命令
  2、 Dockerfile 构建文件
一、 docker commit
  docker commit 命令是创建新镜像最直观的方法,其过程包含三个步骤:
  1、 运行容器
  2、 修改容器
  3、 将容器保存为新的镜像
  举个例子:在 ubuntu base 镜像中安装 vi 并保存为新镜像。
1) 第一步,运行容器


  -it 参数的作用是以交互模式进入容器,并打开终端。29d889b3d221 是容器的内部 ID。
  --name参数的作用给container一个名字
2) 步,安装 vim
  确认 vi m没有安装。

  安装 vim

3) 步,保存为新镜像
  在新窗口中查看当前运行的容器。

  test 是通过--name制定的名字。
  如果不加此参数Docker会为容器随机分配的名字。
  执行 docker commit 命令将容器保存为镜像。

  新镜像命名为 centos_vim_test
  查看新镜像的属性

  镜像因为安装了软件而变大了
  重新镜像启动容器,验证 vim 已经可以使用。


4) 注意
  以上演示了如何用 docker commit 创建新镜像。然而,Docker 并不建议用户通过这种方式构建镜像。原因如下:
  1、 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
  2、 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。
  既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?
  原因是:即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。
二、dockerfile构建镜像
  Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。
1) 第一个 Dockerfile
  用 Dockerfile 创建 centos_vim_test,其内容则为:


  下面我们运行 docker build 命令构建镜像并详细分析每个细节。
  Docker build -t centos_vim_test01 .
  构建名字为centos_vim_test01的镜像。

  ① 当前目录为 /root/dockerfile/centos_vim_test。

  ② Dockerfile 准备就绪。

  ③ 运行 docker build 命令,-t 将新镜像命名为 centos_vim_test,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。

  ④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。
  所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。

  ⑤ Step 1:执行 FROM,将 centos 作为 base 镜像。
  centos 镜像 ID 为 2d194b392dd1。

  ⑥ Step 2:执行 RUN,安装 vim,具体步骤为 ⑦、⑧、⑨。

  ⑦ 启动 ID 为 d13dc4b1578e 的临时容器,在容器中通过 yum 安装 vim。

  ⑧ 安装成功后,将容器保存为镜像,其 ID 为 e31b16131276。
  这一步底层使用的是类似 docker commit 的命令

  ⑨ 删除临时容器 d13dc4b1578e。

  ⑩ 镜像构建成功。
  通过 docker images 查看镜像信息

  像 ID 为 e31b16131276,与构建时的输出一致。
  在上面的构建过程中,我们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操作,并通过 commit 保存为新的镜像。
  我们进入容器当中,验证我们在Dockerfile中的RUN的echo命令是否执行

  可以看到我们的echo命令是执行的,所以可以在Dockerfile中使用RUN命令进行安装软件包,或执行一些固定的命令
2) 查看镜像分层结构
  centos_vim_test 是通过在 base 镜像的顶部添加一个新的镜像层而得到的。
  这个新镜像层的内容由 RUN yum install -y vim && echo "Tish is centos test !!!" >> /root/centos_vim_test 生成。这一点我们可以通过 docker history 命令验证。

  ------------------------------------重要说明------------------------------------
  本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
  原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
  https://blog.运维网.com/cloudman
  ------------------------------------重要说明------------------------------------
  书籍:
  1.《每天5分钟玩转Kubernetes》
  https://item.jd.com/26225745440.html
  2.《每天5分钟玩转Docker容器技术》
  https://item.jd.com/16936307278.html
  3.《每天5分钟玩转OpenStack》
  https://item.jd.com/12086376.html



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675497-1-1.html 上篇帖子: 5、《每天5分钟玩转Docker容器技术》学习--Docker镜像 下篇帖子: 7、《每天5分钟玩转Docker容器技术》学习-Dockerfile 常用指令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表