CoreOSの自動アップデートでDocker環境が全滅した日


はじめに

先日、CoreOSの自動アップデートによりDockerで動かしていた検証用の環境が全滅 、という状況に遭遇したので原因と対応策を記しておきます。

環境

CoreOS 1576.2.0 (Beta channel)1

現象

2017/11/09 にDockerで動かしていたアプリケーションがまったく使えなくなる。ホストOSであるCoreOSは稼働しているが、docker psすると Cannot connect to the Docker daemon... のエラーメッセージが返ってくる。稼働プロセスを確認すると確かにDockerデーモンのプロセスがなく、手動で systemctl start docker しても起動しないという状況。

原因

journalctl -xeでログを確認すると一目瞭然。Dockerの起動でコケていた。

Nov 09 14:27:01 my-dockerhost docker[957]: `docker daemon` is not supported on Linux. Please run `dockerd` directly

https://docs.docker.com/engine/deprecated/#docker-daemon-subcommand にあるとおり、Docker v1.13.0で非推奨となり v17.12 で削除2 となるため、代わりに dockerdという別コマンドを使うように、とのこと。

確かに、アップデートされたCoreOSの1576.2.0 リリースノート も見てみると、Dockerのバージョンが 1.12.6 17.09.0 とついにv17系になっていた。念のためCoreOS上のDockerのバージョンを確認してみると...

$ docker --version
Docker version 17.09.0-ce, build afdb6d4

と確かにv17系になっている。

結論としては、Dockerのバージョンアップによりdocker daemonが使えなくなったのが原因と思われる。

対応策

正しくdockerdを使うようにDockerデーモンの起動方法を変えれば良い。CoreOSではsystemdを使って起動しているので docker.service を修正する。

/etc/systemd/system/docker.service
@@ -1 +1 @@
-ExecStart=/usr/bin/docker daemon --storage-driver=btrfs --host=fd:// $DOCKER_OPTS
+ExecStart=/usr/bin/dockerd --storage-driver=btrfs --host=fd:// $DOCKER_OPTS

後はsystemdのservice設定ファイルの変更を反映し、Dockerを起動して復旧完了。

sudo systemctl daemon-reload
sudo systemctl start docker

Dockerをダウングレードする手もある

この記事を書いている時に見つけたものですが、CoreOSのBlogに Toward Docker 17.xx in Container Linux というものが書かれていた3/etc/coreos/docker-1.12yesを書き込んでおくとダウングレードして使えるらしい。
ただし、このオプションは以下のスケジュールで無視されるようになり、結局はバージョンアップがいずれ必要になるので要注意。

June 6, 2018: /etc/coreos/docker-1.12 is ignored in the alpha channel.
June 20, 2018: /etc/coreos/docker-1.12 is ignored in the beta channel.
July 18, 2018: /etc/coreos/docker-1.12 is ignored in the stable channel.

今後考えたいこと

CoreOSの自動アップデートをオフにしておけば今回のような障害は防げるものの、セキュリティとのトレードオフとなる。人柱環境という面もあるのでやはり積極的にアップデートしていきたい。
となると、OSアップデート後にDockerが起動しない状況になったらアップデートを一旦自動ロールバックするとかできればうれしいかなぁ...と思ったりもするのですが、CoreOSの自動アップデートってどこまで制御できるんでしょうかね?


  1. 検証環境なので、人柱的に敢えてBeta channel使ってます。 

  2. 1点解せないのが、今回v17.09.0なのにdocker daemonがもう使えなくなっているというところ。この点については、ISSUEも立っていたが今回は深く追っていない。 

  3. これ事前に読んで変更点を押さえておけよ、という感じですかね