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. 深入辨析jvm内存区域

    Java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域: 程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运行时常量池).直接内存 程序计数器 当 ...

  2. JAVA基础之——Thrift原理及应用

    1 是什么 是为了解决facebook系统中各系统间大数据量的传输通信,以及系统之间语言环境不同需要跨平台的问题. 是一种实现RPC的软件框架,自定义IDL(Interface description ...

  3. 系统分析与设计 homework2

    1. 简述瀑布模型.增量模型.螺旋模型(含原型方法)的优缺点. 瀑布模型 优点: 降低了软件开发的复杂度,提高软件开发过程中的透明性,提高软件开发的可管理性. 为项目提供了按阶段划分的检查点. 当前一 ...

  4. Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    一.枚举简介 1.什么是枚举? 需要在一定范围内取值,这个值只能是这个范围内中的任意一个 现实场景:交通信号灯,有三种颜色,但是每次只能亮三种颜色里面的任意一个 2.使用一个关键字 enum enum ...

  5. String拾遗

    简介: String作为日常最常用的类,还是有必要对其中的细节做一些了解的,这篇就结合源码来看看这个常用的类. 一. 总述 类图如下: 从图中可以看到String是实现了 java.io.Serial ...

  6. Java注解拾遗

    注解简介: 注解Annotation是jdk1.5的新增功能,在现在的日常开发中,几乎离不开注解,写篇短文,来做个拾遗. 注解作用: Annotation(注解)的作用是修饰包.类.构造方法.方法.成 ...

  7. 由上一个血案引发的关于property和attribute关系的思考

    boss说,学习要刨根问底. 好的,开刨. 一.property和attribute在英语里有什么区别 看似没有区别.但其实大神说: property是 物体本身自带属性,不能改变的(一旦改了就是另外 ...

  8. POJ P2828 Buy Ticket——线段树的其他信息维护

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  9. 关于MyEclipse2017Ci10版本的破解和Tomcat9.0的安装搭配使用

    昨天和今天就忙这两件事情了.废话不多说直接上干货! 首先是关于Myeclipse2017的破解,关于这个破解,网上的资源和文件很多,可以自行下载,我就不贴链接了. 我要说的是破解的问题,在这里我们要注 ...

  10. drupal7 转化 public:// 为实际url

    file_create_url('public://xxx.png'); // 得到URL drupal_realpath('public://xxx.png'); // 得到系统路径(磁盘路径,如D ...