В чем смысл процесса docker-proxy? Зачем нужен tcp прокси в пользовательском пространстве?

34

Я заметил, что для каждого опубликованного порта выполняется процесс 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

и некоторые связанные правила iptable, созданные 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
Тарнай Кальман
источник
13
Не согласен с закрытием этого вопроса. Это допустимая архитектурная проблема, которая является следствием serverfault.com/questions/615372 ; если мы проголосуем за то, что кажется недокументированной (по крайней мере, на веб-сайте) частью службы, тогда возникает вопрос, стоит ли нам просто слепо устанавливать новые и блестящие службы, которые мы не понимаем внутренне работы?
Эйвери Пейн
Также на так stackoverflow.com/a/37809857/1318694
Мэтт

Ответы:

21

Очевидно, есть некоторые крайние случаи без лучшего обходного пути (на данный момент):

  • localhost <-> localhost маршрутизация
  • Экземпляр докера, вызывающий себя через опубликованный порт
  • и возможно больше

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

ОБНОВЛЕНИЕ: Начиная с 1.7.0 (2015-06-16) прокси-сервер пользователя может быть отключен в пользу шпильки NAT с помощью флага демона --userland-proxy = false.

Тарнай Кальман
источник