ルートレスモードで実行すると、Dockerはホストにどのように接続しますか?

ルートレスモードで実行すると、Dockerはホストにどのように接続しますか?

現在のドキュメントに従って、ルートレスモードでdockerデーモンを実行しようとしています。https://docs.docker.com/engine/security/rootless/

このnetcatコマンドは、「一般的な方法」で実行すると機能しますが、たとえばdocker次のようになります
sudo docker run --rm -it --name custom <options> <image> bash

(使用するDockerイメージによっては、netcatこの段階でコンテナ内にパッケージをインストールする必要があります。)

root@a390456c8d0b:/# nc -vz 172.17.0.1 5432
Connection to 172.17.0.1 5432 port [tcp/postgresql] succeeded!

ルートレスモードでは機能しません。

root@a390456c8d0b:/# nc -vr 172.17.0.1 5432
nc: connect to 172.17.0.1 port 5432 (tcp) failed: Connection refused

172.17.0.1ゲートウェイは、dockerが新しいルートレスモードではなく、一般的な方法(sudoを使用)で実行されている場合にのみ使用可能/使用されるようです。しかし、これは単なる推測です。

この問題を解決する方法とルートレスDockerコンテナでホストシステム(Ubuntu 21.10/22.04 dev)のポートをpingする方法を知っている人はいますか? (この例では、デフォルトのポート5432でpostgresにpingを送信していますが、これはあなたが選択するどのポートでも構いません。)

情報:

$ docker --version
Docker version 20.10.12, build e91ed57

$ uname -mor
5.13.0-19-generic x86_64 GNU/Linux

ルートレス状態では、dockerサービスのステータスは次のとおりです。

$ systemctl --user status docker
● docker.service - Docker Application Container Engine (Rootless)
     Loaded: loaded (/home/sk/.config/systemd/user/docker.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-01-02 21:59:07 CET; 25min ago
       Docs: https://docs.docker.com/go/rootless/
   Main PID: 37085 (rootlesskit)
      Tasks: 58
     Memory: 57.5M
        CPU: 5.553s
     CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/docker.service
             ├─37085 rootlesskit --net=slirp4netns --mtu=65520 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --copy->
             ├─37096 /proc/self/exe --net=slirp4netns --mtu=65520 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disable-host-loopback --port-driver=builtin --co>
             ├─37114 slirp4netns --mtu 65520 -r 3 --disable-host-loopback --enable-sandbox --enable-seccomp 37096 tap0
             ├─37121 dockerd
             ├─37143 containerd --config /run/user/1000/docker/containerd/containerd.toml --log-level info
             └─37393 /usr/bin/containerd-shim-runc-v2 -namespace moby -id a370455c8d0bc3e2fd796e788d52d4315c06fc44befe38aa8eb5466f1128e787 -address /run/user/1000/docker/>

Jan 02 21:59:07 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:07.957623453+01:00" level=warning msg="Unable to find io controller"
Jan 02 21:59:07 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:07.957626649+01:00" level=warning msg="Unable to find cpuset controller"
Jan 02 21:59:07 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:07.957716164+01:00" level=info msg="Loading containers: start."
Jan 02 21:59:08 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:08.007912512+01:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. D>
Jan 02 21:59:08 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:08.077361354+01:00" level=info msg="Loading containers: done."
Jan 02 21:59:08 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:08.080978248+01:00" level=warning msg="Not using native diff for overlay2, this may cause degraded performan>
Jan 02 21:59:08 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:08.081081192+01:00" level=info msg="Docker daemon" commit=459d0df graphdriver(s)=overlay2 version=20.10.12
Jan 02 21:59:08 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:08.081102319+01:00" level=info msg="Daemon has completed initialization"
Jan 02 21:59:08 sk-Laptop dockerd-rootless.sh[37121]: time="2022-01-02T21:59:08.091292835+01:00" level=info msg="API listen on /run/user/1000/docker.sock"
Jan 02 22:00:30 sk-Laptop dockerd-rootless.sh[37143]: time="2022-01-02T22:00:30.603612706+01:00" level=info msg="starting signal loop" namespace=moby path=/run/.ro995659387/user/1000/do>

sudoで実行すると、systemctl「root」デーモンはアクティブでないと出力されます。これは正常な現象です。

$ sudo systemctl status docker
○ docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ○ docker.socket
       Docs: https://docs.docker.com

Jan 02 21:55:39 sk-Laptop dockerd[36685]: time="2022-01-02T21:55:39.318284987+01:00" level=info msg="Daemon has completed initialization"
Jan 02 21:55:39 sk-Laptop systemd[1]: Started Docker Application Container Engine.
Jan 02 21:55:39 sk-Laptop dockerd[36685]: time="2022-01-02T21:55:39.329132562+01:00" level=info msg="API listen on /run/docker.sock"
Jan 02 21:56:14 sk-Laptop systemd[1]: Stopping Docker Application Container Engine...
Jan 02 21:56:14 sk-Laptop dockerd[36685]: time="2022-01-02T21:56:14.005854836+01:00" level=info msg="Processing signal 'terminated'"
Jan 02 21:56:14 sk-Laptop dockerd[36685]: time="2022-01-02T21:56:14.006211665+01:00" level=info msg="stopping event stream following graceful shutdown" error="<nil>" module=l>
Jan 02 21:56:14 sk-Laptop dockerd[36685]: time="2022-01-02T21:56:14.006356148+01:00" level=info msg="Daemon shutdown complete"
Jan 02 21:56:14 sk-Laptop dockerd[36685]: time="2022-01-02T21:56:14.006382673+01:00" level=info msg="stopping event stream following graceful shutdown" error="context cancele>
Jan 02 21:56:14 sk-Laptop systemd[1]: docker.service: Deactivated successfully.
Jan 02 21:56:14 sk-Laptop systemd[1]: Stopped Docker Application Container Engine.

答え1

以下は理論ただし、テスト用にルートレスモードに切り替えることができるドッカーホストはありません。

ルートレスモードで実行するときにdockerデーモンが実行できる操作にはいくつかの制限があります。

ルートレスネットワーキングをどのように実装するかはわかりませんが、ルートレスドッカーがホストのネームスペースから直接共通ドッカーインターフェイスを作成できないことは理解できます。通常のルートモードで次のコマンドを入力すると、インターフェイスを表示できますip address

4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:88:1f:3d:89 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:88ff:fe1f:3d89/64 scope link 
       valid_lft forever preferred_lft forever

私の理論は、dockerがこれを生成できないとホストと通信できないということではなく、アプリケーション(postgresql)が受け取らないということです172.17.0.1。これは、ルートレスモードの文書化されていない制限です。ドッカー。

幸いなことに、アプリケーション(postgresql)はLANまたはWiFi IPアドレスなどの他のIPアドレスを引き続き受信する必要があります。 Dockerコンテナが外部の世界(インターネット上のすべてのエントリ)にアクセスできる場合は、そのIPのホストと通信できる必要があります。

ip addressこのコマンドを使用してローカルIPアドレスを見つけて使用できます。

関連情報