docker コンテナをずっと動作させていたのですが、次の日の朝に止まっていたことがありました。
その原因の調査と対策方法についてのメモです。
環境
- Ubuntu 20.04
- Docker 20.10.7
原因の調査
まずは docker のログを調べてみます。 syslog から docker に関するログを表示します。
$ grep 'dockerd' /var/log/syslog
Dec 17 07:02:17 hostname dockerd[1880]: time="2021-12-17T07:02:17.017091451+09:00" level=info msg="Processing signal 'terminated'"
中略
Dec 17 07:02:27 hostname dockerd[1880]: time="2021-12-17T07:02:27.985252607+09:00" level=info msg="Daemon shutdown complete"
Dec 17 07:02:27 hostname systemd[1]: docker.service: Succeeded.
Dec 17 07:02:28 hostname dockerd[327103]: time="2021-12-17T07:02:28.012481765+09:00" level=info msg="Starting up"
中略
Dec 17 07:02:28 hostname dockerd[327297]: time="2021-12-17T07:02:28.618499702+09:00" level=info msg="Daemon has completed initialization"
Dec 17 07:02:28 hostname dockerd[327297]: time="2021-12-17T07:02:28.627472728+09:00" level=info msg="API listen on /run/docker.sock"
docker としては、終了指示を受けたから停止して、その後正しく再起動しているようです。
じゃあ何で(誰が)終了したのかということで、今度はログ全部を表示して docker 再起動の少し前をログを見てみました。
$ cat /var/log/syslog
怪しいログとして以下がありました。
Dec 17 07:02:06 hostname systemd[1]: Starting Daily apt download activities...
中略
Dec 17 07:02:17 hostname systemd[1]: Stopping Docker Application Container Engine...
日次処理が走った後に docker を再起動している?
また、ググってみたら以下のページが見つかりました。
というわけで、ソフトウェアの自動アップデートが走った結果 docker が再起動したのが原因のようです。
実際、ソフトウェアのアップデートの設定を確認したら、たしかに自動アップデートするようになっていました。
自動アップデートを無効にしてもいいですが、とりあえずこれはこのままにしておきました。
docker コンテナの restart フラグ
今までも docker コンテナをサービス化するときには restart
フラグを設定していました。restart
については以下に記述があります。
今回はエラーで Docker デーモンが再起動したわけではないので、今回のような場合でも Docker コンテナを再起動させるためには unless-stopped
ではなく always
を指定しないといけないっぽいですね。
ちなみに、GUI アプリで restart
を unless-stopped
or always
に指定してサービス化した場合、 ×ボタンなどでアプリを終了してもすぐ再起動して GUI が立ち上がるようになるので、そこは注意が必要です。
まぁ GUI アプリをサービス化なんてしませんね。