暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

容器状态Up但是应用不可用,怎么办?

运维笔谈 2025-02-08
126

使用docker run运行容器时,可以指定--restart always选项。当容器崩溃时,docker daemon会重启容器。需要长期运行的容器,这个选项非常有用。但是,如果容器的确在运行,但是不可用怎么办?

我们可以在Dockerfile中使用 HEALTHCHECK 该指令可以让Docker周期性的检查容器的健康状况。只需要指定一个命令,如果一切正常的话返回0,否则返回1。当请求失败时,curl --fail 命令返回非0状态,这样容器就会触发自动重启。

    # dockerfile
    HEALTHCHECK [选项] CMD <命令>

    HEALTHCHECK 健康检查默认[选项]如下:

    • --interval=<间隔时间>:两次健康检查之间的间隔时间,默认为 30 秒。

    • --timeout=<超时时间>:单次健康检查的最大执行时间,默认为 30 秒。

    • --start-period=<启动时间>:容器启动后,健康检查的初始延迟时间,默认为 0 秒。

    • --retries=<重试次数>:健康检查失败后的重试次数,默认为 3 次。


    一、HEALTHCHECK 使用参考命令

      #dockerfile
      HEALTHCHECK CMD curl --fail http://localhost:3000 || exit 1

      二、示例命令解释

      curl --fail http://localhost:3000:使用 curl 命令访问容器内运行的服务。

      1. --fail:如果 HTTP 响应状态码不是 200(即请求失败),curl 会返回非零退出码。

      2. http://localhost:3000:访问容器服务的指定端口,相当于服务探活。


      || exit 1

      1. 如果 curl 命令失败(即返回非零退出码),则执行 exit 1,表示健康检查失败。

      2. 如果 curl 命令成功(即返回零退出码),则健康检查通过。


      三、具体工作原理和过程

      1. Docker 会定期执行 HEALTHCHECK 指令中定义的命令。

      2. 如果命令返回零退出码(表示成功),Docker 认为容器是健康的。

      3. 如果命令返回非零退出码(表示失败),Docker 认为容器不健康。

      4. 如果健康检查失败多次(默认 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 次。


        运维笔谈已经开通AI智能对话功能,解答有关运维日常工作中遇到的问题以及经验分享,感兴趣的大佬来和我聊聊吧!对话 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》

        文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论