Apa gunanya proses docker-proxy? Mengapa proxy userspace tcp diperlukan?

34

Saya perhatikan bahwa ada proses docker-proxy yang berjalan untuk setiap port yang diterbitkan. Apa tujuan dari proses ini? Mengapa proxy ruang pengguna tcp diperlukan untuk ini?

$ 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

dan beberapa aturan iptable terkait yang dibuat oleh buruh pelabuhan:

$ 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
sumber
13
Tidak setuju tentang penutupan pertanyaan ini. Ini adalah masalah arsitektur yang valid yang merupakan cabang dari serverfault.com/questions/615372 ; jika kita memilih-turun apa yang tampaknya merupakan bagian dari layanan yang tidak didokumentasikan (setidaknya di situs web), maka itu menimbulkan pertanyaan, haruskah kita berkeliling secara membabi buta menginstal layanan baru dan mengkilap yang kita tidak mengerti internal cara kerja?
Avery Payne

Jawaban:

21

Rupanya ada beberapa kasus tepi tanpa solusi yang lebih baik (untuk saat ini):

  • localhost <-> routing localhost
  • Misalnya buruh pelabuhan memanggil dirinya sendiri melalui port yang diterbitkan
  • dan mungkin lebih

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

PEMBARUAN: Sejak 1.7.0 (2015-06-16) proksi userland dapat dimatikan untuk mendukung hairpin NAT menggunakan daemon's --userland-proxy = false flag.

Tarnay Kálmán
sumber