Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
Dockerfile由一行行命令语句组成,并且支持以 # 开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
例如:
## Dockerfile文件格式
# 1、第一行必须指定 基础镜像信息
FROM java:8
# 2、维护者信息
MAINTAINER oldGj_ [email protected]
# 3、镜像操作指令
RUN echo "wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.55/bin/apache-tomcat-9.0.55.tar.gz"
run tar -zxvf apache-tomcat-9.0.55.tar.gz -C /usr/local
# 4、容器启动执行指令
CMD /usr/local/tomcat/bin/catalina.sh
Dockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
- 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令.
简单示例
在一个空白的文本文件, 命名为Dockerfile
vim Dockerfile
示例1
Dockerfile文件内容:
#基础镜像
FROM centos
#维护者
MAINTAINER oldGj_
#运行命令
RUN "yum install wget"
#启动容器运行命令
CMD echo "hello Dockerfile"
示例2
Dockerfile文件内容:
FROM java:8
MAINTAINER WCC
CMD java -version
docker build -t 镜像名字:版本 .
注意
. 代表Dockerfile文件在当前路径
指定基础镜像,必须为第一个命令。
指令格式:
FROM
FROM :
注意:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
维护者信息
指令格式:
MAINTAINER
示例
MAINTAINER Jasper Xu MAINTAINER [email protected]
工作目录,类似于cd命令
指令格式:
WORKDIR /usr/workdir
示例
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
示例
WORKDIR /OPT
RUN mkdir docker
WORKDIR /usr/local
RUN echo "test" > a.info
注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
构建镜像时执行的命令
指令语法:
# 1. shell执行
格式 RUN
# 2. exec执行
格式 RUN ["executable", "param1", "param2"]
示例
WORKDIR /OPT
RUN mkdir docker
WORKDIR /usr/local
RUN echo "test" > a.info
注意:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
指令格式:
ADD ...
ADD ["",... ""] 用于支持包含空格的路径示例:
示例
添加所有以"hom"开头的文件
ADD hom* /mydir/
? 替代一个单字符,例如:“home.txt”
ADD hom?.txt /mydir/
添加 “test” 到 WORKDIR/relativeDir/
ADD test relativeDir
添加 “test” 到 /absoluteDir/
ADD test /absoluteDir/
功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
语法格式:
COPY <源路径> <目标路径>
示例
COPY ./start.sh /start.sh
构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。
指令格式:
CMD指令与RUN指令相似,也具有两种格式:
1. shell格式:CMD <命令>
2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]
示例
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
指定容器启动的要运行的命令,可以追加命令
指令格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2 (shell内部命令)
示例
ENTRYPOINT ["top", "-b"]
注意:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。
指令格式:
ENV =
示例
ENV JAVA_HOME=/usr/local/jdk1.7.0_79
ENV PATH=$JAVA_HOME/bin:$PATH
指定于外界交互的端口
指令格式:
EXPOSE
示例
EXPOSE 80
注意:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
用于指定持久化目录
指令格式:
VOLUME ["/path/to/dir"]
示例
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2"]
注意:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用 2 容器并不一定要和其它容器共享卷 3 修改卷后会立即生效 4 对卷的修改不会对镜像产生影响 5 卷会一直存在,直到没有任何容器在使用它
USER
指令用于将会用以什么样的用户去运行
指令格式:
USER user
USER user:group
注意:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过
docker run
运行容器时,可以通过-u参数来覆盖所指定的用户。
帮助别人定制而准备的
指令格式:
ONBUILD [INSTRUCTION]
示例
FROM centos
WORKDIR /data
ONBUILD RUN mkdir test
FROM test:02
区别:
- CMD #指定这个容器启动的时候要运行的命令,可被替换
- ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
例子
Dockerfile文件
#基础镜像
from centos
#启动容器运行命令
CMD ["ls" ,"-a"]
构建镜像
docker build -t test04:v1 .
首先,尝试在DockerHub上搜索Tomcat相关镜像的个数
docker search tomcat |wc -l
有26个,如果是个人开发或者测试,随意使用一个,若是生产环境使用,就不合适了。
- 项目需要的Tomcat版本可能不同。
- 项目需要的Tomcat变量不一致。
- 项目需要的JDK可能不一致。
因此比较好的方式有架构师或者项目经理通过Dockerfile或者其他方法构建统一的镜像,然后分发给项目组所有成员来进行。
#基础镜像
FROM openjdk:11
#维护者
MAINTAINER oldGj_
#拷贝tomcat包
ADD ./apache-tomcat-9.0.50.tar.gz /usr/local
#设置工作目录
WORKDIR /usr/local
#设置tomcat环境变量
ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.50
ENV PATH=$PATH:$TOMCAT_HOME/bin
#保留端口
EXPOSE 8080
#启动容器运行命令
CMD startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/bin/catalina.bat