前言:本文转自博主逆袭的小学生《docker入门(利用docker部署web应用)》(https://blog.csdn.net/q610376681/article/details/90483576),并结合官网内容加以补充,本文仅为我的学习记录,需要原文请点击链接
目录
第一章 什么是docker 1
第二章 docker基础知识 2
第三章 centos下docker安装 4
第四章 docker基本命令 5
第五章 其他补充 6
第一章 什么是docker
1.1 什么是Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
1.2 Docker的优势
1.3.1 解决系统环境不一致问题
开发:我本地没问题,运维:服务器没问题.,这个问题就变成了皮球.
一个java we应用要正常的启动需要一个操作系统,操作系统之上要jdk,tomcat,代码,配置文件等,任何微小差异都可能带来问题。docker把操作系统,jdk,tomcat,代码,配置全部放到一个容器.再打包推送到镜像仓库,使用时直接拉取,在本地和,在别的机器上运行环境是一样的.docker解决了运行环境不一致所带来的问题.
1.3.2 解决被别的程序影响导致系统卡顿问题
公用服务器时,常常会部署多个服务,可能会出现一个服务不停占用CPU,或者疯狂输出日志等导致磁盘空间不足,导致其他服务无法正常运行的现象,docker的隔离性可以解决这个问题,因为docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程。
1.3.3 扩容方便
可以直接使用命令扩容,方便快捷。
第二章 docker基础知识
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
镜像(image):类似一个模板,可以通过这个模板创建容器。
容器(container):用镜像安装包安装容器,理解为小的linux系统,容器之间互相隔离。
仓库(repository):存放镜像的地方。远程,需要设置国内仓库。
Docker是一个Client-Server结构系统的守护进程。
Docker比虚拟机更少的抽象层,docker利用的是宿主机的内核。
UnionFS联合文件系统:分层、轻量、 高性能。.
2.1 镜像
镜像的英文名交image.从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?
说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下.
下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起.这就是镜像最直观的存储方式.下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,如果是我们自己的程序,就可以是tomcat,jdk,再往上是应用代码,每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的.注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.
2.2 容器
为了便于理解,大家可以把容器想象成虚拟机,每个虚拟机都有自己的文件系统,可以把图1整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的.为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统.
在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层.
由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰.
2.3 仓库
我们的镜像是要在其它机器上运行,如何进行传输呢?
这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程.
第三章 centos下docker安装
参考博客与网站:
https://www.jb51.net/article/161580.htm
https://blog.csdn.net/jsnhux/article/details/89847109
https://docs.docker.com/install/linux/docker-ce/centos/
- Docker 要求 CentOS 系统的内核版本高于 3.10,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
- 如果安装过请先卸载
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
3.安装依赖设置yum仓库
安装依赖:
yum install -y yum-utils
device-mapper-persistent-data
lvm2
设置仓库:
yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo
4. 安装docker
yum install docker-ce docker-ce-cli containerd.io
5. 启动并加入开机启动
systemctl start docker
systemctl enable docker
6.验证是否安装成功
docker version
docker run hello-world
显示如下即安装成功!
第四章 docker基本命令
4.1. docker pull [options] NAME[:TAG]
通过此命令可以docker远程仓库拉取镜像到本地.
name是拉取镜像的名称,:TAG表示是可选的,如果不选默认是latest,如果选择表明是指定版本的.
options是拉去的一些参数.
当不加请求地址的时候回去docker的官网拉取镜像.
4.2. docker images [options] [REPOSITORY[:TAG]]
options是选项,后面是指定镜像的名称.这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像.
IMAGE ID 其实是一个64位的字符串,它可以唯一标识我们的镜像,这里只显示了16位,后面的被截掉了.
4.3. docker run [options] IMAGE[:TAG] [COMMAND] [ARG…] 新建容器并启动
–name 设置容器名,用来区分容器
-d 后台启动。
-p [主机端口:容器端口] 指定容器端口。
-v 挂载容器外部配置文件,因为修改容器内配置文件十分麻烦,需要进入 等。
IMAGE是镜像的名字
COMMAND是运行起来的时候要执行什么命令.
ARG表示这条命令运行需要的参数.
4.4. 其他常用命令
docker ps :查看正在运行的容器 , 加上-a更好。
docker start:运行已经安装的容器。
docker stop:停止已经运行的容器。
docker search xx:搜索镜像。
docker rm :卸载安装的容器。
docker rmi :删除镜像。
docker exec -it xx bash:进入正在运行的容器,容器内目录结构和linux相似。
exit:推出容器。
docker logs:查看日志
docker top:查看容器详细信息。
docker cp :从容器中拷贝文件到虚拟机。
docker stats:查看cpu内存。
docker commit:提交容器成为一个新的镜像。
docker volume ls: 查看挂载情况。
docker inspect : 查看容器信息,json格式,信息全面。
docker history : 镜像构建历史。
4.5. docker运行镜像流程
docker pull:首先docker pull向docker daemon发送了一条命令pull,告诉docker daemon要拉取某一个镜像,docker daemon会在本机检查镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作.如果不存在下一步它会到docker的仓库中找我们要拉取的镜像名字,如果找到了就会有docker仓库传送到我们的本地,把我们要的镜像传送到我们的本地来.
docker run:首先把命令发送到我们的docker daemon,docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成docker容器.
第五章 其他补充
5.1 Docker网络
5.1.1 网络介绍
Docker具有隔离性,网络也是个隔离性的一部分,linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的.每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的.
-
docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式.
在使用Bridge时就涉及到了一个问题,既然它有独立的namesapce,这就需要一种技术使容器内的端口可以在主机上访问到,这种技术就是端口映射,docker可以指定你想把容器内的某一个端口可以在容器所在主机上的某一个端口它俩之间做一个映射,当你在访问主机上的端口时,其实就是访问容器里面的端口. -
还有一种类型是Host模式,如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip.而是使用宿主机上的ip和端口.也就是说在docker上使用网络和在主机上使用网络是一样的.
-
还有一种网络类型是None.也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯.
5.1.2 实际访问端口
- -p(小写)是开放一个容器的端口到主机上
在后台运行,开放主机8080端口映射到容器的80端口上.
docker run -d -p 8080:80 hub.c.163.com/library/nginx
查看主机8080端口是否开启
netstat -na |grep 8080
是开启的那么访问 主机ip:8080 即可访问到nginx.
-
-P(大写)是开放容器所有的端口到主机上一个随机的端口.
停掉刚才的docker服务.
使用大P
docker run -d -P hub.c.163.com/library/nginx
可以看到随机给我的端口是32768
然后用 ip:32768去访问即可访问到nginx.
5.2 DockerFile 结构
Dockerfile相当于docker构建镜像的说明书,docker会根据Dockerfile中的构建命令一步一步的构建镜像,每一步构建指令都会产生一个镜像,在这个镜像的基础上在执行下一步构建指令,运行dokcer build命令可以构建镜像,此时会将工作目录下的所有文件发送给docker守护进程(不管构建过程是不是需要)
1)Parser directives
Parser directives会影响docker后续处理行的方式,它不会在构建中填加额外的层,目前docker支持的Parser directives只有escape
使用格式:#directive=value
备注:置于首行。
2)escape
定义转义符号,目前支持两种形式
escape=\ (backslash)
escape=` (backtick)
如果在dockerfile中未指定,则默认为
3)ENV
dockerfile中可以使用环境变量:
v
a
r
i
a
b
l
e
n
a
m
e
或
是
variable_name或是
v
a
r
i
a
b
l
e
n
a
m
e
或
是
{variable_name},这两种格式被同等对待,但是括号可以处理空格的状态,
${variable_name}具有更多的用法:
${variable:-word}:如果variable值没有被指定,那么将使用word作为值
${variable:+word}:如果variable值被指定,那variable最终的值将是word,如果没有被指定,则默认为空字符串
环境变量也会被转义字符转义:
COPY $foo /quux 等效于 COPY $foo /quux
环境变量的值可以通过ENV指令指定,ENV定义的值只有在ENV命令外才会生效
#一行只能设置一个全局变量,双引号会被去除
ENV
#一行可以设置多个全局变量
ENV = …
要点:
ENV指令设置的key-value相当于全局变量
ENV指令设置的全局变量会持久化,可以使用docker inspect查看,可以使用docker run –env =更改其中的值
4).dockerignore文件
docker build指令会将工作目录的所有文件发送给docker守护进程,在此之前,docker会检查工作目录下是否存在.dockerignore文件,通过.dockerignore文件,我们可以指定哪些文件不用发送给docker守护进程,.dockerignore文件以一行为单位,表示哪些文件不需要添加到docker守护进程,.dockerignore中的文件路径都是相对于工作目录而言,如果我们在一行的前面标记#,则改行被当作注释:
#comment
/temp
/
/temp*
temp?
.dockerignore也支持通配符,**表示匹配任意数目的目录,!表示排除在外的意思,例如:
.md
!README.md
除了README.md以外的所有.md文件都会被排除在外,.dorckerignore文件的最后一行具有最高的优先级,它会覆盖之前的匹配,例如:
.md
!README
.md
README-secret.md
即使README-secret.md匹配!README
.md,由于README-secret.md在最后一行,因此仍然会将README—secret.md移除,再如:
.md
README-secret.md
!README
.md
README-secret.md不会被移除,因为!README*.md在最后一行
docker一定会见工作目录的Dockerfile文件发完docker守护进程,即使在.dockeringnore中声明Dockerfile
5)FROM
FROM指令具有三种格式:
FROM [AS ]
FROM [:] [AS ]
FROM [@] [AS ]
要点:FROM为接下来的构建指令指定基础镜像,一个有效的Dockerfile文件必须以FROM指令开头
除arg指令以外的构建指令都不能出现在FROM之前,Dockerfile文件可以出现多个FROM指令,此时一个Dockerfile可以构建多个image,并且输出这些image的ID,在执行FROM指令时,之前构建命令生成的状态会被清空,若arg指令位于FROM之外,FROM内部的指令不能引用arg,如果想使用,必须声明一遍:
ARG VERSION=latest
FROM busybox:
KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 9: VERSION #̲声明过后,才能替换RUN指令为…
VERSION为latest
ARG VERSION
RUN echo $VERSION > image_version
FROM指令允许添加镜像的别名(指令中的[AS ]),在接下来的FROM指令或是COPY –from=<name|index>指令中可以引用这个镜像
tag与digest指镜像的版本信息,如果不指定,则默认为latest
6)RUN
RUN指令有两种形式:
#shell形式,命令会运行在shell脚本上,在linux上默认为/bin/sh -c,在windwos上默认为cmd /S /C
RUN
#exec形式
RUN[“executable”,“param1”,“param2”]
要点:
RUN指令会在当前镜像的基础上执行命令
如果当前镜像不支持默认的shell,可以使用第二种形式,exec形式会解析成JSON数组,所以不能使用单引号
RUN [“/bin/bash”, “-c”, “echo hello”]
可以通过SHELL指令更改默认的shell环境
exec形式不会默认调用shell,类似于RUN [ “echo”, “$HOME” ]的指令(需要环境变量解析)将不会得到解析,环境变量解析的工作由shell进行,不是docker
RUN命令的执行结果会进行缓存,以便加快二次构建的速度,可以使用docker build –no-cache,禁止使用缓存
7)CMD
CMD指令具有三种形式
#exec形式,推荐使用
CMD [“executable”,“param1”,“param2”]
#作为ENTRYPOINT指令的参数
CMD [“param1”,“param2”]
#shell形式
CMD command param1 param2
要点:
dockerfile中只有一条CMD指令会生效,如果有多条,只有最后一条CMD指令生效
CMD指令主要为ENTRYPOINT提供默认值,此时CMD指令与ENTRYPOINT指令都必须使用exec格式
exec指令会解析成JSON格式,因此必须使用双引号
exec形式不会调用shell,这意味着CMD [ “echo”, “$HOME” ]不会进行环境变量解析,如果想要使用,更改为CMD [ “sh”, “-c”, “echo $HOME” ],环境变量的解析均有shell负责,而不是docker
当镜像运行时才会运行CMD指令,而RUN是在构建阶段运行
如果使用shell形式,命令会运行在/bin/sh -c上
如果不想运行在shell上,就使用exec形式,但是要指明可执行文件的位置
如果在docker run命令上添加了参数,会覆盖CMD中对应的默认值
8)LABEL
LABEL = = = …
要点:
LABEL命令增加元数据到image中(描述作用)
LABEL命令使用key-value模式
子image会继承父image的LABEL,同时可以覆盖其中的值
可以使用docker inspect命令查看Labels
9)MAINTAINER
MAINTAINER
要点:
指定image的创作者
10)EXPOSE
EXPOSE [/…]
要点:
EXPOSE让container在运行时监听特定的端口,可以指定端口运行tcp或是udp命令,默认情况下为tcp
EXPOSE 80/udp
EXPOSE命令不会真正发布端口,只是image构建者告诉container运行者应该如何映射端口
docker run指令的-p参数可以指定端口映射,以及对应的协议,此时才会发布端口
docker run -p 80:80/tcp -p 80:80/udp …
11)ADD
ADD [–chown=:] …
#当存在空格时,只能使用这种形式
ADD [–chown=:] [“”,… “”]
要点:
[–chown=:]只在linux上有效,用于指定用户以及用户组
ADD指令将文件、文件夹、URL处的文件(夹)拷贝到指示的位置
如果不是URL,则文件与文件夹的位置都是是相对于工作目录的,即相对目录
可以使用通配符
ADD hom* /mydir/ # adds all files starting with “hom”
ADD hom?.txt /mydir/ # ? is replaced with any single character, e.g., “home.txt”
.只能是绝对路径或相对于WORDIR(稍后会介绍的指令)
ADD test relativeDir/ # adds “test” to
WORKDIR
/relativeDir/
ADD test /absoluteDir/ # adds “test” to /absoluteDir/
除非指定了–chown,否则所有新创建的文件以及目录的UID与GID均为0,–chown允许UID以及GID为数字或是字符串,也可以是两者的组合,/etc/passwd和/etc/group文件会被用来将字符串转换为对应的数字形式的UID以及GID,如果只指定了UID,GID默认取UID的值
如果URL需要验证登陆,ADD指令需要与RUN wget、RUN curl指令搭配使用(提供账号密码)
如果使用STDIN给出Dockerfile,可能会没有上下文,此时ADD指令只能通过URL获取资源
#没有上下文
docker build -< Dockerfile
#解压后的文件作文上下文
docker build – < archive.tar.gz
如果发生了改变,包括ADD在内的接下来的所有构建指令的缓存都会无效化
如果是URL,而是文件夹,则文件名有URL中自动推算得知,例如ADD http://example.com/foobar /,在/下对应的文件名为foobar
如果是文件夹,则文件夹的所有内容都会被拷贝到
如果是压缩文件,则ADD会将其解压,URL对应的压缩文件不会被解压,一个文件会不会被解压不是由文件后缀决定,而是文件内容
将多个文件或是文件夹ADD到,必须是一个文件夹,并且以/结尾,否则会被认为是一个文件
如果不存在,则ADD指令会创建对应的文件路径
12)COPY
copy有两种形式:
COPY [–chown=:] …
#如果路径包括空格,则使用这种格式
COPY [–chown=:] [“”,… “”]
要点:
copy将文件从拷贝到,与ADD不同,它不支持从URL获取文件或文件夹,其余使用与ADD基本一致
copy指令可以使用–from=<name|index>引用之前构建阶段的镜像(FROM …AS创建的镜像),如果在之前的构建阶段找不到对应的镜像,则会尝试使用相同名字的镜像(从远程下载),也可以指定index,从而引用某个镜像(name指定)某个构建阶段(index指定)对应的镜像
13)ENTRYPOINT
ENTRYPOINT具有两种写法:
#exec形式
ENTRYPOINT [“executable”, “param1”, “param2”]
#shell形式
ENTRYPOINT command param1 param2
要点:
运行docker run指令后会运行的指令
docker run指令后面的参数或是命令会附加到ENTRYPOINT上,会覆盖cmd对应的值,例如cmd指令指定了-name的值,如果使用docker run -name…,则容器最终的name为docker run指定的值
通过docker run –entrypoint会替换ENTRYPOINT的值
shell形式不接受cmd指定的参数,shell形式有一个缺点,就是启动的可执行程序不会接收信号,如果我们运行docker stop指令,可执行程序将不会接收到停止信号
如果定义了多条entrypoint指令,只有最后一条可以生效
cmd指令与ENTRYPOINT指令的关系
两者均制定了容器运行时执行的命令
Dockerfile应该至少指定CMD或是ENTRYPOINT中的一个
CMD可以为ENTRYPOINT指定参数值
CMD指定的值可以被命令中对应的参数值替换,两者的协作效果如下
14)VOLUME
命令格式:
#定义匿名数据卷
VOLUME [“/data”]
要点:
VOLUME指令用于创建一个挂载点,挂载点用于存储持久化数据,一般不建议将数据存储在Docker容器的可写层(原因我还没看),挂载点可以理解为就是一个用于存储数据的文件,只是这个文件由docker统一管理,当然,也可以将本地文件映射成挂载点,此时数据将写入到本地文件中
volume分为两种,一种是匿名卷,一种是实名卷,匿名数据卷就是未映射到本文将的卷,一般存储在/var/lib/docker/volumes中,当容器被删除时,对应的卷也会被删除,实名卷映射到了本地文件,当容器被删除时也不会被删除
实名卷只可以通过docker run -v指定,例如docker run -v /var/temp:/app
docker run指令会保留作为卷的文件之前的数据,例如:
FROM ubuntu
RUN mkdir /myvol
RUN echo “hello world” > /myvol/greeting
VOLUME /myvol
/myvol中将存在greeting文件,并且该文件保留hello world的字符
在windows上使用卷时,挂载文件必须存储在空文件夹或是一开始不存在的文件夹下,并且文件夹不能存储在C盘
使用实名卷需要注意,实名卷可能会影响容器的移植性,因为实名卷对应的文件结构受操作系统的影响,因此,我们不能在Dockerfile中指定使用实名卷(影响移植性),只能通过docker run -v指令
15)USER
格式:
USER [:] or
USER [:]
要点:
用于指定运行image、RUN、CMD、ENTRYPOINT的user和group,只有对应的user以及group可以运行image
如果user没有对应的group,则默认使用root
16)WORKDIR
命令格式:
WORKDIR /path/to/workdir
要点:
RUN、CMD、ENTRYPOINT、COPY、ADD指令可以使用,当这些指令未指出工作目录时,则默认使用WORKDIR指定的目录作为工作目录
如果WORKDIR指定的目录不存在,则会默认创建
WORKDIR指令可以使用多次,如果使用相对路径,会承接到之前的WORKDIR指定的路径中,例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
RUN指令指定的文件为 /a/b/c/pwd
WORKDIR指令可以使用ENV指定的环境变量,例如:
ENV DIRPATH /path
WORKDIR $DIRPATH/b
RUN pwd
RUN指令指定的文件为/path/b/pwd
17)ARG
命令格式:
ARG [=]
要点:
ARG定义参数的值必须通过docker build –build-arg = 指定
dockerfile文件可以使用多个ARG参数
FROM busybox
ARG user1
ARG buildno
…
一般不建议将账号密码等敏感信息作为ARG参数的值,因为可以通过docker history命令查看到
ARG指令可以指定参数的默认值
ARG指令只对位于自己下方的指令有效,镜像构建完毕后就会失效,如果想在多个镜像的构建过程中使用,则在多个镜像的构建过程中指定相同的ARG:
FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS
FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
ENV指令会覆盖ARG指令中相应的参数,例如:
1 FROM ubuntu
2 ARG CONT_IMG_VER
3 ENV CONT_IMG_VER v1.0.0
4 RUN echo $CONT_IMG_VER
运行指令docker build –build-arg CONT_IMG_VER=v2.0.1 .
CONT_IMG_VER的值将是v1.0.0
有些ARG参数是预定义的:
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
可以直接使用,这些参数的值不会被docker history输出,我们也可以自己覆盖这些参数
如果指定的ARG指令与之前构建阶段的不同,如果在其他指令中使用过ARG,则会出现缓存缺失,但如果它的值杯ENV指令覆盖,则不会出现:
1 FROM ubuntu
2 ARG CONT_IMG_VER
3 ENV CONT_IMG_VER hello
4 RUN echo $CONT_IMG_VER
因为ARG指令的CONT_IMG_VER杯ENV覆盖了,所以不会出现缓存确实
18)ONBUILD
ONBUILD [INSTRUCTION]
要点:
指定运行镜像后紧接着执行的命令
这个指令是如何起作用的呢?在构建镜像时,builder会将ONBUILD指令的值添加到镜像的OnBuild中,可以通过运行docker inspect查看,当其他镜像使用这个镜像时,builder会查看OnBuild区域,并且按顺序执行它们,OnBuild区域的值不会被继承
19)STOPSIGNAL
STOPSIGNAL signal
要点:
使用这个指令允许用户自定义应用在收到 docker stop 时所发送的信号
20)HEALTHCHECK
#通过运行容器中的指令来判断容器是否健康,CMD可以是shell或是exec形式
HEALTHCHECK [OPTIONS] CMD command
#禁止所有父镜像的健康检查
HEALTHCHECK NONE
要点:
这条指令用于检查容器的健康状况
如果容器指定了健康检查,会添加额外的health字段,这个字段一开始是starting,当健康检查通过以后,会更改为healthy,如果几次尝试都失败,则会设置为unhealthy
OPTIONS字段
#两次健康检查的间隔
–interval=DURATION(默认为30s)
健康检查命令运行超时时间,如果超过这个时间,本次健康检查视为失败
–timeout=DURATION(默认为30s)
#应用启动的初始化时间,在启动过程中的健康检查失效不会计入
–start–period=DURATION(默认为0s)
#当连续失败指定次数后,则将容器状态视为unhealthy
–retries=N(默认为3次)
如果有多条HEALTHCHECK,只有最后一条才会起作用
这条命令执行完毕后,会输出一个数字:
#成功
0:success
#失败
1:unhealthy
#保留字段,没有意义
2:reserved
21)SHELL
SHELL [“executable”, “parameters”]
要点:
用于指定shell形式的命令运行的shell环境,linux默认的shell环境为[“/bin/sh”,”-c”],windwos默认为[“cmd”,”/S”,”/C”]