Dockerfile 文件配置

2018-12-07 0 By admin

在容器服务使用过程中,我们少不了需要创建自定义镜像,使工作更加便利。
制作容器镜像的方式一般有两种:
1、创建容器,对容器修改后;使用commit命令,封装为新的镜像。
2、通过Dockerfile文件,基于已有镜像和依赖的文件,编写对镜像的操作命令集合;通过 build 命令将以上资源封装为新镜像。
在使用过程中,自然推荐第二种操作方式。另外还有一种情况为通过文件创建原始镜像,即最初的系统镜像;这里不作说明。

一、Dockerfile 概述

一般情况下 Dockerfile 文件内容分为四部分:
基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
除了FROM命令,其他命令都会在上一条指令所生成的镜像的基础上执行,执行完成后生成新的镜像层。新的镜像层覆盖在原来的镜像上形成新的镜像。为了提供镜像构建速度,build 执行过程中会缓存构建过程中的中间镜像。
’#’ 为 Dockerfile 中的注释
Dockerfile中的指令不区分大小写,不过为了与参数区分,推荐使用大写。

1、基础镜像信息

# This is Test Dockerfile
# Version 1.0
FROM centos

2、维护者信息

MAINTAINER cn-blogs

3、镜像操作指令

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
#COPY 拷贝文件到镜像
COPY epel-release-latest-7.noarch.rpm /usr/local/
#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 指明指令运行目录
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80

4、容器启动时执行指令

#CMD 运行以下命令
CMD ["nginx"]

二、指令详解

FROM 指定基础镜像

格式为:FROM <image>或FROM <image>:<tag>
第一条指令必须为 FROM 指令。
Dockerfile 中可以多次使用 FROM 命令,这样可以创建多个镜像。
tag为空时,默认为lastest。

MAINTAINER 指定维护者信息

格式为:MAINTAINER [name]

RUN 在镜像中要执行的命令

格式为:RUN <command>或 RUN ["executable", "param1", "param2"]
前者将在 shell 终端中运行命令,即 /bin/bash -c ;
后者则使用 exec 执行;命令是直接运行的,容器不调用shell程序。
指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”,”echo hello”] 。

WORKDIR 当前工作目录

格式为 :WORKDIR /path_to_workdir(绝对路径|相对路径)
后续的 RUN、CMD、ENTRYPOINT 指令基于此工作目录;
Dockerfile可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前的路径确定当前路径。

EXPOSE 指定容器要暴露的端口

格式为 EXPOSE [port]
等同于在启动容器时需要通过 -P 指定暴露的端口。

ENV 定义环境变量

格式为:ENV <key>  <value>
指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ENV PATH /usr/local/nginx/sbin:$PATH

COPY 拷贝本机文件(Dockerfile所在目录的相对路径)到容器

格式为:COPY <src> <dst>

ADD : COPY 功能更强大

格式为:ADD <src> <dst>
该命令将复制指定的 到容器中的。其中可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个归档文件,复制进容器会自动解压。

VOLUME 挂载目录

格式为VOLUME [“/data”]
创建一个可以从本地主机或其他容器挂载的挂载点。无法指定主机上对应的目录,是自动生成的。

USER 设置运行容器的UID

格式为:USER [uid]
指定运行容器时的用户名或 UID。

ENTRYPOINT 容器启动时运行的命令

容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT <command>
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。

CMD 容器启动时运行的命令

支持三种格式
CMD <command>
CMD [“executable”,”param1″,”param2″] 使用 exec 执行,推荐方式;
CMD [“param1″,”param2”] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

ONBUILD 在构建本镜像时不生效,在基于此镜像构建镜像时生效

格式为 ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
ENTRYPOINT 和 CMD 的区别:
ENTRYPOINT 指定了该镜像启动时的入口,CMD 则指定了容器启动时的命令,当两者共用时,完整的启动命令像是 ENTRYPOINT + CMD 这样。使用 ENTRYPOINT 的好处是在我们启动镜像就像是启动了一个可执行程序,在 CMD 上仅需要指定参数;另外在我们需要自定义 CMD 时不容易出错。

三、创建镜像

在构建镜像时,要将要使用的包及 Dockerfile 文件放在同一个目录中;然后在此目录下,执行下面的命令创建名为cn-blogs/nginx的镜像。
# docker build -t cn-blogs/nginx:1.8 .
使用此镜像创建容器
# docker run -d -p 8080:80 --name mynginx cn-blogs/nginx:1.8