一.什么是Dockerfile

Dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本,简单来说Dockerfile来用来制作docker镜像,每个dockerfile都会指定一个基础镜像并且新构建出来的镜像是基于这个基础镜像层层叠加出来的新镜像

二.用Dockerfile构建镜像的步骤

dockerfile的每条指令都必须是大写字母且后面至少要跟一个参数,指令从上到下依次执行,每条指令都会创建一个新的镜像层并对镜像进行提交,#表示注释

1.编写dockerfile文件

# 基础镜像使用java8
FROM java:8
# 作者
MAINTAINER heyx6 <heyx6@hyx.com>
# VOLUME 指定了临时文件目录为/tmp
#其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将当前目录下的jar包添加到容器默认工作目录中并更名为app.jar
ADD docker-demo-1.0-SNAPSHOT.jar app.jar
# 运行jar包
ENTRYPOINT ["java","-jar","/app.jar"]
#暴露端口
EXPOSE 8080

docker 创建就结束 docker创建文件命令_docker

2.在dockerfile所在的目录下使用docker build -t 新镜像名称:TAG .构建新镜像

//后面的逗号不能少
docker build -t 新镜像名称:TAG .

docker 创建就结束 docker创建文件命令_jar_02

3.新建并启动刚才使用dockerfile构建起来的镜像容器

docker run -d -p 8080:8080 --name 容器名称 新镜像名称:TAG

三.Dockerfile常用指令

1.FROM指令表示当前的新镜像是基于哪个镜像的,指定一个已经存在的镜像

# 基础镜像使用java8
FROM java:8

2.MAINTAINER指令表示镜像维护者的姓名和邮箱信息

MAINTAINER heyx6 <heyx6@hyx.com>

3.EXPOSE指令表示暴露端口

#暴露端口
EXPOSE 8080

4.WORKDIR指令表示指定在创建容器后,终端默认登录进来的工作目录

WORKDIR /home

5.ADD指令将宿主机目录下的文件拷贝进镜像并会自动处理url和自动压缩tar包

# 将当前目录下的jar包添加到容器默认工作目录中并更名为app.jar
ADD docker-demo-1.0-SNAPSHOT.jar app.jar

6.ENV指令表示用来构建镜像过程中的环境变量,可以被其他指令引用,类似java中变量一样

#定义工作目录变量
EVN MYPATH /home
#引用变量
WORKDIR $MYPATH

7.VOLUME指令表示容器数据卷,用来数据保存和持久化工作的

#其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp

8.COPY指令类似于ADD指令将文件和目录拷贝到镜像中,将从构建上下文目录中的源文件复制到新的一层镜像内的目标位置,格式如:COPY['源文件路径','目标文件路径(容器内指定的路径)'],目标路径可以事先不用创建,不存在会自动创建的

COPY ['源文件路径','目标路径']

9.RUN指令表示在容器构建是需要运行的指令,有两种格式,shell,exec格式,RUN指定是在docker build的时候运行的

//1.shell格式就好像是在终端命令窗口执行一样
RUN yum install -y vim
//2.exec格式
RUN ['执行文件','参数1','参数2']
RUN ['./main.sh','test','start']相当于 RUN ./main.sh test start

10.CMD命令表示容器启动运行命令,dockerfile中可以有多个CMD命令但是只有最后一个CMD命令生效,CMD会被docker run 后面携带的参数替换,它和RUN命令的区别在于RUN指令是在docker build构建镜像中运行的而CMD指令是在docker run运行的

1.shell格式
CMD yum install -y vim
2.exec格式
CMD ['执行文件','参数1','参数2']

11.ENTRYPOINT指令也是一个容器启动运行的命令,类似于CMD命令但是ENTRYPOINT命令不会被docker run后面的命令覆盖,而这些后面的命令参数会被传到ENTRYPOINT指令指定的程序中,如果dockerfile中存在多个ENTRYPOINT指令仅最后一个生效,当ENTRYPOINT,CMD指令一起使用是,CMD不再直接运行其命令而是将内容当做参数传给ENTRYPOINT
相当于CMD也是ENTRYPOINT[参数1,参数2,cmd参数]

如:

FROM nginx

ENTRYPOINT ['nginx','-c']

CMD['etc/nginx/nginx.conf']

根据上面的dockerfile编写
在docker run nginx衍生出来的的命令是这样子docker run nginx -c /etc/nginx/nginx.conf

四.总结

总的来说Dockerfile文件还是比较好理解,对于一些常用的Dockerfile指令需要我们加深理解这个指令的用处,好了,本文就到此结束啦