1、DockerFile是什么?
是用来构建Docker镜像的构建文件,由一系列参数和命令构成的脚本关系:![]()
2、DockerFile的三步构建步骤?
1.编写:手动编写dockerfile文件,一定要符合file的规范,DockerFile,文件名就是:Dockerfile2.构建:有了这个文件后,直接docker build执行获得一个自定义的镜像文件,Docker镜像3.执行:docker run,Docker容器
3、DockerFile的文件到底长什么样?
我们先拿centos为例,先进去Docker Hub里面,搜索centos
FROM scratch
MAINTAINER The CentOS Project <cloud-ops@centos.org> - ami_creator
ADD centos-7.1503-20150330_1749-docker.tar.xz /
CMD ["/bin/bash"]
解读:第一行的scratch,真真正正的就是java中的Object类,所有镜像文件的祖先类第二行:作者加邮箱第三行:第四行:dockerfile文件里面的CMD命令只会执行最后一个CMD,这就是为什么运行centos镜像时:docker run -it centos /bin/bash 最后的/bin/bash可加可不加;如果加上就是:在最后面又加了一个CMD ["/bin/bash"]。FROM scratchMAINTAINER The CentOS Project <cloud-ops@centos.org> - ami_creatorADD centos-7.1503-20150330_1749-docker.tar.xz /CMD ["/bin/bash"]CMD ["/bin/bash"]
4、DockerFile的语法规则:
1:每条保留字指令(保留字指令在后面)都必须为大写字母且后面要跟随至少一个参数,否则运行就会报类似于空指针之类的错。2:指令按照从上到下,顺序执行3:#为注释4:每条指令都会创建一个新的镜像层,并对镜像进行提交
5、Docker执行DockerFile的大致流程:
(1)docker从基础镜像运行一个容器,这个容器就是第一行FROM后面的镜像,如scratch、centos等(2)执行一条指令并对容器作出修改。(3)执行类似docker commit的操作提交一个新的镜像层(4)docker再基于刚提交的镜像运行一个新容器(5)执行dockerfile中的下一条指令直到所有指令重复上面步骤直到都执行完成最终: DockerFile、Docker镜像、Docker容器,逐步构建出来的
6、保留字指令:
FROM: 基础镜像,当前新镜像是基于哪个镜像的MAINTAINER: 镜像维护者的姓名和邮箱地址RUN: 容器构建时需要运行的命令,如果在容器运行时需要运行其他命令,使用run指定EXPOSE: 容器对外暴露的端口,mysql:3306、redis:6379WORKDIR:创建容器后,进入容器使用pwd指令落脚点的目录,没有指定就是/,如centos是/,redis是/dataENV: 用来构建镜像的过程中设置环境变量,"ENV 键 值"。 相当于成员变量如:ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何RUN指令中使用;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH 使用,就相当于运行容器的落脚点就是/usr/mytestADD: 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。 ADD = COPY+解压缩COPY: 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置COPY的两种写法:COPY src dest 、 COPY["src","dest"]VOLUME: 容器数据卷,用来数据保存和持久化工作CMD: 指定一个容器启动时需要运行的命令。DockerFile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换也就是人工添加或文件中指定的CMD参数会把DockerFile里面的参数覆盖,只会有最后一个生效。
ENTRYPOINT: 指定一个容器启动时需要运行的命令。 和CMD的命令一样,区别是这个有多个ENTRYPOINT会追加,而不是覆盖。相对比CMD更加强大ONBUILD:当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。类似于触发器,如果子镜继承了某个镜像,运行了之后父镜像还想做一些其他事情,就能写ONBUILD。![]()
7、案例: 自己编写Dockerfile文件:
1、默认centos是精简版的只有一个kernel的centos,所以安装的时候自己安装上vim、ifconfig等命令,且登录的落脚点为/tmp
FROM centosMAINTAINER zhangsan<111111111@qq.com>ENV MYPATH/tmpWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPSOE 80CMD /bin/bash //使用的是shell脚本的CMD方式exec格式(JSON字符串格式)docker build -f /myDockerFile/Dockerfile1 -t zhangsan/centos:1.0 . // 如果执行到yum就运行不下去,就重新pull一个centos,因为最新的centos是8.xdocker run -it /zhanghao/centos:1.0 /bin/bash //最后的/bin/bash可写可不写
2、CMD命令会被覆盖,ENTRYPOINT会追加。所以,如果Dockerfile文件是CMD就只能有最后一个被执行,使用docker run 运行镜像后面不能叠加参数,如果Dockerfile使用的是ENTRYPOINT那么运行后面可以叠加参数。
CMD指令:FROM centosRUN yum install -y curlCMD [ "curl", "-s", "http://ip.cn" ] #使用的哪个ipdocker build -f/myDockerFile/Dockerfile2 -t zhanghao/cnetos:1.1 .docker run zhanghao/centos:1.1 //就会显示出当前的地址和ip但是如果要将html的请求头一起显示出来就需要知道 -i 参数:docker run -it zhanghao/centos:1.1 -i根据CMD的特点,这是不允许的,会报executable file not found。因为-i覆盖了之前的CMD,所以-i执行失败ENTRYPOINT指令:#因为下载的cnetos是最新版的8,使用yum会出现一些错误,所以就下载7.x的版本,注意这个FROM后面的镜像也需要加上版本。FROM centosRUN yum install -y curlENTRYPOINT [ "curl", "-s", "http://ip.cn" ]docker build -f/myDockerFile/Dockerfile3 -t zhanghao/cnetos:1.2 .docker run zhanghao/centos:1.2如果使用ENTRYPOINT命令方式命令就可以叠加了,docker run zhanghao/centos:1.2 -i就会将 -i 参数添加到参数位置: ENTRYPOINT [ "curl", "-s", "-i", "http://ip.cn" ]crul命令解释:curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用yum install curl安装,也可以下载安装。curl是将下载文件输出到stdout使用命令:curl http://www.baidu.com执行后,www.baidu.com的html就会显示在屏幕上了这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的请求头header。要全部显示,请加参数 -i
3、先创建一个Dockerfile4,这个文件就充当父镜像,然后编写Dockerf5继承和这个镜像,然后触发执行ONBUILD后面的内容。
Dockerfile4:FROM centosONBUILD RUN echo "这是父镜像。。"CMD /bin/bashdocker build -f /myDockerFile/Dockerfile4 -t zhanghao/Docker_father .Dockerfile5:FROM zhanghao/Docker_fatherCMD /bin/bashdocker build -f myDockerFile/Dockerfile5 -t zhanghao/Docker_son .当构建DockerFile5的时候,就会触发执行父镜像Dockerfile4, 然后就会执行ONBUILD后面的内容。
4、使用centos,自己指定一个tomcat镜像。 注意tomcat的千层饼,tomcat镜像是基于tomcat,jdk,centos,kernel组合的,暴露8080端口。

1.mkdir -p /zhanghao/mydockerfile/tomcat92.touch c.txt3.上传:使用上传工具将windows上下载的jdk和tomcat的压缩包上传到centos中。4.编写Dockerfile:FROM centosMAINTAINER zhanghao<2281431614@qq.com>#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下重命名为cincontainer.txtCOPY c.txt /usr/local/cincontainer.txt#把java与tomcat添加到容器中,ADD = COPY + 自动解压缩,tomcat镜像必须是先装jdk,再装tomcat,ADD jdk-8u171-linux-x64.tar.gz /usr/local/ADD apache-tomcat-9.0.8.tar.gz /usr/local/#安装vim编辑器RUN yum -y install vim#设置工作访问时候的WORKDIR路径,登录落脚点ENV MYPATH /usr/localWORKDIR $MYPATH#配置java与tomcat环境变量ENV JAVA_HOME /usr/local/jdk1.8.0_171ENV 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 8080#启动时运行tomcat。 tail -f :实时监控日志的更新信息保存到catalina.out里面# 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.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out5.构建Dockerfile:docker build -f /myDockerFile/Dockerfile -t zhanghao/myt9 .6.运行: -v就是,只要编写好了项目之后,将要运行的项目放在host下的/zhanghao/mydockerfile/tomcat9/test目录里面,运行项目就会自动挂载带webapps里面。test就是项目名docker run -d -p 9080:8080 --name myt9 \-v /zhanghao/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test \-v /zhanghao/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs \--privileged=true \zzyytomcat9如果运行 docker exec 容器id ls -l 查询的将是在/user/local下面的信息,因为工作目录WORKDIR是/usr/local7.验证:
8.项目搭建:在tomcat上运行一个项目在/zhanghao/mydockerfile/tomcat9/test 里面新建WEB-INF文件夹,里面存放web.xml文件:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>test</display-name></web-app>在/zhanghao/mydockerfile/tomcat9/test 里面新建jsp文件,如a.jsp:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>-----------welcome------------<%="i am in docker tomcat self "%> <!--前台显示--><br><br><% System.out.println("=============docker tomcat self");%> <!--后台日志里面显示--></body></html>9.运行项目: 在catalina.out文件里面查看日志的信息。访问几次a.jsp就显示几次日志监控信息
10.这样运行的好处,当在host主机上对文件进行修改后,就会影响到容器。如:修改了a.jsp的格式,不用重新启动tomcat容器就会刷新。