目录
Dockerfile命令
FROM | 指定基础镜像 |
RUN | 在镜像中执行命令 |
CMD | 指定容器启动时要执行的命令 |
LABEL | 为Docker镜像添加元数据 |
MAINTAINER | 用于指定镜像的创建者和联系人信息 |
EXPOSE | 暴露端口 |
ENV | 设置环境变量 |
ADD | 类似于COPY,但是还支持解压缩和远程文件下载等功能 |
COPY | 将文件从主机复制到镜像中 |
ENTRYPOINT | 用于为容器指定启动时默认执行的命令或程序 |
VLOUME | 声明容器将要挂载的数据卷 |
USER | 用于设置Docker容器运行时的用户或用户组 |
WORKDIR | 设置工作目录 |
ARG | 用于定义构建时候的变量 |
ONBUILD | 用于定义镜像的下一级构建动作 |
STOPSIGNAL | 用于设置容器停止时捕获的信号 |
HEALTHCHECK | 用于设置容器的健康检查 |
FROM
它的功能是指定基础的镜像,并且必须是第一条的指令,如果不以任何镜像为基础,那么写法为:FROM scratch。同时以为这接下来所写的指令将作为镜像的第一层开始
[root@localhost ~]# cat Dockerfile
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
三种写法,其中tag和digest是可选项,如果没有选择,那么默认值为latest
RUN
在构建镜像时所要执行的命令
[root@localhost ~]# cat Dockerfile
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行符是\
CMD
功能是为容器启动时要运行的命令,而且整个dockerfile文件里只能有一个cmd命令
[root@localhost ~]# cat Dockerfile
CMD [ "sh", "-c", "echo $HOME" ]
CMD [ "echo", "$HOME" ]
RUN&CMD
RUN:是在构建这个镜像的时候所执行的命令
CMD:是在容器启动的时候执行的命令
LABEL
功能是为镜像指定标签
[root@localhost ~]# cat Dockerfile
LABEL <test>=<1>
LABEL <test>=<2>
LABEL <test>=<3>
当我们在定义标签的时候并不建议这样写多行,尽量写成一行,使用\符号来进行换行
[root@localhost ~]# cat Dockerfile
LABEL <test>=<1> \
<test>=<2> \
<test>=<3>
MAINTAINER
就是指定作者 语法:MAINTAINER
EXPOSE
功能是把运行的容器的端口暴露给外部,但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
[root@localhost ~]# cat Dockerfile
FROM centos:7
RUN yum -y install vim
EXPOSE "80":"80"
ENV
功能就是设置环境变量,这个变量在我们启动容器的时候还会有的变量
[root@localhost ~]# cat Dockerfile
ENV a="123"
ADD
一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用
可以是一个本地文件或者是一个本地压缩文件,还可以是一个url 如果把写成一个url,那么ADD就类似于wget命令
[root@localhost ~]# cat Dockerfile
ADD test.txt /usr/src/
ADD http://example.com/foobar / ##这个是把这个链接的包下载好放到镜像里
ADD nginx.tar.gz / ##这个可以把nginx的tar包自动解压在放到镜像里
当我们在ADD的时候源文件或者目录需要跟dockerfile文件放在一起,ADD在复制的时候找的源文件位置的当前的目录下,而目标位置则需要写绝对路径
COPY
COPY和ADD命令相似,但我们在COPY链接的时候COPY会把这个链接当成一个字符串进行复制,而COPYtar包的时候不会自动解压这个tar包
ENTRYPOINT
功能是启动时的默认命令
第二种就是写shell 第一种就是可执行文件加参数 与CMD比较说明(这俩命令太像了,而且还可以配合使用):
相同点: 只能写一条,如果写了多条,那么只有最后一条生效 容器启动时才运行,运行时机相同
不同点: ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
[root@localhost ~]# cat Dockerfile
FROM centos:7
ENTRYPOINT ls -a
CMD top -b
这样写会执行 top -b,ls -a 不会执行
VLOUME
可实现挂载功能,可以将内地文件夹或者其他容器中的文件夹挂在到这个容器中
[root@localhost ~]# cat Dockerfile
FROM centos:7
VOLUME /var/log /var/db
一般的使用场景为需要持久化存储数据时 容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。 所以当数据需要持久化时用这个命令
USER
设置启动容器的用户,也可以理解为在我们构建镜像时来回的切换用户,但是切换用户的前提是必须有这个用户
[root@localhost ~]# cat Dockerfile
FROM centos:7
USER 用户名
USER UID
注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行
WORKDIR
设置工作目录,也就是类似于cd命令来切换目录,当我们设置的这个工作目录不存在的时候会自动创建这个目录
[root@localhost ~]# cat Dockerfile
FROM centos:7
WORKDIR /a/b/c
WORKDIR /a
ARG
设置变量命令,在docker build构建镜像的时候用到的变量,当我们在启动容器的时候这个ARG变量会消失
[root@localhost ~]# cat Dockerfile
FROM centos:7
ARG user=test
ONBUILD
语法: ONBUILD [INSTRUCTION] 这个命令只对当前镜像的子镜像生效。
比如当前镜像为A,在Dockerfile种添加:
ONBUILD RUN ls -al 这个 ls -al 命令不会在A镜像构建或启动的时候执行
此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行
STOPSIGNAL
语法: STOPSIGNAL signal STOPSIGNAL命令是的作用是当容器退出时给系统发送什么样的指令
HEALTHCHECK
容器健康状况检查命令 语法有两种:
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE 第一个的功能是在容器内部运行一个命令来检查容器的健康状况 第二个的功能是在基础镜像中取消健康检查命令 [OPTIONS]的选项支持以下三中选项:
--interval=DURATION 两次检查默认的时间间隔为30秒
--timeout=DURATION 健康检查命令运行超时时长,默认30秒
--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3
注意:HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作了
2: reserved - 保留值
[root@localhost ~]# cat Dockerfile
FROM nginx
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1