Dockerfile
Docker 并不建议用户通过commit方式构建镜像。原因如下:
- :这是一种手工创建镜像的方式,容易出错,效率低且重复性弱。
- :使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,存在安全隐患。
用Dockerfile构建镜像,底层也docker commit 一层一层构建新镜像的。
1.运行docker build命令,-t将新镜像命名,末尾的.指名build context为当前目录,从当前目录下寻找Dockerfile,也可以用-f指定Dockerfile的位置。
2.首先Docker将build context中的所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。Dockerfile中的ADD,COPY等命令可以将build context中的文件添加到镜像。、
查看镜像分层结构
docker history会显示镜像的构建历史。
docker history centos-yum:latest
镜像的缓存特性
Docker会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。
如果我们希望在构建镜像时不使用缓存,可以在docker build命令中加上–no-cache参数。Dockerfile中每一个指令都会创建一个镜像层,上层依赖于下层,只要某一层发生变化,其上面的缓存都会失效。
FROM
功能为指定基础镜像,并且必须是第一条指令,如果不以任何为镜像,那么写法为:FROM scratch。
FROM <image>
FROM <image>:<tag>
FROM <image>:<digset>
FROM centos7
RUN
为运行指定的命令,有两种格式:(构建是就执行的命令)
1:RUN 后面直接跟shell命令,linux中默认 /bin/sh -c
2:RUN[“executable”,“param1”,“param2”] executable为可执行文件,后面是参数
RUN yum -y install httpd
RUN ["/bin/bash","-c","echo hello"]
注意:多行命令不要写多个run,建议使用换行符
CMD
容器启动时要运行的命令
1.CMD [“executable”,“param1”,“param2”]
2.CMD [“param1”,“param2”]
3.CMD command param1 param2
CMD ["ls,"/tmp"]
注意:必须要用双引号
LABEL
为镜像指定标签
LABEL <key>=<value>…
如果有很多建议写到一行,用换行符 \
LABEL com.example.vendor="huhuhuhuhu" \
com.example.vendor2="huhuhuhuhuhuhuhuhuhuh"
LABEL会继承基础镜像的LABEL,若key相同,则覆盖
MAINTAINER
指定作者
MAINTAINER huge
EXPOSE
开放端口,必须在容器启动的时候加上-P参数
EXPOSE 80
ENV
设置环境变量
ENV 变量=参数 (可以一次设置多个)
ENV ip=www.ip.com
ADD
复制命令,将文件复制到镜像中。
并且如果复制的是一个包文件,会将其自动解包
ADD text.txt /tmp
ADD http://www.test.com/text.txt /tmp
源地址 目标地址
COPY
COPY text.txt /tmp
不支持url,
ENTRYPOINT
启动时的默认命令
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2
ENTRYPOINT ["ls","/tmp"]
也可以不加文件或目录
ENTRYPOINT ["ls"]
在容器启动时后面加上可执行文件
docker run -it centos-yum:latest /tmp
与CMD一起使用时:可以查看CMD指定的文件或目录
CMD ["/etc","/"]
ENTRYPOINT ["ls"]
如果我们同时写了CMD与ENTRYPOINT,并且都是完整指令,那么会覆盖,谁在后面谁生效
USER
设置启动容器的用户
USER daemo
USER UID
USER www
注意:如果设置了容器以daemon用户去运行,那么RUN,CMD,和ENTRYPOINT都会以这个用户去运行
WORKDIR
设置工作目录
WORKDIR /www
对RUN,ENTRYPOINT,COPY,ADD生效。
如果不存在则会创建,也可以设置多次
WORKDIR /A
WORKDIR /B
WORKDIR /C
RUN pwd
执行结果是 /A/B/C
WORKDIR也可以解析环境变量
ENV DIR /path
WORKDIR $DIR
ARG
ARG 设置变量命令,ARG定义了一个变量,在docker build创建的时候,使用 --build-arg =来指定参数
也可以给一个默认值
ARG user1="www"
ONBUILD
ONBUILD [INSTRUCTION]
只对当前的子镜像生效
ONBUILD RUN touch 1.txt
STOPSIGNAL
当容器退出时发送一个什么样的指定给系统
HEALTHCHECk
容器健康状况检查:
-
HEALTHCHECK [OPTIONS] CMD command 是在容器内部运行一个命令来检查容器的健康状况
-
HEALTHCHECK NONE第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三中选项:--interval=DURATION 两次检查默认的时间间隔为30秒 --timeout=DURATION 康检查命令运行超时时长,默认30秒 --retries=N 连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy, 默认次数是3
0: success -表示容器是健康的
1: unhealthy-表示容器已经不能工作了
2: reserved -保留值
HEALTHCHECK - - interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
健康检查命令是: curl -f http://localhost/ || exit 1 两次检查的间隔时间是5秒 命令超时时间为3秒