我注意到,每个发布的端口都有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创build的一些相关的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
显然有一些边缘情况没有一个更好的解决方法(现在):
https://github.com/docker/docker/issues/8356
更新:自1.7.0(2015-06-16)以来,可以禁用userland代理,使用守护进程的–userland-proxy = false标志来支持发夹式NAT。