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. android studio 中由于网络问题,编译错误

    由于网络原因,需要连外网实现下载相关依赖包,导致编译失败 在 build.gradle文件中 将原来是jcenter()的地址改成 maven{ url 'http://maven.aliyun.co ...

  2. CF898A Rounding

    题意翻译 给你一个数字,将其“四舍六入”,末尾为5舍去或进位都可,求最终的数字. 题目描述 Vasya has a non-negative integer n n n . He wants to r ...

  3. MVC中学到的小知识(MVC中的跳转,传参)

    1.mvc中视图中的href="XXX",这个XXX是控制器地址,不是另一个视图.(这里的href语句只能转向控制器,不能直接转向视图),如果要实现转向视图,可以先转到控制器,然后 ...

  4. 一:SpringCloud

    一:前提知识+相关说明 前提知识:springmvc+spring/springboot+mybatis+maven+git...... cloud技术的五大神兽: 面试题: 什么是微服务? 微服务之 ...

  5. Linux下ipv6配置系列

    Linux下ipv6配置系列一:如何配置Linux系统ipv6环境 Linux下ipv6配置系列二:如何为Nginx添加ipv6模块 Linux下ipv6配置系列三:如何为Nginx配置IPv6端口监 ...

  6. eml文件解析实例,简历信息抓取工具

    先上工具效果图,如下图所示: 背景 某公司使用58同城进行人员招聘,当有应聘人员通过58同城给该公司投简历后,58同城会发送一份邮件到该公司的注册邮箱,邮件内容如上图右侧显示,主题为“应聘贵公司XXX ...

  7. IAAS,SAAS,PAAS, CaaS的区别

    来源:云计算头条微信公众号  作者:   你一定听说过云计算中的三个“高大上”的你一定听说过云计算中的三个“高大上”的概念:IaaS.PaaS和SaaS,这几个术语并不好理解.不过,如果你是个吃货,还 ...

  8. javascript 理解继承

    一.继承-通过原型实现继承 function Father() { this.FatherSkin = "yellow"; }; Father.prototype.getFathe ...

  9. 很赞的一个教程: React.js 小书

    很赞,  React.js 小书        http://huziketang.com/books/react/ 推荐阅读入门, 照着来一遍,能会个七七八八, 更多的还需要多写 import Re ...

  10. 英文版win10更新以后, 中文软件变成乱码

    原因是非Unicode程序的语言设置失效了 在区域设置里把当前系统区域设置改成"英语(美国)", 重启电脑后再改回"中文(简体, 中国)", 再重启就好了.