1、是什么

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

构建三步骤:
1、编写Dockerfile文件
2、docker build
3、docker run
 
文件什么样???
以我们熟悉的CentOS为例

2、DockerFile构建过程解析

2.1、Dockerfile内容基础知识
1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层,并对镜像进行提交
2.2、Docker执行Dockerfile的大致流程
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
2.3、小总结
从应用软件的角度来看,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、DockerFile体系结构(保留字指令)

3.1、FROM
基础镜像,当前新镜像是基于哪个镜像的
 
3.2、MAINTAINER
镜像维护者的姓名和邮箱地址
 
3.3、RUN
容器构建时需要运行的命令
 
3.4、EXPOSE
当前容器对外暴露出的端口
 
3.5、WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
 
3.6、ENV
用来在构建镜像过程中设置环境变量

3.7、ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
 
3.8、COPY
类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
COPY src dest
COPY ["src", "dest"]
 
3.9、VOLUME
容器数据卷,用于数据保存和持久化工作
 
3.10、CMD
指定一个容器启动时要运行的命令
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
3.11、ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
 
3.12、ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
 
 
小总结

4、案例

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

4.2、自定义镜像mycentos
4.2.1、编写
Hub默认CentOS镜像什么情况
         自定义mycentos目的使我们自己的镜像具备如下:
         登陆后的默认路径
         vim编辑器
         查看网络配置ifconfig支持

准备编写DockerFile文件

myCentOS内容DockerFile2
        FROM centosMAINTAINER zzyy<zzyy167@126.com>
        ENV MYPATH /usr/localWORKDIR $MYPATH
        RUN yum -y install vimRUN yum -y install net-tools
        EXPOSE 80
        CMD echo $MYPATHCMD echo "success--------------ok"CMD /bin/bash 
4.2.2、构建
docker build -t 新镜像名字:TAG .

安装成功之后:

4.2.3、运行
docker run -it 新镜像名字:TAG
可以看到,我们自己的新镜像已经支持vim/ifconfig命令,扩展成功了。

 
4.2.4、列出镜像的变更历史
docker history 镜像名

[root@MrChengs 桌面]# docker history 774a8af7e1a5
IMAGE CREATED CREATED BY SIZE COMMENT
774a8af7e1a5 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin/b 0 B
49f67d3823f9 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo \ 0 B
6da0097c48b1 5 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo $ 0 B
68582740acb5 5 hours ago /bin/sh -c #(nop) EXPOSE 80/tcp 0 B
d382b224d129 5 hours ago /bin/sh -c yum -y install net-tools 24.17 MB
d4506485018a 5 hours ago /bin/sh -c yum -y install vim 125.7 MB
e3f551ceea22 5 hours ago /bin/sh -c #(nop) WORKDIR /usr/local 0 B
703b1f226717 5 hours ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0 B
5650d63ecf94 5 hours ago /bin/sh -c #(nop) MAINTAINER ccrr<1287221322@ 0 B
ab9a80ab07d0 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
f016d310caa9 4 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
e4b082fc6cdb 4 weeks ago /bin/sh -c #(nop) ADD file:6f877549795f4798a3 201.8 MB

 顺着加载倒着执行!!! 

4.3、CMD/ENTRYPOINT 镜像案例
4.3.1、都是指定一个容器启动时要运行的命令
4.3.2、CMD
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
Case:tomcat的讲解演示-----docker run -it -p 8888:8080 tomcat ls -l

docker run -it -p 7777:8080 tomcat ls -l
说明只是最后一行命令生效根据:DockersFile文件配置
并没有启动tomcat

4.3.3、ENTRYPOINT
docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合
命令会被追加
 
Case:
制作CMD版可以查询IP信息的容器:
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]

crul命令解释:

问题:如果我们希望显示 HTTP 头信息,就需要加上 -i 参数
WHY:
    我们可以看到可执行文件找不到的报错,executable file not found。
    之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。
    因此这里的 -i 替换了原来的 CMD,而不是添加在原来的 curl -s http://ip.cn 后面。而 -i 根本不是命令,
    所以自然找不到。
    那么如果我们希望加入 -i 这参数,我们就必须重新完整的输入这个命令:
    $ docker run myip curl -s http://ip.cn -i

制作ENTROYPOINT版查询IP信息的容器:

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

ONBUILD:

自定义镜像Tomcat9
1、mkdir -p /ccrr/mydockerfile/tomcat9
 
2、在上述目录下touch c.txt

 
3、将jdk和tomcat安装的压缩包拷贝进上一步目录

apache-tomcat-9.0.8.tar.gz
jdk-8u171-linux-x64.tar.gz
4、在/zzyyuse/mydockerfile/tomcat9目录下新建Dockerfile文件
目录内容
FROM centos
MAINTAINER zzyy<zzyybs@.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0..tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/localWORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1..0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV
CATALINA_HOME /usr/local/apache-tomcat-9.0.8ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#容器运行时监听的端口EXPOSE #启动时运行tomcat# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]CMD /usr/local/apache-tomcat-9.0./bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0./bin/logs/catalina.ou
5、构建
 
6、run
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
 
7、验证
 
8、结合前述的容器卷将测试的web服务test发布
 
 

docker-6-DockerFile解析的更多相关文章

  1. docker学习笔记-05:DockerFile解析

    一.DockerFile是什么 1.DockerFile是用来构建docker镜像的构建文件,是由一系列参数和命令构成的脚本. 2.构建三步骤: 手动编写一个dockerfile文件,然后直接dock ...

  2. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  3. Dockerfile解析(八)

    一.Dockerfile是什么 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 1. 构建的步骤 运行容器:docker run 构建新的镜像:docker ...

  4. docker关系图解析

    docker关系图解析 一.docker有5种状态 Dockerfile 文本文件,制作images的配置文件 images image,静态文件 containers container image ...

  5. 6、DockerFile解析:三步走、保留字指令

    1.dockerfiel是什么 1.是什么 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 2.构建三步骤 编写Dockerfile文件 docker bu ...

  6. dockerfile解析过程

    什么是dockerfile? DockerFile是用来构建docker镜像的文件,是由一系列命令和参数组成. 构建步骤? 1.编写dockerfile文件 2.docker build 3.dock ...

  7. 05--Docker对DockerFile解析

    一.是什么: 1.1 DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 1.2 构建步骤: 1.2.1 编写Dockerfile文件 1.2.2 docker ...

  8. docker容器dockerfile详解

    docker公司在容器技术发展中提出了镜像分层的理念,可以说也是这个革命性的理念让原本只不过是整合linux内核特性的容器,开始野蛮生长. docker通过UnionFS联合文件系统将镜像的分层实现合 ...

  9. (六)、Docker 之 Dockerfile

    1.什么是Dockerfile Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 2.Dockerfile解析过程 前提认知: 每条保留字指令都必须为大写字母 ...

  10. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境

    Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...

随机推荐

  1. nodejs的gridfs基本操作

    var mongoose = require('mongoose'); var Schema = mongoose.Schema; mongoose.connect('mongodb://127.0. ...

  2. 微信小程序初体验

    小程序最近太火,不过相比较刚发布时,已经有点热度散去的感觉,不过这不影响我们对小程序的热情,开发之前建议通读下官网文档,附链接:https://mp.weixin.qq.com/debug/wxado ...

  3. 面向对象(基础oop)之初识继承

    大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...

  4. [javaSE] 数据结构(二叉查找树-插入节点)

    二叉查找树(Binary Search Tree),又被称为二叉搜索树,它是特殊的二叉树,左子树的节点值小于右子树的节点值. 定义二叉查找树 定义二叉树BSTree,它保护了二叉树的根节点BSTNod ...

  5. 判断php变量是否定义,是否为空,是否为真的一览表

    分类: 使用 PHP 函数对变量 $x 进行比较 表达式 gettype() empty() is_null() isset() boolean : if($x) $x = ""; ...

  6. UOJ#55 [WC2014]紫荆花之恋

    题目描述 强强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这个大树实际上是一个带权树. ...

  7. CSS使用小技巧

    对于元素position 属性中的 relative absolute 页面居中问题 /* relative */div{ position:relative; margin: 0 auto}​/* ...

  8. Vue使用html2Canvas和canvas2Image下载二维码会模糊的问题解决方法

    // 下载二维码图片的方法 saveImg() { var self = this; html2canvas(document.querySelector(".savePic"), ...

  9. antd-mobile的按需加载

    "babel": { "presets": [ "react-app" ] } 主要问题是 依赖项的版本问题 以及 配置问题 新添加的con ...

  10. SSM Controller 页面之间跳转 重定向,有参 无参问题

    需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. (1)我在后台一个controller跳转 ...