[Docker]HEALTHCHECKオプションを試す

2016.07.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。小ネタです。

Docker1.12.0-rc3がリリースされてました。

今回は、その中から「HEALTHCHECK」オプションを試してみました。HEALTHCHECKオプションはdockerバージョンが1.12以降で利用できます。

オプション

指定可能なオプションは以下となります。

--health-cmd string           # ヘルスチェック用のコマンドを指定
--health-interval duration    # ヘルスチェック間隔を指定(秒)
--health-timeout duration     # ヘルスチェック時のタイムアウトを指定(秒)
--health-retries int          # ヘルスチェック失敗時のリトライ回数を指定

やってみた

まず、dockerのバージョンを確認します。

1.12より古い場合は、バージョンアップを行ってください。私はMac環境なので、Docker for Macを入れました。

local$ docker --version
Docker version 1.12.0-rc3, build 91e29e8, experimental

nginxのイメージにcurlを入れます。

local$ cat Dockerfile
FROM httpd:2.2.31-alpine
RUN apk update && apk add curl
local$ docker build --tag httpd-healthcheck .

ヘルスチェックオプションを付けて起動します。

$ docker run -d -p 80:80 --name httpd --health-cmd "curl -f http://localhost/ || exit 1" --health-interval=30s --health-timeout=30s --health-retries=3 httpd-healthcheck

ヘルスチェックステータスを確認してみます。コンテナ起動直後、STATUSでヘルスチェックが実行している様子が見えますね。しばらくするとhealthyになります。

local$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                             PORTS                NAMES
f2190cd08805        httpd-healthcheck   "httpd-foreground"   31 seconds ago      Up 30 seconds (health: starting)   0.0.0.0:80->80/tcp   httpd
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                    PORTS                NAMES
2f1dd26c4c03        httpd-healthcheck   "httpd-foreground"   40 seconds ago      Up 40 seconds (healthy)   0.0.0.0:80->80/tcp   httpd

inspectでもステータスを見てみます。Outputとして実行結果も見れます。

--- 省略 ---

                "Health": {
                "Status": "healthy",
                "FailingStreak": 0,
                "Log": [
                    {
                        "Start": "2016-07-14T02:15:37.46947964Z",
                        "End": "2016-07-14T02:15:37.554410283Z",
                        "ExitCode": 0,
                        "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eIt works!\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e\r100    44  100    44    0     0  42677      0 --:--:-- --:--:-- --:--:-- 44000\n"
                    },
                    {
                        "Start": "2016-07-14T02:16:07.560725123Z",
                        "End": "2016-07-14T02:16:07.630002371Z",
                        "ExitCode": 0,
                        "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eIt works!\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e\r100    44  100    44    0     0  68217      0 --:--:-- --:--:-- --:--:-- 44000\n"
                    },
                    {
                        "Start": "2016-07-14T02:16:37.632486565Z",
                        "End": "2016-07-14T02:16:37.722443135Z",
                        "ExitCode": 0,
                        "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eIt works!\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e\r100    44  100    44    0     0  42718      0 --:--:-- --:--:-- --:--:-- 44000\n"
                    },

--- 省略 ---

強制的にunhealthyにしてみました。

local$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                   PORTS                NAMES
eadbd69e92e9        httpd-healthcheck   "httpd-foreground"   5 minutes ago       Up 5 minutes (healthy)   0.0.0.0:80->80/tcp   httpd
local$ docker exec httpd rm /usr/bin/curl
local$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                      PORTS                NAMES
eadbd69e92e9        httpd-healthcheck   "httpd-foreground"   18 minutes ago      Up 18 minutes (unhealthy)   0.0.0.0:80->80/tcp   httpd

unhealthyになりました。

さいごに

ヘルスチェック機能が追加されました。inspectで状態を取れるので監視にも期待が持てますね。 他にも1.12.0-rc3にてリリースされ沢山の機能は、こちらから確認可能です。

興味のある方は是非。

参考

Docker 公式ドキュメント