Cómo configurar un contenedor Docker para usar la red del anfitrión

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Los contenedores de Docker son entornos aislados que ejecutan aplicaciones sin interferir con el sistema anfitrión. Por defecto, Docker crea redes virtuales para aislar el tráfico de los contenedores, pero a veces es posible que desees que tu contenedor utilice directamente la red del anfitrión.

En este laboratorio (lab), aprenderás cómo configurar contenedores de Docker para que utilicen la red del anfitrión. Explorarás las diferencias entre la red de puente (bridge networking) predeterminada y la red del anfitrión (host networking), entenderás cuándo utilizar la red del anfitrión y implementarás ejemplos prácticos para experimentar los beneficios directamente.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/ls -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/ps -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/rm -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/exec -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/inspect -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/prune -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} docker/network -.-> lab-415202{{"Cómo configurar un contenedor Docker para usar la red del anfitrión"}} end

Comprender los tipos de red de Docker

Antes de configurar los contenedores para que utilicen la red del anfitrión, exploremos los diferentes tipos de red disponibles en Docker y entendamos sus propósitos.

Verificar las redes de Docker disponibles

Comencemos examinando las redes de Docker predeterminadas en tu sistema:

  1. Abre una terminal en tu entorno LabEx.

  2. Ejecuta el siguiente comando para listar todas las redes de Docker:

docker network ls

Deberías ver una salida similar a esta:

NETWORK ID     NAME      DRIVER    SCOPE
1234567890ab   bridge    bridge    local
0987654321cd   host      host      local
abcdef123456   none      null      local

Docker proporciona tres redes predeterminadas:

  • bridge: La red predeterminada para los contenedores
  • host: Utiliza directamente la red del anfitrión
  • none: Sin red (los contenedores están aislados)

Comprender la red de puente (bridge) predeterminada

Cuando ejecutas un contenedor sin especificar una red, Docker lo conecta a la red de puente predeterminada. Esto crea una interfaz de red virtual para cada contenedor y permite que los contenedores se comuniquen entre sí y con la red externa.

Veamos cómo funciona esto en acción:

  1. Ejecuta un simple contenedor nginx con la red de puente predeterminada:
docker run --name nginx-bridge -d -p 8080:80 nginx:alpine
  1. Verifica la configuración de red del contenedor:
docker inspect nginx-bridge --format '{{json .NetworkSettings.Networks}}' | jq

Deberías ver una salida que muestre que el contenedor está conectado a la red de puente y tiene su propia dirección IP.

  1. Verifica que el contenedor sea accesible desde el anfitrión realizando una solicitud al puerto mapeado:
curl http://localhost:8080

Deberías ver el contenido HTML de la página de bienvenida de nginx.

Esto muestra cómo funciona la red de puente - el contenedor tiene su propia dirección IP, y el puerto 80 del contenedor está mapeado al puerto 8080 del anfitrión.

Ejecutar un contenedor en modo de red del anfitrión (host network mode)

Ahora exploremos cómo ejecutar un contenedor utilizando la red del anfitrión y comprendamos cómo se diferencia de la red de puente (bridge network).

Utilizar la red del anfitrión

Cuando se utiliza el modo de red del anfitrión, el contenedor comparte directamente el espacio de nombres de red del anfitrión. Esto significa:

  • El contenedor utiliza la dirección IP del anfitrión.
  • No se necesita mapeo de puertos.
  • El contenedor puede acceder a todas las interfaces de red del anfitrión.
  • Pueden producirse conflictos de puertos si el contenedor intenta utilizar puertos que ya están en uso en el anfitrión.

Vamos a ejecutar un contenedor con la red del anfitrión:

  1. Detén y elimina el contenedor nginx anterior para liberar el puerto 80:
docker stop nginx-bridge
docker rm nginx-bridge
  1. Ahora ejecuta un nuevo contenedor nginx utilizando la red del anfitrión:
docker run --name nginx-host --network host -d nginx:alpine

Observa que no necesitamos especificar la bandera -p para el mapeo de puertos, ya que el contenedor utilizará directamente la pila de red del anfitrión.

  1. Verifica la configuración de red del contenedor:
docker inspect nginx-host --format '{{json .NetworkSettings.Networks}}' | jq

Verás que el contenedor está conectado a la red del anfitrión.

  1. Accede al servidor nginx directamente en el puerto 80 del anfitrión:
curl http://localhost:80

Deberías ver el contenido HTML de la página de bienvenida de nginx.

Comprender las diferencias

Comparemos los dos enfoques:

  1. Con la red de puente (predeterminada):

    • El contenedor tiene su propia dirección IP.
    • Se requiere mapeo de puertos para acceder a los servicios del contenedor.
    • Capa de red adicional para el aislamiento.
    • Más seguro debido al aislamiento.
  2. Con la red del anfitrión:

    • El contenedor utiliza la dirección IP del anfitrión.
    • No se necesita mapeo de puertos.
    • Acceso directo a las interfaces de red del anfitrión.
    • Mejor rendimiento de red.
    • Menor aislamiento entre el contenedor y el anfitrión.

Comparar el rendimiento y el comportamiento de las redes

Ahora, ejecutemos algunas pruebas para ver las diferencias prácticas entre la red de puente (bridge) y la red del anfitrión (host) en Docker.

Probar el rendimiento de la red

Primero, creemos un contenedor con red de puente y otro con red del anfitrión, y luego comparemos su rendimiento.

  1. Detengamos y eliminemos el contenedor nginx anterior:
docker stop nginx-host
docker rm nginx-host
  1. Creemos un nuevo contenedor con red de puente para probar el rendimiento:
docker run --name bridge-test -d --network bridge nginx:alpine
  1. Creemos otro contenedor con red del anfitrión:
docker run --name host-test -d --network host nginx:alpine
  1. Usemos docker exec para ejecutar una simple prueba de red en cada contenedor:

Para el contenedor con red de puente:

docker exec bridge-test sh -c "time wget -q -O /dev/null http://google.com"

Para el contenedor con red del anfitrión:

docker exec host-test sh -c "time wget -q -O /dev/null http://google.com"

Comparemos los tiempos de ejecución. Por lo general, el contenedor con red del anfitrión tendrá un rendimiento ligeramente mejor porque evita la capa de red adicional.

Examinar las interfaces de red

Examinemos las interfaces de red en ambos contenedores:

  1. Para el contenedor con red de puente:
docker exec bridge-test ip addr show

Verás que este contenedor tiene sus propias interfaces de red, aisladas del anfitrión.

  1. Para el contenedor con red del anfitrión:
docker exec host-test ip addr show

Notarás que este contenedor tiene exactamente las mismas interfaces de red que el sistema anfitrión, incluyendo todas las interfaces de red físicas.

  1. Comparemos con las interfaces de red del anfitrión:
ip addr show

Las interfaces del contenedor con red del anfitrión deben coincidir con las del sistema anfitrión.

Comprender los conflictos de puertos

Al usar la red del anfitrión, pueden producirse conflictos de puertos si el contenedor intenta utilizar puertos que ya están en uso en el anfitrión:

  1. Detengamos y eliminemos todos los contenedores en ejecución:
docker stop bridge-test host-test
docker rm bridge-test host-test
  1. Iniciemos un servicio en el anfitrión utilizando el puerto 8080:
python3 -m http.server 8080 &
  1. Ahora, intentemos ejecutar un contenedor con red del anfitrión que también quiera utilizar el puerto 8080:
docker run --name conflict-test --network host -d -p 8080:80 nginx:alpine

Deberías ver un error porque el puerto 8080 ya está en uso en el anfitrión.

  1. Limpiemos el servidor HTTP de Python:
kill %1

Esto demuestra una desventaja potencial de la red del anfitrión: debes ser consciente de los conflictos de puertos con el anfitrión.

Casos de uso prácticos de la red del anfitrión (host networking)

Ahora exploremos algunos casos de uso prácticos en los que la red del anfitrión es beneficiosa y implementemos un ejemplo del mundo real.

Cuándo usar la red del anfitrión

La red del anfitrión es particularmente útil en los siguientes escenarios:

  1. Aplicaciones críticas para el rendimiento: Cuando el rendimiento de la red es crucial y se desea evitar la sobrecarga de la red de puente (bridge networking).

  2. Herramientas de monitoreo de red: Aplicaciones que necesitan capturar o analizar el tráfico de red en el anfitrión.

  3. Aplicaciones que utilizan múltiples puertos: Cuando se tienen servicios que utilizan muchos puertos o asignación dinámica de puertos.

  4. Acceso a interfaces de red de hardware: Cuando los contenedores necesitan acceso directo a las interfaces de red físicas.

Implementar una herramienta de monitoreo de red con la red del anfitrión

Implementemos un ejemplo práctico: un simple contenedor de monitoreo de red que necesita acceso a las interfaces de red del anfitrión.

  1. Primero, ejecutemos una herramienta de monitoreo de red utilizando la red del anfitrión:
docker run --name netmon --network host -d alpine:latest sleep infinity

Este contenedor se ejecutará indefinidamente, lo que nos permitirá ejecutar comandos dentro de él.

  1. Ahora, capturemos algo de tráfico de red dentro del contenedor:
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 10 -i any -n"

El comando anterior:

  • Instala la herramienta tcpdump en el contenedor
  • Captura 10 paquetes de cualquier interfaz
  • Muestra la salida numérica (sin resolución de nombres de host)

Debido a que estamos utilizando la red del anfitrión, el contenedor puede acceder directamente a todas las interfaces de red del anfitrión.

  1. Veamos si podemos capturar el tráfico hacia un servicio específico del anfitrión:
## Abre una nueva ventana de terminal y genera algo de tráfico
curl http://localhost:80 &

## En la terminal original, ejecuta:
docker exec netmon sh -c "apk add --no-cache tcpdump && tcpdump -c 5 -i any port 80 -n"

Deberías ver que el contenedor captura el tráfico HTTP en el puerto 80.

Esto demuestra cómo la red del anfitrión permite que el contenedor acceda a las interfaces de red del anfitrión y capture el tráfico, lo que sería más difícil con la red de puente.

Usar la red del anfitrión en un archivo Docker Compose

Para aquellos que utilizan Docker Compose, se puede configurar un servicio para que utilice la red del anfitrión en el archivo docker-compose.yml:

version: "3"
services:
  web:
    image: nginx:alpine
    network_mode: "host"

Esta configuración haría que el servicio web utilice la pila de red del anfitrión.

Consideraciones de seguridad y mejores prácticas

Al utilizar la red del anfitrión (host networking) con contenedores Docker, es importante entender las implicaciones de seguridad y seguir las mejores prácticas.

Implicaciones de seguridad de la red del anfitrión

El uso de la red del anfitrión reduce el aislamiento entre el contenedor y el sistema anfitrión. Esto tiene varias implicaciones de seguridad:

  1. Reducción del aislamiento de red: Los contenedores con red del anfitrión pueden acceder a todas las interfaces de red y puertos en el anfitrión.
  2. Potenciales conflictos de puertos: Los servicios en el contenedor pueden entrar en conflicto con los servicios que se ejecutan en el anfitrión.
  3. Mayor superficie de ataque: Si un contenedor es comprometido, el atacante podría tener un acceso más directo a la red del anfitrión.

Mejores prácticas para el uso de la red del anfitrión

Siga estas mejores prácticas al utilizar la red del anfitrión:

  1. Limite los privilegios del contenedor: Incluso cuando se utiliza la red del anfitrión, siga el principio del menor privilegio:
## Run a container with host networking but drop capabilities
docker run --name secure-host-net --network host --cap-drop ALL --cap-add NET_ADMIN -d alpine:latest sleep infinity
  1. Utilice la red del anfitrión solo cuando sea necesario: Utilice la red del anfitrión solo para los contenedores que realmente la necesiten, no como opción predeterminada.
  2. Auditorías de seguridad regulares: Monitoree más de cerca los contenedores que utilizan la red del anfitrión en busca de posibles problemas de seguridad.
  3. Utilice sistemas de archivos de solo lectura cuando sea posible:
## Run a container with host networking and read-only filesystem
docker run --name readonly-host-net --network host --read-only -d alpine:latest sleep infinity
  1. Limpie los contenedores no utilizados:
## Remove all stopped containers (cleanup)
docker container prune -f

Limpieza del entorno de laboratorio

Limpiemos todos los contenedores que creamos durante este laboratorio:

## List all containers
docker ps -a

## Stop all running containers
docker stop $(docker ps -q) 2> /dev/null || true

## Remove all containers
docker rm $(docker ps -a -q) 2> /dev/null || true

## Verify all containers are removed
docker ps -a

Debería ver que no se listan contenedores después de ejecutar estos comandos.

Cuándo elegir la red de puente (bridge) vs. la red del anfitrión

Para resumir cuándo utilizar cada tipo de red:

Utilice la red de puente (predeterminada) cuando:

  • Necesite aislamiento entre contenedores.
  • Necesite un control preciso sobre el mapeo de puertos.
  • Su aplicación no requiera acceso directo a las interfaces de red del anfitrión.
  • La seguridad sea una prioridad máxima.

Utilice la red del anfitrión cuando:

  • El rendimiento de la red sea crítico.
  • Necesite acceso directo a las interfaces de red del anfitrión.
  • Su contenedor necesite utilizar muchos puertos o asignación dinámica de puertos.
  • Necesite monitorear el tráfico de red.
  • El contenedor debe parecer tener la misma dirección IP que el anfitrión.

Resumen

En este laboratorio, has aprendido:

  • Las diferencias entre la red de puente (bridge networking) de Docker y la red del anfitrión (host networking).
  • Cómo ejecutar contenedores Docker con la red del anfitrión utilizando la bandera --network host.
  • Las ventajas de rendimiento de la red del anfitrión en comparación con la red de puente.
  • Casos de uso prácticos en los que la red del anfitrión es beneficiosa.
  • Consideraciones de seguridad y mejores prácticas al utilizar la red del anfitrión.

La red del anfitrión elimina el aislamiento de red entre el contenedor y el anfitrión, lo que permite que el contenedor acceda directamente a las interfaces de red del anfitrión. Esto puede mejorar el rendimiento, simplificar la configuración y permitir que ciertos tipos de aplicaciones, como las herramientas de monitoreo de red, funcionen correctamente.

Recuerda que aunque la red del anfitrión ofrece ciertas ventajas, también reduce el aislamiento y puede introducir preocupaciones de seguridad. Siempre sigue las mejores prácticas y utiliza la red del anfitrión solo cuando tu caso de uso lo requiera.