Dockerfile详解

背景

制作镜像有两种形式,一种是使用Dockerfile来制作,一种是使用容器来制作,详情可以掺靠之前的文章制作docker镜像-容器.

原则上来说,我们制作一个镜像应该是面向application的,而不是面向配置的,所以让我们想要配置一个容器的环境的时候,应该首选Dockerfile, 因为由一个基础镜像来制作容器环境的镜像成本太高,更重要的一点,使用了Dockerfile,万物皆code,我们的github, CI CD全就可以上了~~哈哈。

Dockerfile的定义

Dockerfile is nothing but the source code for building Docker images.

  • Docker can build images automatically by reading the instructions from a Dockerfile.
  • A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image.
  • Using docker build user can create an automated build that executes several command-line instructions in succession.
graph TD
A(Dockerfile)-->B(image)
Dockerfile的格式
  1. #用来表示注释。
  2. 指令大小写不敏感,一般大写,参数小写。
  3. Docker顺序执行Dockerfile中的指令来构建image。
  4. 第一个指令以"From"开始。
  5. Dockerfile文件名首字母必须大写。

工作目录

Dockerfile在制作过程中,所有相关的文件都需要在一个文件夹中,这个文件夹叫做工作目录,Dockerfile所在的目录及其子目录。

mkdir /tmp/image1
cd /tmp/image1

Dockerfile指令

FROM命令

除了注释行外,Dockerfile的第一个命令。

Syntax:
FROM <repository>[:<tag>]
FROM <repository>@<digest>
  repository:指定base image的名称
  tag: 指定base image的标签
  digest:image的hashcode
MAINTAINER(depreacted)命令

已经废弃的命令,用于提供Dockerfile制作者的信息,这个命令可以出现在任何位置,一般建议在FROM指令之后。

Syntax:
MAINTAINER <author's detail>
例如:
MAINTAINER "leveldc<leveldc@126.com>"*
LABLE命令

替代了MAINTAINER,用key value的形式来描述一个image的metadata。

Syntax:
LABLE <key>=<value>
例如:
LABLE maintainer="leveldc<leveldc@126.com>"
COPY命令

用于从宿主机复制文件到镜像文件。

Syntax:
COPY <src>...<dist>
COPY ["<src>",..."<dist>"]
  src:  复制文件的源文件或目录,支持通配符
  dist: 目标路径
说明:
1. <src>必须是build的上下文中的路径,不能是其父目录的文件。
2. 如果<src>是目录,其内部文件及子目录会被递归复制,<src>本身不会被复制。
3. 如果指定了多个<src>或在<src>中使用了通配符,则<dist>必须是一个目录,且以/结束。
4. 如果<dist>不存在,会被自动创建,包括其父目录。
例如:
COPY index.html /data/web/html
ADD命令

类似COPY命令, 支持TAR文件或者TAR.gz和URL路径。

TAR:拷贝本地的tar文件会自动解压缩到docker镜像中。

URL:拷贝服务器地址上的文件并将文件添加到docker 镜像中。

Syntax:
ADD <src>...<dist>
ADD ["<src>",..."<dist>"]
  src:  添加文件的源文件或目录,支持通配符
  dist: 目标路径
说明:
1. 如果<src>为URL且<dist>不以/结尾则<src>指定的文件将被直接下载并创建为<dist>;如果以/结尾,则文件被拷贝至<dist>/<filename>
2. 如果<src>是本地tar文件,则被展开为一个目录,如果是一个URL的tar文件,则不会自动展开。
3. 如果<src>有多个,则dist需要以/结尾,否则将会把src的内容直接写进<dist>。
例如:
ADD http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gz /usr/local/src/
ADD apache-tomcat-8.5.37.tar.gz /usr/local/src/
WORKDIR命令

指定Docker镜像中的工作路径,可以定义多次,命令执行的时候以最新定义的一次为准。
例如:
WORKDIR /usr/local/

VOLUME命令

Dockerfile中的卷只能设置容器中的挂载点目录,只能设置docker管理的卷。

例如:
`VOLUME /data/mysql`
EXPOSE命令

为容器打开指定要监听的端口来和外部通信。

Syntax:
EXPOSE <port>[/<protocol>][<port>[</protocol>]]
protocol:传输协议,tcp/udp, 默认tcp.
可以一次指定多个端口,例如:
`EXPOSE 32332/udp 32332/tcp`

这里的端口并不会直接暴露给宿主机,而是以启动docker容器时候的参数来决定。
docker run -p/-P
ENV命令

定义Dockerfile的环境变量,可以被在Dockfile ENV命令后面的其他命令引用。

  Syntax:
  ENV <key> <value>
  ENV <key>=<value> ...
  说明:
  1.第一种格式key后面的所有内容都被认为是value,只可以定义一个
  2.第二种格式可以定义多个<key>=<value>, 如果value中有空格,需要加"\"进行转义,也可以对value加双引号。另外反斜杠可以用来表示续行。
  建议使用第二种。
  3.Dockerfile中定义的ENV可以在启动容器以后直接使用,在运行为容器的时候通过-e参数可以重新给变量赋值。要分清什么参数是在build阶段的,什么是在容器启动阶段。
RUN命令

RUN命令时基于基础镜像所提供的命令来运行,发生在创建镜像的过程中。目的是为了创建镜像。
RUN 命令如果执行了yum,需要在安装完成后删除缓存以减小镜像大小。

Syntax:
RUN <command>
RUN ["<executable>","<param1>","<parm2>"]

说明:
第一种默认启动为/bin/sh 子进程。
第二种执行方式是由linux直接来执行,没有/bin/sh,所以不支持shell的语法,如果需要可以使用:
RUN ["/bin/bash","-c","<executable>","<param1>"]来执行。
例如:
RUN cd /usr/local/src/ && \
    tar -xf  ${WEB_SERVER_VERSION}
CMD命令

CMD命令发生在容器启动时,当一个镜像文件被创建为容器的时候执行,一个容器默认只启动一个进程,所以一个Dockerfile中只可以有一个CMD,如果有多个,则最后一个生效用来指定容器启动时默认执行的程。

Syntax:
CMD <command>
CMD ["<executable>","<param1>","<parm2>"]
CMD ["<param1>","<parm2>"]
说明:
在执行docker run命令的时候,可以指定新的命来来覆盖CMD的内容。如果docker在启动的时候不希望接受命令行输入的命令,可以使用ENTRYPOINT.
ENTRYPOINT命令

和CMD功能类似,但是不接受在docker run的时候修改启动命令,docker run的参数只能以变量的形式传给ENTRYPOINT定义的启动程序。

如果需要改变,需要在docker run的时候指定 --entrypoints参数。

ENTRYPOINT用来支持多环境

USER命令

用于指定运行image或运行Dockerfile中的RUN CMD ENTRYPOINT指令指定的程序时的用户名或者UID。

Syntax:
USER <UID>|<UserName>
CMD ["<executable>","<param1>","<parm2>"]
CMD ["<param1>","<parm2>"]
HEALTHCHECK命令

容器健康检测

Syntax:
HEALTHCHECK [OPTIONS] CMD command
OPTIONS:
  --interval=DURATION(间隔多久检测)
  --timeout=DURATION(检测超时)
  --start-period=DURATION(等待多久开始检测,default=0)
  --retries=N(default=3)
  returns:
  0:success
  1:unhealthy
  2:reserved
  例如:
  HEALTHCHECK --interval=5m --timeout=30s CMD curl -f http://localhost/ || exit 1
SHELL命令

镜像默认的shell

Syntax:
SHELL ["executable","parameters"]    
STOPSIGNAL命令

进程为1的命令可以接受docker stop命令,主进程停止,容器就停止。

ARG命令

在build的过程中起作用,使一个dockerfile可以适用多个环境,用法和ENV类似,但是起作用的时间不一样。该变量可以通过 build --arg参数修改。

ONBUILD命令

在Dockerfile中定义一个并发器,当别的镜像是基于有ONBUILD的镜像构建新的镜像的时候,会触发ONBOUILD指令

Syntax
ONBUILD<INSTRUCTION>

docker buld

创建docker镜像

docker build --help

Usage: docker build [OPTIONS] PATH | URL | -

OPTIONS: 参考docker build --help
PATH: Dockerfiles所在的文件目录
URL:  

例如:
docker build ./ -t leveldc/busybox:index

Dockerfile

示例一
# this is a test image
FROM busybox:latest
MAINTAINER "leveldc<leveldc@126.com>"
ENV DOC_ROOT="/data/web/html/" \
   WEB_SERVER_VERSION="apache-tomcat-8.5.37.tar.gz"

# LABEL maintainer="leveldc<leveldc@126.com>"
#COPY index.html /data/web/html/
COPY index.html ${DOC_ROOT}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.37/bin/${WEB_SERVER_VERSION} /usr/local/src/
# ADD apache-tomcat-8.5.37.tar.gz /usr/local/src/
#WORKDIR /usr/lcoal/
#ADD apache-tomcat-8.5.37.tar.gz ./src/
#ADD ${WEB_SERVER_VERSION}  ./src/
#VOLUME /data/mysql
EXPOSE 80/tcp
RUN cd /usr/local/src/ && \
   tar -xf  ${WEB_SERVER_VERSION}
示例2
FROM nginx:1.14-alpine

LABEL maintainer="leveldc<leveldc@126.com>"

ENV NGX_DOC_ROOT="/data/web/html/"
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/

EXPOSE 80/tcp
HEALTHCHECK --start-period=2s CMD wget -O -q http://${IP:-0.0.0.0}:${PORT:-80}/
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

ENTRYPOINT ["/bin/entrypoint.sh"]
示例3
FROM busybox
LABEL maintainer="leveldc<leveldc@126.com>" 
ENV DOCKER_ROOT="/data/web/html/"

RUN mkdir -p  ${DOCKER_ROOT} && \
   echo "hello world" > ${DOCKER_ROOT}index.html
# CMD /bin/httpd -f -h ${DOCKER_ROOT}
ENTRYPOINT /bin/httpd -f -h ${DOCKER_ROOT}

~~完

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值