Dockerfile是一个文本格式的配置文件,可以使用Dockerfile快速创建自定义的镜像。其实就是配置好linux能够执行的相关命令,然后通过docker build命令来构建镜像。
Dockerfile由一行行命令组成,用#来进行注释。一般包括四个部分:基础镜像、维护者信息、镜像操作指令和容器启动时执行指令。
分享搭建centos7 + jdk + tomcat环境的Dockerfile,其中jdk和tomcat是已经下载好的tar包,也可以直接用命令下载jdk和tomcat:
# VERSION 1.0
# 默认centos server长期支持版本,当前是7
FROM centos:centos7
# 签名
MAINTAINER lin521lh "592332624@qq.com"
#安装JDK
#创建jdk目录
RUN mkdir /var/tmp/jdk1.7.0_79
#把当前目录下的jdk文件夹添加到镜像
ADD /java/jdk1.7.0_79 /var/tmp/jdk1.7.0_79
#RUN tar zxvf jdk7u79linuxx64.tar.gz -C /var/tmp/jdk1.7.0_79
#RUN rm -rf /opt/software/jdk7u79linuxx64.tar.gz
#安装tomcat
#创建tomcat目录
RUN mkdir /var/tmp/apache-tomcat-7.0.82
#把当前目录下的tomcat文件夹添加到镜像
ADD /java/apache-tomcat-7.0.82 /var/tmp/apache-tomcat-7.0.82
#RUN tar zxvf /opt/software/apache-tomcat-7.0.82.tar.gz -C /var/tmp/apache-tomcat-7.0.82
#RUN rm -rf /opt/software/apache-tomcat-7.0.82.tar.gz
#设置环境变量
ENV JAVA_HOME /var/tmp/jdk1.7.0_79
ENV CATALINA_HOME /var/tmp/apache-tomcat-7.0.82
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#向容器中安装中文编码支持
RUN yum -y install kde-l10n-Chinese telnet && \
yum -y reinstall glibc-common &&\
yum clean all && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#设置容器编码格式
ENV LC_ALL "zh_CN.UTF-8"
#开启tomcat 8080端口
EXPOSE 8080
#启动tomcat服务
CMD ["./var/tmp/apache-tomcat-7.0.82/bin/catalina.sh","run"]
Dockerfile文件创建好之后,可以在此文件目录下执行以下命令,来创建镜像文件:
docker build -t centos-jdk7-tomcat7:0.0.1 --rm=true .
指令
指令的一般格式为INSTRUCTION arguments。
1、FROM
格式为FROM <image>或FROM <image> : <tag>。第一条指令必须是FROM指令。同一个Dockerfile中创建多个镜像时可以使用多个FROM指令。
2、MAINTAINER
格式为MAINTAINER <name>,指定维护者信息。
3、RUN
格式为RUN <command>或 RUN ["executable", "param1","param2"]。RUN <command>在shell终端中运行命令,即/bin/sh -c;后边在exec执行。每条RUN指令在当前镜像上执行指定命令,并提交为新的镜像。命令长的时候可以用\来换行。
4、CMD
CMD ["executable", "param1","param2"]使用exec执行,一般使用该方法;
CMD command param1 param2 在/bin/sh中执行,提供给需要交互的应用;
CMD ["param1","param2"]提供给ENTRYPOINT的默认参数;
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果有多条命令,只有最后一条会被执行。
启动容器时指定了运行的命令,则会覆盖CMD指定的命令。
5、EXPOSE
格式为EXPOSE <port> [<port> ...]。容器向宿主机暴露的端口号。
6、ENV
格式为ENV <key> <value>。指定环境变量,会被后续RUN指令只用,并在容器中保持运行。
7、ADD
格式为ADD<src> <dest>。复制指定的<src>到容器中的<dest>。<src>是Dockerfile所在宿主机目录的一个相对路径(文件和目录都可以);也可以是一个URL;或者tar文件(自动解压为目录)。
8、COPY
格式为COPY<src> <dest>。复制宿主机的<src>到容器中的<dest>,不存在的时候回自动创建。使用本地目录为源目录时可以使用。
9、ENTRYPOINT
ENTRYPOINT["executable", "param1", "param2"];
ENTRYPOINT command param1 param2(shell中执行)。
容器启动后执行的命令,并且不会被docker run提供的参数覆盖。每个Dockerfile只能有一条ENTRYPOINT命令。如果有多条ENTRYPOINT时,只有最后一条会被执行。
10、VOLUME
格式为VOLUME ["/data"]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据。
11、USER
格式为USER daemon。指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。当服务不需要管理员权限时,可以用该命令来指定运行用户。并且可以在之前创建所需要的用户。临时取得管理员权限使用gosu。
12、WORKDIR
格式为WORKDIR /path/to/workdir。为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR命令。
13、ONBUILD
格式为ONBUILD [INSTRUCTION]。配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。