第一次看到dockerfile的时候有联想到了makefile,大学是电子专业对Makefile有一定了解,(将你要编译的.c代码文件以Makefile里面的规则来编译,如果想了解可以去下载linux内核看看,里面很多Makefile)发现dockerfile基本类似,下面说说dockerfile
1.DockerFile是什么
因为和makefile雷同所以简单总结DockerFile就是构建docker镜像的脚本文件
2.DockerFile怎么编写呢
我们参考官网centos镜像来编写,首先我们看看是什么样的规则

很简单,四句话就好了,关键字+参数
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容器,容器是直接提供服务的。

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
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.sh3.执行构建镜像
docker build -t mytomcat9:1.0 .
-t 参数:新镜像名字:TAG
-f 指定你的dockerfile路径绝对路径,没有-f就是当前路径(必须为Dockerfile)
查看镜像

4.运行容器验证mytomcat9
docker run -it -p 8888:8080 镜像ID
-p端口映射主机端口:docker端口在访问tomcat888 端口,http:192.168.74.138:8888
如图说明成功

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

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

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
















