DockerFile是什么?应如何编写

1、DockerFile是什么?
    是用来构建Docker镜像的构建文件,由一系列参数和命令构成的脚本
 
                关系:
                                
 
2、DockerFile的三步构建步骤?
    1.编写:
        手动编写dockerfile文件,一定要符合file的规范,DockerFile,文件名就是:Dockerfile
    2.构建:
        有了这个文件后,直接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 scratch
            MAINTAINER The CentOS Project <cloud-ops@centos.org> - ami_creator
            ADD 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:6379
WORKDIR:创建容器后,进入容器使用pwd指令落脚点的目录,没有指定就是/,如centos是/,redis是/data
ENV:    用来构建镜像的过程中设置环境变量,"ENV 键 值"。 相当于成员变量
         如:ENV MY_PATH /usr/mytest    这个环境变量可以在后续的任何RUN指令中使用;也可以在其它指令中直接使用这些环境变量,
         比如:WORKDIR $MY_PATH   使用,就相当于运行容器的落脚点就是/usr/mytest
ADD:    将宿主机目录下的文件拷贝进镜像且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 centos
MAINTAINER zhangsan<111111111@qq.com>
ENV MYPATH/tmp
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPSOE 80
CMD /bin/bash             //使用的是shell脚本的CMD方式exec格式(JSON字符串格式)
 
docker build -f /myDockerFile/Dockerfile1 -t zhangsan/centos:1.0 .     // 如果执行到yum就运行不下去,就重新pull一个centos,因为最新的centos是8.x
 
docker run -it /zhanghao/centos:1.0 /bin/bash     //最后的/bin/bash可写可不写
    2、CMD命令会被覆盖,ENTRYPOINT会追加。所以,如果Dockerfile文件是CMD就只能有最后一个被执行,使用docker run 运行镜像后面不能叠加参数,如果Dockerfile使用的是ENTRYPOINT那么运行后面可以叠加参数。
CMD指令:
 
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]    #使用的哪个ip
 
docker 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 centos           
RUN yum install -y curl
ENTRYPOINT [ "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 centos
ONBUILD RUN echo "这是父镜像。。"
CMD /bin/bash
 
docker build -f /myDockerFile/Dockerfile4 -t zhanghao/Docker_father .
 
 
Dockerfile5:
 
FROM zhanghao/Docker_father
CMD /bin/bash
 
docker 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/tomcat9
 
2.touch c.txt
 
3.上传:使用上传工具将windows上下载的jdk和tomcat的压缩包上传到centos中。
 
4.编写Dockerfile:
FROM centos
MAINTAINER zhanghao<2281431614@qq.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下重命名为cincontainer.txt
COPY 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/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV 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.out
 
5.构建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/local
 
7.验证:
 
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容器就会刷新。
    
    
    
 
    
    
 
    
    
    
    
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值