第一次看到dockerfile的时候有联想到了makefile,大学是电子专业对Makefile有一定了解,(将你要编译的.c代码文件以Makefile里面的规则来编译,如果想了解可以去下载linux内核看看,里面很多Makefile)发现dockerfile基本类似,下面说说dockerfile

1.DockerFile是什么

因为和makefile雷同所以简单总结DockerFile就是构建docker镜像的脚本文件

2.DockerFile怎么编写呢

我们参考官网centos镜像来编写,首先我们看看是什么样的规则

https:///_/centos/

CMD dockerfile 运行脚本 dockerfile执行脚本_CMD dockerfile 运行脚本

很简单,四句话就好了,关键字+参数

Dockerfile内容基础知识

1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2:指令按照从上到下,顺序执行

3:#表示注释

4:每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程

1.docker从基础镜像运行一个容器

2.执行一条指令并对容器作出修改

3.执行类似docker commit的操作提交一个新的镜像层

4.docker再基于刚提交的镜像运行一个新容器

5.执行dockerfile中的下一条指令直到所有指令都执行完成

从你学习dockerfile开始docker三要素就变成了:容器,镜像,dockerfile 

1、Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

3、Docker容器,容器是直接提供服务的。

CMD dockerfile 运行脚本 dockerfile执行脚本_docker_02

3.DockerFile关键字

FROM:基础镜像,当前新镜像是基于哪个镜像的,第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。

MAINTAINER:镜像维护者的姓名和邮箱地址

WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

ENV:用来在构建镜像过程中设置环境变量

ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

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

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

EXPOSE:当前容器对外暴露出的端口

CMD:指定一个容器启动时要运行的命令,如果有多个 CMD 指令,但只有最后一个生效,如果docker run 运行镜像到了参数将会替换CMD

ENTRYPOINT:指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数

CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖;而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。

ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

常用构建dockerfile的命令有这麽多基本可以,说再多都不如来一个例子更好理解

4.自定义镜像Tomcat9

1.我在宿主机/opt下建了一个myTomcat9文件,上传了JDK和tomcat压缩包如图:

mkdir -p /opt/myTomcat9

CMD dockerfile 运行脚本 dockerfile执行脚本_tomcat_03

2.在myTomcat9目录下新建一个Dockerfile文件

vim Dockerfile

增加如下内容:

#第一句必须是FROM,基于centos镜像来构建,如果本地没有
FROM         centos

#作者邮箱
MAINTAINER    oyl<oylbs@126.com>

#把宿主机当前上下文的a.txt拷贝到容器/usr/local/路径下重新命名为cincontainer.txt
COPY a.txt /usr/local/cincontainer.txt

#把java与tomcat添加到容器的/usr/local/中并解压
ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.37.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_144
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器运行时监听的端口
EXPOSE  8080

#启动时运行tomcat,tail -F 显示打印日志
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh

3.执行构建镜像

docker build -t mytomcat9:1.0 .
-t 参数:新镜像名字:TAG
-f 指定你的dockerfile路径绝对路径,没有-f就是当前路径(必须为Dockerfile)

CMD dockerfile 运行脚本 dockerfile执行脚本_docker_04

查看镜像

CMD dockerfile 运行脚本 dockerfile执行脚本_CMD dockerfile 运行脚本_05

4.运行容器验证mytomcat9

docker run -it -p 8888:8080 镜像ID

-p端口映射主机端口:docker端口

在访问tomcat888 端口,http:192.168.74.138:8888

如图说明成功

CMD dockerfile 运行脚本 dockerfile执行脚本_Dockerfile_06

前面设置登入前台进入容器时候的当前位置/usr/local,如图ok

CMD dockerfile 运行脚本 dockerfile执行脚本_Dockerfile_07

把宿主机当前上下文的a.txt拷贝到容器/usr/local/路径下重新命名为cincontainer.txt

CMD dockerfile 运行脚本 dockerfile执行脚本_tomcat_08

到这对于我们常用的dockerfile命令基本都熟悉了,以后也就在这基础上增加更多内容而已。