docker18.09.0にあげたらdocker.serviceが起動しなくなった


何が起こったか

dockerをアップデートし、PCを再起動したらdocker.serviceが立ち上がらなくなった。

$ systemctl start docker

とコマンドを打つと

Failed to load listeners: no sockets found via socket activation: make sure the service was started by systemd

とログに吐かれる。

$ docker version

とコマンドを打つと

Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:57 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

と出る。

こだまでしょうか。
docker.sock is 誰

環境

ubuntu 16.04LTS
dockerの過去バージョン 17.09.1~ce-0~ubuntu→18.03.1-ceっぽい。
ログから探した情報です。

解決方法

まずは即解決したい方向けにどうやって解決させたかを書きます。
以下を参照しました。
https://github.com/docker/for-linux/issues/476#issuecomment-437210470

/etc/systemd/system/docker.service.d/docker.conf以下のファイルに記載されている-H fd://を消す

before

[Service]
Environment="DOCKER_NETWORK_OPTIONS=--dns XXX.XXX.XXX.XXX"
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS

after

[Service]
Environment="DOCKER_NETWORK_OPTIONS=--dns XXX.XXX.XXX.XXX"
ExecStart=
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS

なぜこんなことが起こったのか

まず今回起こった事象は、docker.socketが存在しないのに呼び出そうとしていることで起こりました。

socketってなあに?については以下が参考になります。
https://www.slideshare.net/moriwaka/systemd/15

docker.serviceがdocker.socketをlistenするはずが、docker.socketがないからdocker.serviceが起動しないという事態になりました。

なぜdocker.socketが消えたのか

docker.socketのパッケージ自体1.12からなくなっていたようですが、それでもうまく動くようになっていたのですね。
こちらのissueを見ると、その設定が18.0.9から変わったようです。

docker.socketが存在している時は-H fd://でdocker.serviceからdocker.socketを呼び出す設定にしていました。
その後パッケージがなくてもうまく動くようになっていたところが18.0.9ではdocker.socketが存在しないときに-H fd://を指定すると怒られるようになってしまった、というわけです。

なお、docker.socketはdocker.sockをうまく扱うために存在していました。

じゃあみんな起こるの?

こちらを見ると、
「通常設定ファイルは上書きされるはずだがどこかでユーザーが手を入れているのであればその値は上書きされない」
とあります。
私の環境では/lib以下は最新の設定になっていたのですが、/etc以下に-H fd://記述が残っていたので、こちらの設定が優先されてしまいました。
なのでdockerの設定ファイルに手を入れていなければ現象は起こらないはずです。
docker.socketも存在していなければそれを呼び出すこともない、ということですね。

そして解決方法へ

じゃあなぜ-H fd://を消してなおったかという話です。
本来18.0.9では-H fd://がない状態を想定しており、これがなければdocker.serviceが直接docker.sockを用意する動作をデフォルトとしています。
なので-H fd://を消すと解決!!です。

このあとこの事象はどうなるか

この-H fd://が書かれていると動かないということで沢山の人が困っているのを受け、-H fd://が書かれていても動くようにするようです。

こちらには

"I think the goal is to have a release early/mid december, but there are some issues still being looked into that are desirable for inclusion, so the "safe" answer is "when it's done"."

と書かれています。
12月初~中旬くらいを目指しているけど"safe"な回答は"when it's done"(できたときがそのとき)とのことです。

ご協力いただいた皆様、ありがとうございました!!