problem not hub found example docker namespaces

not - ¿Cómo funciona la resolución de DNS Docker Embedded?



docker hub (1)

Sé que Docker tiene una resolución Dns incrustada.
cuando corro un contenedor en mi puente:

$ docker run -it --rm --privileged --network=mybridge xxx bash root@18243bfe6b50:/# cat /etc/resolv.conf nameserver 127.0.0.11 options ndots:0 root@18243bfe6b50:/# netstat -anop Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer tcp 0 0 127.0.0.11:45997 0.0.0.0:* LISTEN - off (0.00/0/0) udp 0 0 127.0.0.11:49614 0.0.0.0:* it shows there is a dns resolver, and iptables help do a port transfer. root@18243bfe6b50:/# iptables -nvL -t nat ..... Chain DOCKER_OUTPUT (1 references) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 0.0.0.0/0 127.0.0.11 tcp dpt:53 to:127.0.0.11:45997 0 0 DNAT udp -- * * 0.0.0.0/0 127.0.0.11 udp dpt:53 to:127.0.0.11:49614 Chain DOCKER_POSTROUTING (1 references) pkts bytes target prot opt in out source destination 0 0 SNAT tcp -- * * 127.0.0.11 0.0.0.0/0 tcp spt:45997 to::53 0 0 SNAT udp -- * * 127.0.0.11 0.0.0.0/0 udp spt:49614 to::53 but, which process is the dns resolver? I guess it is dockerd? but dockerd is running in host network namespace, obviously it is different with the container network namespace, also, I can not find dockerd has dns port listening in host: root@test:~# netstat -tnop |grep dockerd tcp 0 0 10.5.79.50:59540 10.5.79.50:2377 ESTABLISHED 3332/dockerd off (0.00/0/0) tcp 0 0 127.0.0.1:35792 127.0.0.1:2377 ESTABLISHED 3332/dockerd off (0.00/0/0) tcp6 0 0 10.5.79.50:2377 10.5.79.70:45934 ESTABLISHED 3332/dockerd off (0.00/0/0) tcp6 0 0 127.0.0.1:2377 127.0.0.1:35792 ESTABLISHED 3332/dockerd off (0.00/0/0) tcp6 0 0 10.5.79.50:2377 10.5.79.50:59540 ESTABLISHED 3332/dockerd off (0.00/0/0)

¿Cómo un proceso (dockerd) expone algunos puertos en el espacio de nombres del host y algunos puertos en otro espacio de nombres (contenedor)? Leí un código, pero todavía no puedo entenderlo, ¿alguien podría ayudarme a responder?

Gracias.


Tal vez ya haya descubierto que Docker (también conocido como Moby) utiliza internamente libnetwork para configurar y habilitar el sistema de resolución de DNS incorporado . Libnetwork enlaza el resolutor a la interfaz de bucle de retorno del contenedor, de modo que las consultas de DNS en 127.0.0.11 se pueden enrutar (a través de iptables) al "resolutor de DNS" en el motor de Docker. Ver el tipo de red y el código real ResolveName () . El Sandbox para cada contenedor permite enrutar las consultas de DNS a través de los espacios de nombres de la red.

Con respecto a su pregunta de cómo un proceso puede exponer los puertos en el host y dentro de un contenedor: en este caso, unir un hilo de controlador a una interfaz sería una expresión más apropiada. El motor de Docker crea un contenedor y configura su espacio de nombres de red, por lo que también puede configurar las interfaces de red del contenedor y el enrutamiento de paquetes a través de iptables. La vinculación del resolutor a la interfaz interna del contenedor es la razón por la que no ha encontrado ningún proceso en el host que escucha en el puerto 53.