Qual é o objetivo do processo docker-proxy? Por que é necessário um proxy userspace tcp?

34

Percebi que há um processo de docker-proxy em execução para cada porta publicada. Qual é o objetivo deste processo? Por que um proxy tcp de espaço do usuário é necessário para isso?

$ 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

e algumas regras iptable relacionadas criadas pelo docker:

$ 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
Tarnay Kálmán
fonte
13
Discordo sobre o fechamento desta pergunta. É um problema arquitetural válido que é uma ramificação de serverfault.com/questions/615372 ; se estivermos com voto negativo no que parece ser uma parte não documentada (pelo menos no site) do serviço, isso levanta a questão: devemos apenas instalar cegamente serviços novos e brilhantes que não entendemos os aspectos internos funcionamento de?
Avery Payne

Respostas:

21

Aparentemente, existem alguns casos extremos sem uma solução melhor (por enquanto):

  • roteamento localhost <-> localhost
  • instância do docker que se chama por sua porta publicada
  • e possivelmente mais

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

ATUALIZAÇÃO: Desde 1.7.0 (16/06/2015) o proxy da terra do usuário pode ser desativado em favor do NAT hairpin usando o sinalizador --userland-proxy = false do daemon.

Tarnay Kálmán
fonte