
使用docker run运行容器时,可以指定--restart always选项。当容器崩溃时,docker daemon会重启容器。需要长期运行的容器,这个选项非常有用。但是,如果容器的确在运行,但是不可用怎么办?
我们可以在Dockerfile中使用 HEALTHCHECK 该指令可以让Docker周期性的检查容器的健康状况。只需要指定一个命令,如果一切正常的话返回0,否则返回1。当请求失败时,curl --fail 命令返回非0状态,这样容器就会触发自动重启。
# dockerfileHEALTHCHECK [选项] CMD <命令>
HEALTHCHECK 健康检查默认[选项]如下:
--interval=<间隔时间>:两次健康检查之间的间隔时间,默认为 30 秒。
--timeout=<超时时间>:单次健康检查的最大执行时间,默认为 30 秒。
--start-period=<启动时间>:容器启动后,健康检查的初始延迟时间,默认为 0 秒。
--retries=<重试次数>:健康检查失败后的重试次数,默认为 3 次。
一、HEALTHCHECK 使用参考命令
#dockerfileHEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1
二、示例命令解释
curl --fail http://localhost:3000:使用 curl 命令访问容器内运行的服务。
--fail:如果 HTTP 响应状态码不是 200(即请求失败),curl 会返回非零退出码。
http://localhost:3000:访问容器服务的指定端口,相当于服务探活。
|| exit 1
如果 curl 命令失败(即返回非零退出码),则执行 exit 1,表示健康检查失败。
如果 curl 命令成功(即返回零退出码),则健康检查通过。
三、具体工作原理和过程
Docker 会定期执行 HEALTHCHECK 指令中定义的命令。
如果命令返回零退出码(表示成功),Docker 认为容器是健康的。
如果命令返回非零退出码(表示失败),Docker 认为容器不健康。
如果健康检查失败多次(默认 3 次),Docker 会将容器标记为“不健康”状态,--restart always就会触发重启了。
四、完整的Dockerfile示例:
# 基础镜像FROM node:18# 设置环境变量ENV APP_PORT=3000# 将应用程序代码复制到容器中COPY . app# 设置工作目录WORKDIR app# 安装依赖RUN npm install# 定义健康检查HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \CMD curl --fail http://localhost:$APP_PORT || exit 1# 启动应用程序CMD ["node", "app.js"]
健康检查选项解释:
--interval=30s:每隔 30 秒进行一次健康检查。
--timeout=10s:每次健康检查的超时时间为 10 秒。
--start-period=5s:容器启动后,延迟 5 秒开始健康检查。
--retries=3:如果健康检查失败,最多重试 3 次。





