Docker快速入门四:Dockerfile

目录

1.Dockerfile是什么

2.Dockerfile基础知识

2.1Dockerfile基础

2.2Dokcerfile执行流程

2.3Dockerfile、Docker镜像和Docker容器三者关系

3.Dockerfile语法

3.1Dockerfile保留字指令

3.2案例说明

3.2.1案例一:创建自己的centos

3.2.2案例二:制作查询ip的镜像

3.2.3案例三:继承触发器ONBUILD

3.2.4案例四:自定义tomcat

4.总结


1.Dockerfile是什么

  • Dockerfile是什么

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

  • Dockerfile构建三步骤

①编写Dockerfile;

②docker build,生成自定义镜像;

③docker run,运行镜像。

2.Dockerfile基础知识

2.1Dockerfile基础

  1. 每条保留字指令必须为大写字母,且后面跟随至少一个参数;
  2. 指令按照从上到下,顺序执行;
  3. #表示注释;
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交。

2.2Dokcerfile执行流程

  1. Docker从基础镜像运行一个容器;
  2. 执行一条指令,对容器进行修改;
  3. 执行类似docker commit的操作提交一个新的镜像层;
  4. Docker再基于刚提交的镜像运行一个新容器;
  5. 执行dockerfile的下一条指令,直到所有指令都执行完成。

2.3Dockerfile、Docker镜像和Docker容器三者关系

Docker快速入门四:Dockerfile_第1张图片

总结:Dockerfile是源代码,Docker镜像是程序安装包,Docker容器是运行程序。

3.Dockerfile语法

3.1Dockerfile保留字指令

  • FROM

指定当前新镜像是基于哪个镜像。

  • MAINTAINER

作者姓名和邮箱地址。

  • RUN

容器构建时需要运行的命令。

  • EXPOSE

指定容器对外暴露端口。

  • WORKDIR

登录容器后,默认的工作目录。

  • ENV

构建镜像的过程中设置环境变量.

ENV MY_PATH /usr/mytest
WORKDIR $MY_PATH
  • ADD

将宿主机目录下的文件拷贝进镜像,并自动解压。(COPY+解压)

  • COPY

将宿主机目录下的文件拷贝进镜像。

  • VOLUME

容器数据卷,用于数据保存和持久化工作。

  • CMD

指定容器启动时要运行的命令,Dockerfile中可以有多个CMD,但只有最后一个生效,并且CMD会被docker run之后的参数替换。

  • ENTRYPOINT

指定容器启动时要运行的命令,出现多个时,会都执行。

  • ONBUILD

类似触发器,被继承时触发。

保留字指令分类如下图:

Docker快速入门四:Dockerfile_第2张图片

 

3.2案例说明

3.2.1案例一:创建自己的centos

第一步:编写Dockerfile

FROM centos
MAINTAINER houpk<[email protected]>

ENV mypath /tmp
WORKDIR $mypath

#安装vim和net-tools
RUN yum –y install vim
RUN yum –y install net-tools

#对外暴露80端口
EXPOSE 80
#run时执行bash命令
CMD /bin/bash

第二步:构建镜像

docker build –t 新镜像名称:TAG .

执行打印如下图,逐条执行。

Docker快速入门四:Dockerfile_第3张图片

第三步:运行镜像

docker run –it 新镜像名称:TAG

3.2.2案例二:制作查询ip的镜像

第一步:编写Dockerfile

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

 说明:curl命令用于模拟http请求,比如获取广州的天气,可以执行如下命令:

curl -d "city=guangzhou&appkey=8010132dcf54491a4eaa387f4db61774" "https://way.jd.com/he/freeweather"

上面的curl获取IP地址执行不通过,因为网站问题。

第二步:创建镜像

docker build -f Dockerfile -t myip .

第三步:运行镜像

docker run -it myip

Dockerfile中最后查询IP地址,可以使用CMD或者ENTRYPOINT,两者都是指定容器启动时要执行的命令。

不同点:CMD有多个时,只有最后一个生效,并且CMD会被docker run之后的参数替代;ENTRYPOINT则全部都会执行。

如果想在curl命令中添加一个参数-i,用于打印报文头HTTP HEAD。

情况一:如果使用CMD命令

docker run myip curl -s http://ip.cn -i

情况二:如果使用ENTRYPOINT命令

docker run myip -i

3.2.3案例三:继承触发器ONBUILD

第一步:编写Dockerfile4

Docker快速入门四:Dockerfile_第4张图片

第二步:创建父镜像myip_father

 第三步:编写Dockerfile5

第四步:创建子镜像myip_son

Docker快速入门四:Dockerfile_第5张图片

 

3.2.4案例四:自定义tomcat

第一步:宿主机创建目录

mkdir –p /zzyyuse/mydockerfile/tomcat9

第二步:在目录下创建c.txt

第三步:将jdk和tomcat安装包拷贝到上面目录,分别为apache-tomcat-9.8.0.tar.gz和jdk-8u171-linux-x64.tar.gz

第四步:在上面目录新建Dockerfile,内容如下:

Docker快速入门四:Dockerfile_第6张图片

①COPY是单纯复制,ADD则是复制+解压缩,所以c.txt用COPY,两个压缩包用ADD;

②MD后的&&表示另一个命令,tail –f表示查看正在变化的文件内容。

第五步:构建镜像

docker build -t zzyytomcat .

如过不使用-f参数,默认寻找本目录下Dockerfile文件。

第六步:运行镜像,命令如下:

-v容器数据卷,宿主机目录:容器目录,映射的第一个目录可用于发布web server,第二个目录用于查看运行日志。

第七步:验证

Docker快速入门四:Dockerfile_第7张图片

第八步:使用数据卷发布web服务

①在数据卷的宿主机webapps目录下有test文件夹,表示新增一个名字为test的web工程,在test目录下新增WEB-INF文件夹和a.jsp。

②在WEB-INF文件夹下新增web.xml,web.xml是web工程的配置文件,内容如下:

Docker快速入门四:Dockerfile_第8张图片

③为了简单,使用jsp技术,编辑a.jsp,内容如下:

Docker快速入门四:Dockerfile_第9张图片

其中 i am in...在前台打印;System.out.println...在后台打印。

④测试

查询docker的test目录,有这两个文件。

通过网页访问a.jsp,如下所示:

Docker快速入门四:Dockerfile_第10张图片

如果在宿主机修改a.jsp,效果会体现在网页上。

在宿主机的日志目录下的catalina.out文件中可以看到日志。

4.总结

Docker快速入门四:Dockerfile_第11张图片

第一步:编写Dockerfile,在宿主机上用vim编写,第一行是FROM;

第二步:运行docker build,创建image;

第三步:docker run,创建容器实例;

第四步:commit,生成新的镜像;

Docker pull,从docker仓库拉取镜像;

Docker push,镜像上传到docker仓库;

 

 

你可能感兴趣的:(Docker)