web-dev-qa-db-ja.com

docker-proxyプロセスのポイントは何ですか?なぜユーザースペースTCPプロキシが必要なのですか?

公開されたポートごとにdocker-proxyプロセスが実行されていることに気づきました。このプロセスの目的は何ですか?なぜこれにユーザー空間TCPプロキシが必要なのですか?

$ ps -Af | grep proxy
root      4776  1987  0 01:25 ?        00:00:00 docker-proxy -proto tcp -Host-ip 127.0.0.1 -Host-port 22222 -container-ip 172.17.0.2 -container-port 22
root      4829  1987  0 01:25 ?        00:00:00 docker-proxy -proto tcp -Host-ip 127.0.0.1 -Host-port 5555 -container-ip 172.17.0.3 -container-port 5555

とdockerによって作成されたいくつかの関連するiptableルール:

$ Sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 1 packets, 263 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 1 packets, 263 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 1748 packets, 139K bytes)
 pkts bytes target     prot opt in     out     source               destination         
   32  7200 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 1719 packets, 132K bytes)
 pkts bytes target     prot opt in     out     source               destination         
   32  7200 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            127.0.0.1            tcp dpt:22222 to:172.17.0.2:22
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            127.0.0.1            tcp dpt:5555 to:172.17.0.3:5555
34
Tarnay Kálmán

どうやら、より良い回避策のないいくつかのEdgeケースがあります(現時点では)。

  • localhost <-> localhostルーティング
  • 公開されたポートを介してそれ自体を呼び出すdockerインスタンス
  • そしておそらくもっと

https://github.com/docker/docker/issues/8356

UPDATE:1.7.0以降(2015-06-16)ヘアピンを優先してユーザーランドプロキシを無効にすることができますNATデーモンの--userland-proxyを使用して= falseフラグ

21
Tarnay Kálmán