Compartir comentarios
Las respuestas se generan en base a la documentación.

Controlador de red Host

Si utilizas el modo de red host para un contenedor, la pila de red de ese contenedor no estará aislada del host de Docker (el contenedor comparte el espacio de nombres de red del host) y no se le asignará una dirección IP propia al contenedor. Por ejemplo, si ejecutas un contenedor que se vincula al puerto 80 y utilizas la red host, la aplicación del contenedor estará disponible en el puerto 80 en la dirección IP del host.

Note

Dado que el contenedor no tiene su propia dirección IP cuando se utiliza la red en modo host, el mapeo de puertos no tiene efecto y las opciones -p, --publish, -P y --publish-all se ignoran, generando en su lugar una advertencia:

WARNING: Published ports are discarded when using host network mode

La red en modo host puede ser útil en los siguientes casos de uso:

  • Para optimizar el rendimiento.
  • En situaciones donde un contenedor necesita manejar un rango amplio de puertos.

Esto se debe a que no requiere traducción de direcciones de red (NAT) y no se crea un "proxy de espacio de usuario" (userland-proxy) para cada puerto.

Soporte de plataformas

El controlador de red host es compatible con:

  • Docker Engine en Linux
  • Docker Desktop versión 4.34 y posteriores (requiere habilitar la función en los Ajustes)
Note

Para los usuarios de Docker Desktop, consulta la sección de Docker Desktop a continuación para ver las instrucciones de configuración.

También puedes utilizar una red host para un servicio de swarm pasando --network host al comando docker service create. En este caso, el tráfico de control (el tráfico relacionado con la gestión del swarm y del servicio) se sigue enviando a través de una red overlay, pero los contenedores individuales del servicio de swarm envían datos utilizando la red y los puertos del host del daemon de Docker. Esto genera algunas limitaciones adicionales. Por ejemplo, si un contenedor de servicio se vincula al puerto 80, solo podrá ejecutarse un contenedor de servicio en un nodo de swarm determinado.

Docker Desktop

La red host es compatible con Docker Desktop versión 4.34 y posteriores. Para habilitar esta función:

  1. Inicia sesión en tu cuenta de Docker en Docker Desktop.
  2. Ve a Settings (Ajustes).
  3. En la pestaña Resources (Recursos), selecciona Network (Red).
  4. Marca la opción Enable host networking (Habilitar red host).
  5. Selecciona Apply and restart (Aplicar y reiniciar).

Esta función funciona en ambas direcciones. Esto significa que puedes acceder a un servidor que se está ejecutando en un contenedor desde tu host y puedes acceder a los servidores que se ejecutan en tu host desde cualquier contenedor que se inicie con la red host habilitada. Se admiten tanto TCP como UDP como protocolos de comunicación.

Ejemplos

El siguiente comando inicia netcat en un contenedor que escucha en el puerto 8000:

$ docker run --rm -it --net=host nicolaka/netshoot nc -lkv 0.0.0.0 8000

El puerto 8000 estará disponible en el host y puedes conectarte a él con el siguiente comando desde otra terminal:

$ nc localhost 8000

Lo que escribas aquí aparecerá en la terminal donde se está ejecutando el contenedor.

Para acceder a un servicio que se ejecuta en el host desde el contenedor, puedes iniciar un contenedor con la red host habilitada con este comando:

$ docker run --rm -it --net=host nicolaka/netshoot

Si deseas acceder a un servicio en tu host desde el contenedor (en este ejemplo, un servidor web que se ejecuta en el puerto 80), puedes hacerlo así:

$ nc localhost 80

Limitaciones

  • Los procesos dentro del contenedor no pueden vincularse a las direcciones IP del host porque el contenedor no tiene acceso directo a las interfaces del host.
  • La función de red host de Docker Desktop funciona en la capa 4. Esto significa que, a diferencia de Docker en Linux, no se admiten los protocolos de red que operan por debajo de TCP o UDP.
  • Esta función no funciona si la opción de Aislamiento de Contenedores Mejorado (Enhanced Container Isolation) está habilitada, ya que aislar tus contenedores del host y permitirles el acceso a la red del host son acciones contradictorias.
  • Solo se admiten contenedores Linux. La red host no funciona con contenedores Windows.

Ejemplo de uso

Este ejemplo muestra cómo iniciar un contenedor Nginx que se vincula directamente al puerto 80 en el host de Docker. Desde una perspectiva de red, esto proporciona el mismo nivel de aislamiento que si Nginx se estuviera ejecutando directamente en el host, pero el contenedor permanece aislado en todos los demás aspectos (almacenamiento, espacio de nombres de procesos, espacio de nombres de usuarios).

Requisitos previos

  • El puerto 80 debe estar disponible en el host de Docker. Para que Nginx escuche en un puerto diferente, consulta la documentación de la imagen de Nginx.
  • El controlador de red host solo funciona en hosts Linux, y como una función opcional en Docker Desktop versión 4.34 y posteriores.

Pasos

  1. Crea e inicia el contenedor como un proceso en segundo plano (detached). La opción --rm elimina el contenedor cuando este finaliza. El flag -d lo inicia en segundo plano:

    $ docker run --rm -d --network host --name mi_nginx nginx
    
  2. Accede a Nginx navegando a http://localhost:80/.

  3. Examina tu pila de red:

    Comprueba todas las interfaces de red y verifica que no se haya creado ninguna interfaz nueva:

    $ ip addr show
    

    Verifica qué proceso está vinculado al puerto 80 utilizando netstat. Necesitas sudo porque el proceso pertenece al usuario del daemon de Docker:

    $ sudo netstat -tulpn | grep :80
    
  4. Detén el contenedor. Se eliminará automáticamente debido a la opción --rm:

    $ docker container stop mi_nginx
    

Siguientes pasos