Docker学习笔记(三)- Dockerfile创建本地镜像

原创 2017年01月13日 15:22:24

Dockerfile创建本地镜像

本博文将会介绍在docker中,如何创建本地镜像。内容包括,编写Dockerfile文件,从编写的Dockerfile创建镜像,镜像创建的过程解析,运行所创建的镜像。

Dockerfile是用来创建自定义的image,包含了一条条指令,每条指令对应LINUX下的一条命令,Docker程序将这些指令翻译为真正的LINUX命令。有了Dockerfile,当我们需要自定义进行其他修改的时候,直接修改Dockerfile,重新生成镜像文件,省去了敲命令的麻烦。

官方的Dockerfile参考Dockerfile References

Step1 编写Dockerfile文件

1.创建一个新的路径mydockerbuild,Ubuntu使用mkdir , Windows使用md

root@mingchen-HP:~# mkdir mydockerbuild

2.切换到新的目录中

root@mingchen-HP:~# cd mydockerbuild/
root@mingchen-HP:~/mydockerbuild# 

3.创建并编辑命名为Dockerfile的新文件,Linux,Mac使用比如nano 或vi, vim等进行编辑, windows使用noteapd。

root@mingchen-HP:~/mydockerbuild# nano Dockerfile

4.添加FROM声明,如下:

FROM docker/whalesay:latest

FROM关键字告诉docker将要创建镜像的基础镜像。此处的基础镜像为当前最新版本的whalesay镜像,此镜像已经包含了cossay程序,我们将从此程序开始。

5.添加RUN声明,将会把fortunes程序添加到镜像:

RUN apt-get -y update && apt-get install -y fortunes

whalesay镜像是基于Ubuntu,因此我们使用apt-get来安装程序fortunes

6.添加CMD声明,此声明告诉镜像当环境设置好后,最后的运行命令。下面的命令运行fortune -a

CMD /usr/games/fortune -a | cowsay

7.检查输入的命令,Dockerfile应该像下面这样

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

注意,对于初次使用nano编辑器的朋友,保存- Ctrl+O, 退出-Ctrl+X ,输入想要保存的文件名后,再回车确定就会退出nano编辑器了。用 gedit, vim, vi等编辑器也可以,sudo权限进入。

Step2 从Dockerfile文件创建镜像

当在mydockerbuild路径下的时候,使用docker build 命令:

$ docker build -t docker-whale .

囧:本来以为会顺利通过build,结果遇到了bug,期间有过各种尝试,浏览了绝大部分能够google到的问题相关的post,但就是不明白其他大部分人能够解决,而我的解决不了,当然也看到有人回复不能解决的, github的一个用户就吐艚“Heartbroken, I’ve been fighting with this porblem off and on for weeks!“

如果在这一步顺利通过了的话,那祝贺!
如果在这一步遇到了问题的话,报错了,比如我,也很正常。我遇到了问题,前前后后弄了大概一周了,我主要遇到了两个问题。解决了第一个问题后,才发现还有第二个问题出现了。

  • 第一个,上面的Dockerfile,命令执行的时候实际是进入容器里面的,可以在终端的输出里看到,一连串小写字母和数字就是容器的ID,---> Running in 21aac36e6265所以实际问题是容器内部不能连到外网,ping 外部网络不通,我把这个问题曾经发布到了Docker Community Forums, 期待大神指引,有个用户回复了,并没有解决,后来我自己解决了,刚才已经把解决的办法发布到了问题的最下面,我的那个链接是,Communication between containers and wider world , 对于英文不是很ok的同学,我会在下一篇博客里面单独的把这个问题写出来。上面的第二条命令中有 apt-get install, 需要容器能够连到外网,所以这会出问题;
  • 第二个,报错Hash sum mismatch ,这个问题的解决办法比较多,因为引起此错误的原因也很多,比如 apt源的设置,apt cache的清除,apt 的版本不同而导致的bug, 代理服务器proxy的设置,服务器与本地的时间timestamp不同,etc. 我会在接下来的博客中都写出来。
  • 很囧,这两个错误弄的很心累。鉴于篇幅问题,我就不在这一篇博客里面详细说了,这一篇的主题还是Dockerfile创建本地镜像

Normally, 终端的输出应该如下:

mingchen@mingchen-HP:~/mydockerbuild$ sudo docker build -t docler-whale .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM docker/whalesay:latest
 ---> 6b362a9f73eb
Step 2 : ENV DEBIAN_FRONTEND noninteractive
 ---> Running in f251aa390321
 ---> daa3f0eb1eff
Removing intermediate container f251aa390321
Step 3 : RUN sed -i "s|http://archive.ubuntu.com|http://mirrors.163.com|g" /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && apt-get -y update && apt-get install -y fortunes
 ---> Running in 84874f888414
Ign http://mirrors.163.com trusty InRelease
Get:1 http://mirrors.163.com trusty-updates InRelease [65.9 kB]
Get:2 http://mirrors.163.com trusty-security InRelease [65.9 kB]
Get:3 http://mirrors.163.com trusty Release.gpg [933 B]
Get:4 http://mirrors.163.com trusty-updates/main Sources [480 kB]
Get:5 http://mirrors.163.com trusty-updates/restricted Sources [5921 B]
Get:6 http://mirrors.163.com trusty-updates/universe Sources [216 kB]
Get:7 http://mirrors.163.com trusty-updates/main amd64 Packages [1172 kB]
Get:8 http://mirrors.163.com trusty-updates/restricted amd64 Packages [20.4 kB]
Get:9 http://mirrors.163.com trusty-updates/universe amd64 Packages [507 kB]
Get:10 http://mirrors.163.com trusty Release [58.5 kB]
Get:11 http://mirrors.163.com trusty-security/main Sources [157 kB]
Get:12 http://mirrors.163.com trusty-security/restricted Sources [4621 B]
Get:13 http://mirrors.163.com trusty-security/universe Sources [55.9 kB]
Get:14 http://mirrors.163.com trusty-security/main amd64 Packages [711 kB]
Get:15 http://mirrors.163.com trusty-security/restricted amd64 Packages [17.0 kB]
Get:16 http://mirrors.163.com trusty-security/universe amd64 Packages [193 kB]
Get:17 http://mirrors.163.com trusty/main Sources [1335 kB]
Get:18 http://mirrors.163.com trusty/restricted Sources [5335 B]
Get:19 http://mirrors.163.com trusty/universe Sources [7926 kB]
Get:20 http://mirrors.163.com trusty/main amd64 Packages [1743 kB]
Get:21 http://mirrors.163.com trusty/restricted amd64 Packages [16.0 kB]
Get:22 http://mirrors.163.com trusty/universe amd64 Packages [7589 kB]
Fetched 22.3 MB in 1min 35s (234 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  fortune-mod fortunes-min librecode0
Suggested packages:
  x11-utils bsdmainutils
The following NEW packages will be installed:
  fortune-mod fortunes fortunes-min librecode0
0 upgraded, 4 newly installed, 0 to remove and 92 not upgraded.
Need to get 1961 kB of archives.
After this operation, 4817 kB of additional disk space will be used.
Get:1 http://mirrors.163.com/ubuntu/ trusty/main librecode0 amd64 3.6-21 [771 kB]
Get:2 http://mirrors.163.com/ubuntu/ trusty/universe fortune-mod amd64 1:1.99.1-7 [39.5 kB]
Get:3 http://mirrors.163.com/ubuntu/ trusty/universe fortunes-min all 1:1.99.1-7 [61.8 kB]
Get:4 http://mirrors.163.com/ubuntu/ trusty/universe fortunes all 1:1.99.1-7 [1089 kB]
Fetched 1961 kB in 13s (148 kB/s)
Selecting previously unselected package librecode0:amd64.
(Reading database ... 13116 files and directories currently installed.)
Preparing to unpack .../librecode0_3.6-21_amd64.deb ...
Unpacking librecode0:amd64 (3.6-21) ...
Selecting previously unselected package fortune-mod.
Preparing to unpack .../fortune-mod_1%3a1.99.1-7_amd64.deb ...
Unpacking fortune-mod (1:1.99.1-7) ...
Selecting previously unselected package fortunes-min.
Preparing to unpack .../fortunes-min_1%3a1.99.1-7_all.deb ...
Unpacking fortunes-min (1:1.99.1-7) ...
Selecting previously unselected package fortunes.
Preparing to unpack .../fortunes_1%3a1.99.1-7_all.deb ...
Unpacking fortunes (1:1.99.1-7) ...
Setting up librecode0:amd64 (3.6-21) ...
Setting up fortune-mod (1:1.99.1-7) ...
Setting up fortunes-min (1:1.99.1-7) ...
Setting up fortunes (1:1.99.1-7) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
 ---> 746e8b0e3ebb
Removing intermediate container 84874f888414
Step 4 : CMD /usr/games/fortune -a | cowsay
 ---> Running in bcf0fb436960
 ---> 4506ff33e5ba
Removing intermediate container bcf0fb436960
Successfully built 4506ff33e5ba

看到最后一句 Successfully built , 应该会感到世界还是美好的!官网的文档,虽然基本不会有神马问题,但是真的只是参考。-_-||

Step3 解读镜像的build过程

  • docker确认build过程中所必须的代码,也就是最最基础的能够撑起一个build过程的code。终端则会输出如下
    Sending build context to Docker daemon 2.048 kB
  • docker检查我们将要使用的基础镜像是否存在于本地,如果有的话,直接使用,如果没有的话,则 pulls it from Docker
    hub。这里使用的镜像是前文已经下载好的。
    Step 1 : FROM docker/whalesay:latest --->
    6b362a9f73eb

    这里的这一串字符就是当前容器的这一层的ID,每次执行命令后,不同层的ID不一样。类比千层饼,大家理解容器的基础镜像就是经过每一步的修改后就是一层层叠加的,不同层的ID不同。
  • 接下来,设定容器的运行环境,并且执行RUN的命令:

    Step 2 : ENV DEBIAN_FRONTEND noninteractive ---> Running in
    f251aa390321 ---> daa3f0eb1eff Removing intermediate container
    f251aa390321 Step 3 : RUN sed -i
    "s|http://archive.ubuntu.com|http://mirrors.163.com|g"
    /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && apt-get -y
    update && apt-get install -y fortunes ---> Running in 84874f888414
    Ign http://mirrors.163.com trusty InRelease Get:1
    http://mirrors.163.com trusty-updates InRelease [65.9 kB] Get:2
    http://mirrors.163.com trusty-security InRelease [65.9 kB] Get:3
    http://mirrors.163.com trusty Release.gpg [933 B]
    …… (中间太长,省略了。完整的见上面的Step2)
    Setting up
    fortunes-min (1:1.99.1-7) ... Setting up fortunes (1:1.99.1-7) ...
    Processing triggers for libc-bin (2.19-0ubuntu6.6) ... --->
    746e8b0e3ebb Removing intermediate container 84874f888414

  • 最后,通过Dockerfile创建的一个新的容器(镜像的运行实例)生成:

    bcf0fb436960  ---> 4506ff33e5ba Removing intermediate container
    bcf0fb436960 Successfully built 4506ff33e5ba
    

Step4 运行新生成的Dockerfile

  • 通过sudo docker images 查看所有的镜像:

这里写图片描述

  • 运行刚才生成的镜像 docker-whale:
    这里写图片描述
    Bravo! 如果显示了这样的docker logo以及文本,则说明通过Dockerfile新建的本地镜像成功了。
  • 运行多次RUN命令,会得到相同的文案和不同的文本。如下:
    这里写图片描述
    这里写图片描述
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Chenming_Hnu/article/details/54408998

利用Dockerfile创建镜像并生成容器

创建Dockerfile(以mysql 5.7为例) 可以从Docker Hub上下载官方Dockerfile,以及docker-entrypoint.sh Dockerfile内容如下:FROM...
  • Care_sQueendom
  • Care_sQueendom
  • 2016-12-21 23:44:18
  • 4072

怎样用Docker创建我们自己的镜像

官方文档Docker创建镜像总共有两种方法: 1.用别人的镜像创建。 1.1、先下载一个容器 命令: docker pull training/sinatra ...
  • shiqiangdexin
  • shiqiangdexin
  • 2016-09-08 15:42:42
  • 18369

docker学习笔记4.1-使用Dockerfile文件构建镜像

构建镜像有两种方法 使用docker commit命令 使用dockerfile文件构建镜像 commit 类似于git的提交命令,但是不够灵活,应用范围不够广泛,所以在这里只介绍第二种,有兴趣大家...
  • qq_32907349
  • qq_32907349
  • 2016-05-28 12:09:36
  • 2129

Docker学习笔记(3)-- 如何使用Dockerfile构建镜像

原文地址:http://blog.csdn.net/we_shell/article/details/38445979 Dockfile是一种被Docker程序解释的脚本,Dockerf...
  • qinyushuang
  • qinyushuang
  • 2015-01-31 17:48:15
  • 133690

Dockerfile 创建 tomcat 镜像

Dockerfile创建Tomcat镜像一、编写Dockerfile文件下图中的channel是我自己公司所用到的,它只是普通的tomcat,只是我丢了一个ROOT.war包进去,大家也可以使用默认的...
  • wanglei_storage
  • wanglei_storage
  • 2015-09-21 15:19:59
  • 1242

使用Dockerfile创建docker镜像

使用Dockerfile创建docker镜像
  • rznice
  • rznice
  • 2016-08-15 15:28:40
  • 29004

如何使用Dockerfile构建镜像

原文地址:http://blog.csdn.NET/we_shell/article/details/38445979Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条...
  • l19901215
  • l19901215
  • 2017-02-21 19:50:09
  • 1224

Docker容器学习梳理-Dockerfile构建镜像

在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低。所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其...
  • sqzhao
  • sqzhao
  • 2017-05-07 03:51:09
  • 834

Docker教程:镜像构建和自动镜像构建dockerfile

http://blog.csdn.net/pipisorry/article/details/50805379 Docker透过Dockerfile来记录建立Container映象文件的每一个步...
  • pipisorry
  • pipisorry
  • 2016-03-04 21:05:21
  • 12603

Docker学习记录(二)-Dockerfile创建镜像

Docker学习记录(二)-Dockerfile创建镜像标签(空格分隔): docker 个人独立博客: http://mrdear.cn 本文学习Dcokerfile的基本命令,并且创建一个支持...
  • u012706811
  • u012706811
  • 2017-04-02 10:11:29
  • 1161
收藏助手
不良信息举报
您举报文章:Docker学习笔记(三)- Dockerfile创建本地镜像
举报原因:
原因补充:

(最多只允许输入30个字)