zoukankan      html  css  js  c++  java
  • Dockerfile(12)

    HEALTHCHECK

    作用

    • 健康检查
    • 当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy

    格式

    # 设置检查容器健康状况的命令
    HEALTHCHECK [选项] CMD <命令>
    
    # 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
    HEALTHCHECK NONE

    记住选项后面是接 CMD 哦

    注意

    和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效

    HEALTHCHECK 返回值

    决定了该次健康检查的成功与否:0:成功;1:失败;2:保留(不要使用这个值)

    为啥要用 HEALTHCHECK

    • 在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常
    • 很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了
    • 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求
    • 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态

    HEALTHCHECK 支持的选项

    •  --interval=<间隔> :两次健康检查的间隔,默认为 30 秒;
    •  --timeout=<时长> :健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
    •  --retries=<次数> :当连续失败指定次数后,则将容器状态视为 unhealthy ,默认 3

    实际小栗子

    假设有个镜像是个最简单的 Web 服务,希望增加健康检查来判断其 Web 服务是否在正常工作,可以用 curl 来帮助判断其

    dockerfile

    FROM nginx
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
    HEALTHCHECK --interval=5s --timeout=3s 
      CMD curl -fs http://localhost/ || exit 1

    如果返回 1 则退出

    执行 docker build

    $ docker build -f HEALTHCHEK.dockerifle -t myweb .

    执行 docker run

    docker run -d --name web -p 80:80 myweb

    查看容器状态

    docker ps

    • 刚启动时的状态是 health:starting,过多几秒后就变成 healthy 了
    • 如果健康检查连续失败超过了重试次数,状态就会变为  unhealthy

    查看容器健康检查信息

    为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看

    > docker inspect --format '{{json .State.Health}}' web | python -m json.tool
    {
        "FailingStreak": 0,
        "Log": [
            {
                "End": "2021-10-31T04:43:58.8446416Z",
                "ExitCode": 0,
                "Output": "<!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body {  35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    ",
                "Start": "2021-10-31T04:43:58.7591924Z"
            }
        ],
        "Status": "healthy"
    }
  • 相关阅读:
    Retrofit2.0+OkHttp设置统一的请求头(request headers)
    Retrofit、Okhttp使用小记(cookie,accesstoken,POST
    quartz持久化部署实现
    支付宝支付-常用支付API详解(查询、退款、提现等)
    支付宝支付-提现到个人支付宝
    Git 版本还原命令
    CEF JS实现获取剪贴板图片的DataURL
    CEF 自定义用户协议(scheme)实现以二进制流的方式显示图片、视频、音频
    CEF C++调用前端js方法展示传递过来的图片数据
    C++读写图片数据转成Base64格式
  • 原文地址:https://www.cnblogs.com/poloyy/p/15489102.html
Copyright © 2011-2022 走看看