tag:crieit.net,2005:https://crieit.net/tags/%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/feed
「やってみた」の記事 - Crieit
Crieitでタグ「やってみた」に投稿された最近の記事
2020-03-31T13:33:34+09:00
https://crieit.net/tags/%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/feed
tag:crieit.net,2005:PublicArticle/14917
2019-04-11T00:23:13+09:00
2020-03-31T13:33:34+09:00
https://crieit.net/posts/docker-Graceful-reload
dockerをGracefulにreloadできるかどうか
<h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2>
<ul>
<li>出来る。</li>
<li>けど、reloadで反映される設定は限られているので、<a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#miscellaneous-options">https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#miscellaneous-options</a>をよく読んで検証すること。</li>
</ul>
<h2 id="Main"><a href="#Main">Main</a></h2>
<p>最近知ったんだけど、dockerには<code>log-opt</code>というオプションがあり、これを使うことで簡易なログローテートを行うことができる。<br />
- <a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver">https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver</a></p>
<p>で、これを適用する必要があるんだけど、そういうときというのは大抵サービスが稼働中であり、サービスを止めずに設定を適用したい。例えばこれがNginxならreloadで(大抵の場合は)安全に設定を読み込ませることができるけど、それがdockerでも可能なのかどうか、ということを確認したい。</p>
<p>対象のdockerはCentOS7の上で動いているので、まずはUnitファイルを見る。</p>
<pre><code>[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
</code></pre>
<p><code>ExecReload</code>が設定されているのでとりあえず<code>systemctl reload docker.service</code>というコマンドを実行することはできそう。じゃあ次は、実際にコンテナが動作している最中に実行したらどうなるかを見てみる。</p>
<p>それっぽい状況を作るためにまず、Nginxのコンテナを立ち上げて外部から毎秒アクセスする。もう1つ適当なコンテナを立ち上げてコンテナ内部で毎秒<code>date</code>コマンドを実行する。なお、どちらもフォアグラウンドで動かしている。もしdockerがgracefulに設定を読み込むことができるのならば、各コンテナは正常に動作し続けるはず。</p>
<p>まずはreloadする前の状態。</p>
<pre><code>$ 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.
</code></pre>
<p>reloadした後。</p>
<pre><code>$ 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.
</code></pre>
<p>…とくにプロセス番号などは変わっていないし、動作中のコンテナは稼働し続けていて特に問題はなさそうだった。なので、reloadコマンドでプロセスが落ちる心配はしなくて良さそう。が、設定は反映されなかった。調べてみると、reloadで反映される設定は限定されており、<code>log-opts</code>は含まれていなかった…</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#miscellaneous-options">https://docs.docker.com/v17.09/engine/reference/commandline/dockerd/#miscellaneous-options</a>の"CONFIGURATION RELOAD BEHAVIOR"</li>
</ul>
<p>うーむ…というわけで、<code>log-opts</code>の設定を変更するにはrestartするしかない。めんどいなーとは思うが仕方ないね。</p>
<p>ちなみに、dockerには<a target="_blank" rel="nofollow noopener" href="https://docs.docker.com/v17.09/engine/admin/live-restore/">live-restore</a>という機能があるので、これを使えばダウンタイムをなるべく減らすことができる。ただし、起動に時間がかかるコンテナ、例えばMySQLみたいやつ、だとこれは悪い方向に働く可能性があるので、注意して使う必要がある。</p>
shige