remove - docker run
¿Qué hace realmente la opción--net=host en el comando Docker? (2)
- puedes crear tu propia nueva red como --net = "cualquier nombre"
- Esto se hace para aislar los servicios de diferentes contenedores.
- Supongamos que el mismo servicio se ejecuta en diferentes contenedores, pero la asignación de puertos sigue siendo la misma, el primer contenedor se inicia bien, pero el mismo servicio del segundo contenedor fallará. para evitar esto, cambie las asignaciones de puertos o cree una red.
Soy un poco principiante para Docker. No pude encontrar una descripción clara de lo que hace esta opción en el comando de ejecución de la ventana acoplable 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? Como ejemplo, si ejecuto una aplicación web implementada a través de una imagen de ventana acoplable en el puerto 8080 mediante el uso de la opción -p 8080:8080
en el comando de ejecución de la ventana acoplable, sé que tendré que acceder a él en el puerto 8080 en los contenedores de Docker ip / theWebAppName. Pero realmente no puedo pensar en cómo --net=host
opción --net=host
.
Después de la instalación de la ventana acoplable, 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 de 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 archivo docker de jenkins, los puertos 8080
y 50000
están expuestos. Esos puertos están abiertos para el contenedor en su red puente. Por lo tanto, todo dentro de esa red de puente puede acceder al contenedor en el puerto 8080
y 50000
. Todo en la red del puente está en el rango privado de "Subnet": "172.17.0.0/16",
Si desea acceder a ellos desde el exterior, debe asignar los puertos con -p 8080:8080
. Esto asignará el puerto de su contenedor al puerto de su servidor real (la red host). Por lo tanto, el acceso a su servidor en 8080
dirigirá a su bridgenetwork en el puerto 8080
.
Ahora usted también tiene su red de host. Lo que no contiene en contenedores la red de contenedores. Entonces, si inicias un contenedor en la red anfitriona, se verá así (es el primero):
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 está con los puertos. Su contenedor está ahora dentro de su red de host. Por lo tanto, si abre el puerto 8080
en su host, accederá al contenedor de inmediato.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Abrí el puerto 8080
en mi firewall y cuando ahora estoy accediendo a mi servidor en el puerto 8080
, estoy accediendo a mis jenkins. Creo que este blog también es útil para entenderlo mejor.