Docker学习笔记(六)——Docker File解析

1. docker file是什么

  • 定义:Docker file是用来构建Docker镜像的构建文件,是由一系列的命令和参数构成的脚本。

  • 构建三步骤

  1. 编写Dockerfile文件
  2. docker build
  3. docker run
  • docker file长什么样
    可以在docker hub上随意搜一下,然后点开一个详细的版本就可以看到,比如centos7.0的docker file。

2. docker file构建过程解析

  • docker file的基础知识
  1. 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
  2. 指令按照从上到下顺序执行
  3. "#"表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
  • Docker 执行docker file的大致流程
  1. docker从基础镜像运行一个容器(scratch是祖先镜像)
  2. 执行一条指令并对容器作出修改
  3. 执行类似于docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行Dockerfile中的下一条指令,知道所有指令都完成
  • 小结:从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

Dockerfile是软件的原材料

Docker镜像是软件的交付品

Docker容器则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。


三者关系
  1. Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。

  2. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

  3. Docker容器,容器是直接提供服务的。

3. docker file保留字指令

保留字 作用
From 基础镜像,当前的新镜像是基于那个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认的登录进来的工作目录
ENV 用在构建镜像过程中是设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且add命令会自动处理URL和解压tar压缩包
COPY 类似于ADD,拷贝文件和目录到镜像中,不会执行解压缩,没有ADD功能强大
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定容器启动时要运行的命令
ENTRYPOINT 指定容器启动时要运行的命令
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild触发
命令小结

4. docker file保留字案例演示

base镜像(scratch):Docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的


实例一:自定义centos镜像

由于从阿里云上pull下来的centos镜像只有精简的内核,连vim和ifconfig都不能使用,下面这个实例,运用上面的docker file保留字,重写一个centos镜像,做出的改变有:

  1. 改变登录后的默认路径
  2. 支持vim编译器
  3. 可以使用ifconfig查看网络配置

三步走

  1. 编写docker file,内容如下


    docker file内容
  2. 构建新的镜像


    构建新镜像

    查看构建好的镜像
  3. 运行新镜像


    运行新镜像

可以看到,新的镜像的默认落脚点变成了/usr/local,而不是root根目录。而且也可以使用vim工具和查看网络配置。


vim和网络配置

Tip:可以使用docker history [容器ID]来查看镜像的变更历史,需要注意的是,该指令是镜像的指令,不要错误的使用容器ID。(尴尬脸)

镜像变更历史

上图可以发现,镜像是一层一层的网上叠加的,最后暴露的是ID为ced67ba4365b的镜像。


实例2:CMD和ENTRYPOINT的区别

根据其定义,两者都是启动一个容器时运行的命令,但是具有以下区别

区别1:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

区别2:ENTRYPOINT启动容器时,docker run 之后的参数会被当作参数传递给ENTRYPOINT,然后形成新的命令组合

区别一实例:以启动tomcat为例,tomcat的部分docker file如下:

tomcat默认落脚点

tomcat最后的CMD命令

在运行tomcat时一般会使用docker run -it -p 7777:8080 tomcat,这时会执行tomcat的docker file的最后一条CMD:CMD ["catalina.sh", "run"],但是如果运行tomcat时使用的命令是docker run -it -p 7777:8080 tomcat ls -l,就相当于在最后一条CMD后加了一个CMD ls -l /usr/local/tomcat
CMD的命令覆盖

可以看到,执行完之后确实把/usr/local/tomcat下的文件列了出来,但是tomcat容器并没有启动,这是因为CMD ["catalina.sh", "run"]被新添加的CMD给覆盖了。

区别二实例:制作CMD版可以查询IP信息的centos容器

  1. 编写一个docker file

FROM centos

RUN yum install -y curl

CMD [ "curl", "-s", "http://cip.cc" ]

  1. build docker file


    创建ipcentos镜像
  2. run ipcentos

    运行时打印出ip

    这时,以docker run ipcentos -i来执行就会报一下错误
    error

    这种情况就是在docker file的最后一条CMDCMD [ "curl", "-s", "http://cip.cc" ]后面又添加一个CMD -i。所以会覆盖上一个CMD,产生错误。

下面使用ENTRYPOINT来解决CMD命令覆盖:

直接把上面的dockerfile的CMD改成ENTRYPOINT,按照上述流程再运行一遍:

修改成ENTRYPOINT运行

可以看到,-i参数也被正确执行,打印出了HTTP报文头。所以,使用ENTRYPOINT相当于在CMD [ "curl", "-s", "http://cip.cc" ]中追加参数-i,变为CMD [ "curl", "-s", "-i" "http://cip.cc" ]

5.小结
小结
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343