浙江雁荡山 发表于 2019-2-22 07:48:25

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

  ------------------------------------重要说明------------------------------------
  本文内容都是参考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) 第一步,运行容器
https://s1.运维网.com/images/20180403/1522765913512288.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180403/1522765924411201.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  -it 参数的作用是以交互模式进入容器,并打开终端。29d889b3d221 是容器的内部 ID。
  --name参数的作用给container一个名字
2) 第二步,安装 vim
  确认 vi m没有安装。
https://s1.运维网.com/images/20180403/1522765955477166.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  安装 vim
https://s1.运维网.com/images/20180403/1522765989119822.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
3) 第二步,保存为新镜像
  在新窗口中查看当前运行的容器。
https://s1.运维网.com/images/20180403/1522766007497985.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  test 是通过--name制定的名字。
  如果不加此参数Docker会为容器随机分配的名字。
  执行 docker commit 命令将容器保存为镜像。
https://s1.运维网.com/images/20180403/1522766042844022.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  新镜像命名为 centos_vim_test。
  查看新镜像的属性
https://s1.运维网.com/images/20180403/1522766065698948.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  镜像因为安装了软件而变大了
  重新镜像启动容器,验证 vim 已经可以使用。
https://s1.运维网.com/images/20180403/1522766087634961.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180403/1522766097284254.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
4) 注意
  以上演示了如何用 docker commit 创建新镜像。然而,Docker 并不建议用户通过这种方式构建镜像。原因如下:
  1、 这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在 debian base 镜像中也加入 vi,还得重复前面的所有步骤。
  2、 更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。
  既然 docker commit 不是推荐的方法,我们干嘛还要花时间学习呢?
  原因是:即便是用 Dockerfile(推荐方法)构建镜像,底层也 docker commit 一层一层构建新镜像的。学习 docker commit 能够帮助我们更加深入地理解构建过程和镜像的分层结构。
二、dockerfile构建镜像
  Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。
1) 第一个 Dockerfile
  用 Dockerfile 创建 centos_vim_test,其内容则为:
https://s1.运维网.com/images/20180403/1522766188196257.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180403/1522766197460838.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  下面我们运行 docker build 命令构建镜像并详细分析每个细节。
  Docker build -t centos_vim_test01 .
  构建名字为centos_vim_test01的镜像。
https://s1.运维网.com/images/20180403/1522766217164773.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ① 当前目录为 /root/dockerfile/centos_vim_test。
https://s1.运维网.com/images/20180403/1522766482670855.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ② Dockerfile 准备就绪。
https://s1.运维网.com/images/20180403/1522766502241969.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ③ 运行 docker build 命令,-t 将新镜像命名为 centos_vim_test,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。
https://s1.运维网.com/images/20180403/1522766521631851.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=https://s1.运维网.com/images/20180403/1522766525709167.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。
  所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。
https://s1.运维网.com/images/20180403/1522766546802822.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ⑤ Step 1:执行 FROM,将 centos 作为 base 镜像。
  centos 镜像 ID 为 2d194b392dd1。
https://s1.运维网.com/images/20180403/1522766566495670.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ⑥ Step 2:执行 RUN,安装 vim,具体步骤为 ⑦、⑧、⑨。
https://s1.运维网.com/images/20180403/1522766580600035.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ⑦ 启动 ID 为 d13dc4b1578e 的临时容器,在容器中通过 yum 安装 vim。
https://s1.运维网.com/images/20180403/1522766598816539.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ⑧ 安装成功后,将容器保存为镜像,其 ID 为 e31b16131276。
  这一步底层使用的是类似 docker commit 的命令。
https://s1.运维网.com/images/20180403/1522766625713013.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ⑨ 删除临时容器 d13dc4b1578e。
https://s1.运维网.com/images/20180403/1522766639704587.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ⑩ 镜像构建成功。
  通过 docker images 查看镜像信息
https://s1.运维网.com/images/20180403/1522766656809432.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  像 ID 为 e31b16131276,与构建时的输出一致。
  在上面的构建过程中,我们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操作,并通过 commit 保存为新的镜像。
  我们进入容器当中,验证我们在Dockerfile中的RUN的echo命令是否执行
https://s1.运维网.com/images/20180403/1522766670671059.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  可以看到我们的echo命令是执行的,所以可以在Dockerfile中使用RUN命令进行安装软件包,或执行一些固定的命令。
2) 查看镜像分层结构
  centos_vim_test 是通过在 base 镜像的顶部添加一个新的镜像层而得到的。
  这个新镜像层的内容由 RUN yum install -y vim && echo "Tish is centos test !!!" >> /root/centos_vim_test 生成。这一点我们可以通过 docker history 命令验证。
https://s1.运维网.com/images/20180403/1522766699480118.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
  ------------------------------------重要说明------------------------------------
  本文内容都是参考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
https://i.imgsafe.org/68/68da21ce15.png

页: [1]
查看完整版本: 6、《每天5分钟玩转Docker容器技术》学习-构建镜像