src(自分で「ドッカー化された」IPを持つドッカーコンテナ)で、そのドッカープロセスを実行している仮想マシンのIPアドレスに送信されたパケットのパスが何であるかを知りたいです。パケットは仮想マシンを離れますか、それともローカルにルーティングされますか?
これは、サーバー側のプロセスがすべてのインターフェイスとポートXXXをリッスンし、クライアントがホスト_ip:XXXにパケットを送信するのと似ています。
答え1
パケットは仮想マシンを離れますか、それともローカルにルーティングされますか?
質問を理解したかどうかはわかりません。 「VM」は、ネットワークネームスペースを含むネームスペースの束です。 Dockerホストはデフォルトのネットワーク名前空間を使用します。コンテナがパケットを送信すると、そのパケットはコンテナのネットワークネームスペースに存在し、ホストのデフォルトネットワークネームスペースで処理されます。持つ最終的にコンテナを残してください。はい、これは「ローカル」で、つまりすべての名前空間を含む物理システムで発生します。
実際、プロセスは非常に複雑です。ネイティブネットワークネームスペースとコンテナネットワークネームスペースの両方に多くのiptablesルールがあります(dockerのインストールで確認してください)。
答え2
これらのパケットは、デフォルトのDockerブリッジネットワークを介してローカルにルーティングされます。
docker0
たとえば、Docker CEのデフォルトのブリッジネットワーク設定を持つCentOS 8ホストでは、次のようになります。
on-the-host$ ip a sh
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 0a:b4:8e:4b:9d:e3 brd ff:ff:ff:ff:ff:ff
inet 172.20.8.151/24 brd 172.20.8.255 scope global dynamic noprefixroute eth0
valid_lft 3175sec preferred_lft 3175sec
102: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:cd:4e:e9:51 brd ff:ff:ff:ff:ff:ff
inet 10.200.0.1/24 brd 10.200.0.255 scope global docker0
valid_lft forever preferred_lft forever
これで、Dockerコンテナ内のホストインスタンスにアクセスしようとしています。
within-docker-container$ ip a eth0
212: eth0@if213: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:0a:c9:08:09 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.201.8.9/24 brd 10.201.8.255 scope global eth0
valid_lft forever preferred_lft forever
within-docker-container$ traceroute -Un 172.20.8.151
traceroute to 172.20.8.151 (172.20.8.151), 30 hops max, 60 byte packets
1 172.20.8.151 0.054 ms 0.010 ms 0.010 ms
パケットがホストのeth0
ネットワークカードに直接到着していることがわかります。
ただし、多くの低レベルの操作がホストインスタンスで発生することに注意してください。iptables
ルール、ネットワークネームスペースなど!