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

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命令,会得到相同的文案和不同的文本。如下:
    这里写图片描述
    这里写图片描述
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值