一.基本结构
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
命令规则:一般直接使用Dockerfile,不推荐修改;
书写规则:一份标准的Dockerfile文件中应包含指令、注释等内容,构建指令应使镜像尽量干净没有垃圾文件;
1、自动化:Dockerfile全程无交互,所以整个构建过程需要保证命令集能够一直持续不断执行下去。
2、顺序执行:Dockerfile构建过程默认就是自上而下,所以对其中的命令编写要考虑顺序问题。
3、压缩大小:构建镜像的过程中会产生很多临时文件,对于这些临时文件需要通过在Dockerfile文件最后写上清理系统的命令处理。
4、易读:便于理解及二次开发。
二.常用命令
1.FROM(引入镜像)
FROM image FROM image:tag
Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
2.MAINTAINER(指定维护者信息)
MAINTAINER user_name user_email
3.RUN(执行镜像修改命令)
RUN command RUN ["EXECUTABLE","PARAM1","PARAM2".....]
前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c "echo hello";后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c","echo hello"]
每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。
4.CMD(执行容器启动命令)
# 使用exec执行,这是推荐的方式。CMD ["executable","param1","param2"] # 在/bin/sh中执行CMD command param1 param2 # 提供给ENTERYPOINT的默认参数CMD ["param1","param2"]
CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。
5.EXPOSE(暴露端口)
EXPOSE port [port2,port3,...]
EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。
6.ENV(指定环境变量)
ENV key value
用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
7.ADD(复制文件)
ADD src dest
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。
8.COPY(复制文件)
COPY src dest
复制本地主机src目录或文件到容器的dest目录,dest不存在时会自动创建。
9.ENTRYPOINT(执行容器启动后命令)
ENTRYPOINT ["executable","param1","param2"] ENTRYPOINT command param1,param2
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。
10.VOLUME(创建数据卷)
VOLUME ["/data"]
作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。
11.USER(指定用户)
USER username
指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。
RUN groupadd -r docker && useradd -r -g docker docker
12.WORKDIR(指定配置工作目录)
WORKDIR /path
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
13.ONBUILD(依赖镜像构建)
ONBUILD [INSTRUCTION]
格式ONBUILD [INSTRUCTION]
该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。
三.示例文件解析
1.前端项目镜像构建与部署:nginx
# 引入centos基础镜像FROM centos:7 # 安装相关依赖包,清理缓存RUN yum -y install wget curl gcc gcc-c++ make openssl-devel pcre-devel gd-devel \ iproute net-tools telnet && \ yum clean all && \ rm -rf /var/cache/yum/* # 将本地ngnix压缩包复制到容器根目录下ADD nginx-1.15.5.tar.gz / # 进入容器内ngnix目录下,配置ngnix,编译安装,清理缓存,设置时区RUN cd nginx-1.15.5 && \ ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module && \ make -j 4 && make install && \ mkdir /usr/local/nginx/conf/vhost && \ cd / && rm -rf nginx* && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # ngnix环境变量ENV PATH $PATH:/usr/local/nginx/sbin # 复制本地配置文件到容器中COPY nginx.conf /usr/local/nginx/conf/nginx.conf # 配置工作目录WORKDIR /usr/local/nginx # 暴露容器80端口EXPOSE80# 启动ngnixCMD ["nginx","-g","daemon off;"]
2.java项目镜像构建tomcat
FROM centos:7 ENV VERSION=8.5.43 RUN yum -y install java-1.8.0-openjdk wget curl unzip iproute net-tools && \ yum clean all && \ rm -rf /var/cache/yum/* ADD apache-tomcat-${VERSION}.tar.gz /usr/local/ RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \ sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/tomcat/bin WORKDIR /usr/local/tomcat EXPOSE8080CMD ["catalina.sh","run"]