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がとりあえず原因だったが分かった。

Udemy 独学でのアプリ開発に限界を感じたら

プログラミング初学者の皆さんに、 Udemy を強くお勧めしたいと思います。 Udemy は世界中のトップレベルのプログラミング講師が提供するオンライン講座を取り揃えています。以下は、 Udemy で学ぶことのメリットについての詳細です。

1. Udemy の豊富なコースの選択肢

Udemyには、数千ものコースがあります。初心者から上級者まで、プログラミングのあらゆるレベルを網羅しています。また、様々なプログラミング言語やツールに関するコースも多数あり、希望に合わせたコースを選ぶことができます。

2. 実践的な学習方法

Udemyのコースは、理論だけでなく実践的な学習も行えます。多くのコースには、プログラムの作成や実際のプロジェクトに取り組む演習が含まれています。これにより、理論だけでなく実践的なスキルも身につけることができます。

3. Udemy には質の高い講師陣

Udemyの講師陣には、世界中のトップレベルのプログラマーが多数在籍しています。彼らは、実務での経験を活かして、分かりやすい講義を行っています。

4. 初学者が始めるのにとても手頃な価格

Udemyのコースは、他のオンライン講座と比べて手頃な価格で提供されています。また、一度購入すると、終身アクセスが得られるので、自分のペースで学習することができます。

以上の理由から、プログラミング初学者の方には、Udemyが最適な学習プラットフォームであると考えられます。ぜひ一度、Udemyのコースを体験してみてください。


ウェブ開発の人気オンラインコース


ITとソフトウェアの人気オンラインコース


デザインの人気オンラインコース