Ubuntu22.04 LTS に docker 環境をセットアップする際に公式マニュアルどおりにセットアップしたら、デフォルトでインストールされてるsnapのDockerで競合してハマった話。
Dockerデーモン用にDrop-inで設定したHTTP_PROXY環境変数が、ロードされているにも関わらず、効かないという現象に陥って解決に2日ハマった.
結論
$ snap remove docker
$ reboot
Ubuntu にデフォルトで入ってる snap の docker を削除する必要がある。reboot も忘れずに。
詳しく調べ切れなかったのが自分のスキルの低さだが、たぶん競合してるということなのだろう。
経緯
外部ネットワーク接続に HTTP Proxy の経由が必要なネットワークにある Ubuntu22.04 LTS に Docker をセットアップした。ここまでは公式マニュアルどおりで問題なし。
HTTP_PROXY や HTTPS_PROXY の環境変数は/etc/systemd/system/docker.service.d/http-proxy.conf
に設定した。docker run hello-world
も正常に pull できた。
その後、サーバの再起動し、同様の hello-world を実行したところ Timeout で hello-world を pull できない状態になった。 試行錯誤で docker.socket の restart とすると正常に http_proxy 経由で pull できることを確認できた。
この状態で再び、サーバの再起動をすると再度 proxy が効かない状態に戻り、上記と同じ状態に戻る。
reboot 直後、systemd の status を確認するときちんと /etc/systemd/system/docker.service.d/http-proxy.conf
がロードされている。
# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/docker.service.d
└─http-proxy.conf
Active: active (running) since Thu 2022-12-22 18:24:03 JST; 20h ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 1043 (dockerd)
Tasks: 10
Memory: 87.9M
CPU: 6.850s
CGroup: /system.slice/docker.service
└─1043 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
以下のように show で見ても環境変数を確認できる(値は mask している)
# systemctl show --property Environment docker
Environment=HTTP_PROXY=http://xxxx.xxxxxx.xx.xx:8080/ HTTPS_PROXY=http://xxxx.xxxxxx.xx.xx:8080/
しかし hello-world はできない(proxy を参照していない)
# docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.
一度dockerを止めて再起動してみる
# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
docker.socketが生きているというwarningが出るがとりあえず無視してみた。
# systemctl start docker
# systemctl status docker
# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/docker.service.d
└─http-proxy.conf
Active: active (running) since Fri 2022-12-23 15:17:58 JST; 9s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 3288 (dockerd)
Tasks: 9
Memory: 22.2M
CPU: 200ms
CGroup: /system.slice/docker.service
└─3288 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
この状態でhello-worldしても状態は変わらず。
とりあえず公式の手順でdockerを再インストールすべくdockerを削除する
$ systemctl stop docker
$ apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ rm -rf /var/lib/docker
$ rm -rf /var/lib/containerd
$ reboot
再起動後、dockerが無いことを確認しようとしたところ、snapでinstallされたdockerが動いてた。こいつが原因かなと思いとりあえず削除してみる
# which docker
/snap/bin/docker
# systemctl status snap.docker.dockerd.service
● snap.docker.dockerd.service - Service for snap application docker.dockerd
Loaded: loaded (/etc/systemd/system/snap.docker.dockerd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-12-23 15:43:24 JST; 10min ago
Main PID: 849 (dockerd)
Tasks: 19 (limit: 9406)
Memory: 270.7M
CPU: 9.343s
CGroup: /system.slice/snap.docker.dockerd.service
├─ 849 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/2285/config/daemon.json
└─1199 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
# snap remove docker
docker removed
# reboot
dockerを入れなおしてhello-worldして、うまくいったので再起動する。
# apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# docker run --rm hello-world
# reboot
再起動直後、hello-worldしてpullできた
# docker run --rm hello-world
よってsnapのdockerがとりあえず原因だったが分かった。