¿Qué hace realmente la opción host net=host en el comando Docker?


Soy un poco principiante en Docker. No pude encontrar ninguna descripción clara de lo que hace esta opción en el comando docker run en profundidad y un poco confundido al respecto.

¿Podemos usarlo para acceder a las aplicaciones que se ejecutan en contenedores docker sin especificar un puerto? Por ejemplo, si corro una aplicación web desplegada a través de una imagen de docker en el puerto 8080 utilizando la opción -p 8080:8080 en el comando docker run, sé que tendré que acceder a ella en el puerto 8080 en contenedores Docker ip /theWebAppName. Pero realmente no puedo piense en cómo funciona la opción --net=host.

Author: Ravindu Fernando, 2017-04-10

2 answers

Después de la instalación de docker, tiene 3 redes por defecto:

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3be8b1ef7ce        bridge              bridge              local
fbff927877c1        host                host                local
023bb5940080        none                null                local

Estoy tratando de mantener esto simple. Por lo tanto, si inicia un contenedor de forma predeterminada, se creará dentro de la red bridge (docker0).

$ docker run -d jenkins
1498e581cdba        jenkins             "/bin/tini -- /usr..."   3 minutes ago       Up 3 minutes        8080/tcp, 50000/tcp   friendly_bell

En el dockerfile de jenkins se exponen los puertos 8080 y 50000. Esos puertos están abiertos para el contenedor en su red de puentes. Así que todo dentro de esa red de puentes puede acceder al contenedor en el puerto 8080 y 50000. Todo en la red de puentes está en el rango privado de "Subnet": "172.17.0.0/16", Si desea acceder a ellos desde el exterior, debe mapear los puertos con -p 8080:8080. Esto mapeará el puerto de su contenedor al puerto de su servidor real (la red host). Así que acceder a su servidor en 8080 se dirigirá a su bridgenetwork en el puerto 8080.

Ahora también tienes tu red host. Que no contiene la red de contenedores. Así que si inicia un contenedor en la red host se verá así (es la primera uno):

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1efd834949b2        jenkins             "/bin/tini -- /usr..."   6 minutes ago       Up 6 minutes                              eloquent_panini
1498e581cdba        jenkins             "/bin/tini -- /usr..."   10 minutes ago      Up 10 minutes       8080/tcp, 50000/tcp   friendly_bell

La diferencia es con los puertos. Su contenedor está ahora dentro de su red host. Así que si abres port 8080 en tu host accederás al contenedor inmediatamente.

$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT

He abierto port 8080 en mi firewall y cuando ahora estoy accediendo a mi servidor en port 8080 estoy accediendo a mi jenkins. Creo que este blog también es útil para entenderlo mejor.

 57
Author: lvthillo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-10 07:54:25
  1. puede crear su propia red nueva como net net = "anyname"
  2. esto se hace para aislar los servicios de diferentes contenedores.
  3. supongamos que el mismo servicio se ejecuta en contenedores diferentes, pero la asignación de puertos sigue siendo el mismo, el primer contenedor comienza bien, pero el mismo servicio del segundo contenedor fallará. para evitar esto, cambie las asignaciones de puertos o cree una red.
 0
Author: Abhishek Karigar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-21 06:43:14