2020-03-31に更新

dockerをGracefulにreloadできるかどうか

TL;DR

Main

最近知ったんだけど、dockerにはlog-optというオプションがあり、これを使うことで簡易なログローテートを行うことができる。
- https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver

で、これを適用する必要があるんだけど、そういうときというのは大抵サービスが稼働中であり、サービスを止めずに設定を適用したい。例えばこれがNginxならreloadで(大抵の場合は)安全に設定を読み込ませることができるけど、それがdockerでも可能なのかどうか、ということを確認したい。

対象のdockerはCentOS7の上で動いているので、まずはUnitファイルを見る。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
...

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
...
[Install]
WantedBy=multi-user.target

ExecReloadが設定されているのでとりあえずsystemctl reload docker.serviceというコマンドを実行することはできそう。じゃあ次は、実際にコンテナが動作している最中に実行したらどうなるかを見てみる。

それっぽい状況を作るためにまず、Nginxのコンテナを立ち上げて外部から毎秒アクセスする。もう1つ適当なコンテナを立ち上げてコンテナ内部で毎秒dateコマンドを実行する。なお、どちらもフォアグラウンドで動かしている。もしdockerがgracefulに設定を読み込むことができるのならば、各コンテナは正常に動作し続けるはず。

まずはreloadする前の状態。

$ sudo systemctl status docker.service

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2018-12-05 14:55:37 JST; 4 months 4 days ago
     Docs: https://docs.docker.com
  Process: 27038 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 2432 (dockerd)
    Tasks: 57
   Memory: 632.9M
   CGroup: /system.slice/docker.service
           ├─ 2432 /usr/bin/dockerd -H unix://
           ├─ 2451 containerd --config /var/run/docker/containerd/containerd.toml...
           ├─23228 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8...
           ├─23235 containerd-shim -namespace moby -workdir /var/lib/docker/conta...
           └─26843 containerd-shim -namespace moby -workdir /var/lib/docker/conta...

Apr 10 23:26:23 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:26:51 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:26:51 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:27:09 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:38:09 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:38:27 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:38:27 localhost dockerd[2432]: time="2019-04-10...
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
Hint: Some lines were ellipsized, use -l to show in full.

reloadした後。

$ sudo systemctl status docker.service

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2018-12-05 14:55:37 JST; 4 months 4 days ago
     Docs: https://docs.docker.com
  Process: 30027 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 2432 (dockerd)
    Tasks: 57
   Memory: 632.9M
   CGroup: /system.slice/docker.service
           ├─ 2432 /usr/bin/dockerd -H unix://
           ├─ 2451 containerd --config /var/run/docker/containerd/containerd.toml...
           ├─23228 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8...
           ├─23235 containerd-shim -namespace moby -workdir /var/lib/docker/conta...
           └─26843 containerd-shim -namespace moby -workdir /var/lib/docker/conta...

Apr 10 23:26:23 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:26:51 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:26:51 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:27:09 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:38:09 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:38:27 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:38:27 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:44:51 localhost dockerd[2432]: time="2019-04-10...
Apr 10 23:44:51 localhost dockerd[2432]: time="2019-04-10...
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
Hint: Some lines were ellipsized, use -l to show in full.

…とくにプロセス番号などは変わっていないし、動作中のコンテナは稼働し続けていて特に問題はなさそうだった。なので、reloadコマンドでプロセスが落ちる心配はしなくて良さそう。が、設定は反映されなかった。調べてみると、reloadで反映される設定は限定されており、log-optsは含まれていなかった…

うーむ…というわけで、log-optsの設定を変更するにはrestartするしかない。めんどいなーとは思うが仕方ないね。

ちなみに、dockerにはlive-restoreという機能があるので、これを使えばダウンタイムをなるべく減らすことができる。ただし、起動に時間がかかるコンテナ、例えばMySQLみたいやつ、だとこれは悪い方向に働く可能性があるので、注意して使う必要がある。

ツイッターでシェア
みんなに共有、忘れないようにメモ

shige

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント