¿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
.
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.
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
- puede crear su propia red nueva como net net = "anyname"
- esto se hace para aislar los servicios de diferentes contenedores.
- 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.
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