プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/12/17

docker デーモンが勝手に再起動する原因の調査と対策

event_note2021/12/17 3:42

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 アプリで restartunless-stopped or always に指定してサービス化した場合、 ×ボタンなどでアプリを終了してもすぐ再起動して GUI が立ち上がるようになるので、そこは注意が必要です。
まぁ GUI アプリをサービス化なんてしませんね。