Tema:
Docker Network
Introducción
Docker es una herramienta poderosa para el despliegue de aplicaciones contenerizadas, y su funcionalidad de redes es un componente esencial para permitir la comunicación entre contenedores, servicios externos y el sistema anfitrión. Las redes en Docker permiten la conectividad segura y eficiente entre aplicaciones distribuidas, proporcionando flexibilidad para manejar escenarios que van desde entornos de desarrollo local hasta arquitecturas complejas en producción.
Las redes en Docker no solo facilitan la comunicación entre contenedores, sino que también ofrecen control sobre aspectos como la segregación de tráfico, seguridad, balanceo de carga y resolución de nombres, haciéndolo una pieza clave en la construcción de sistemas modernos.
Objetivo
Objetivo General:
- El objetivo de este tema es proporcionar una comprensión completa de las redes en Docker.
Tipos de Redes en Docker
Bridge (puente):
- Es el tipo de red por defecto.
- Todos los contenedores en esta red pueden comunicarse entre sí mediante IPs o nombres DNS.
- Se usa típicamente para aplicaciones que necesitan comunicarse dentro del mismo host.
docker network create my_bridge_network
docker run --network=my_bridge_network --name=container1 -d nginx
docker run --network=my_bridge_network --name=container2 -d alpine sleep 1000
docker exec container2 ping container1
Host:
- Permite que el contenedor comparta directamente la pila de red del host.
- Útil para escenarios donde el rendimiento de red es crítico.
- No hay aislamiento de red entre el contenedor y el host.
docker run --network=host nginx
None:
- Desconecta al contenedor de cualquier red.
- Útil para ejecutar procesos completamente aislados que no requieren conectividad.
docker run --network=none alpine ifconfig
Resumen de SubComandos
| Command | Description |
|---|---|
docker network connect |
Connect a container to a network |
docker network create |
Create a network |
docker network disconnect |
Disconnect a container from a network |
docker network inspect |
Display detailed information on one or more networks |
docker network ls |
List networks |
docker network prune |
Remove all unused networks |
docker network rm |
Remove one or more networks |
Laboratorio 1: Docker Networking (Multi Containers App)
- Utilice el siguiente comando en una terminal para clonar el repositorio de la aplicación de muestra.
git clone https://github.com/dockersamples/nginx-node-redis - Navegar hasta el directorio llamado
nginx-node-redis:Dentro de este directorio, encontrará dos subdirectorios: nginx y web.cd nginx-node-redis - Ingresar al directorio llamado
nginxpara crear la imagen ejecutando el siguiente comando:docker build -t nginx . - Ingresar al directorio llamado
webpara crear la imagen ejecutando el siguiente comando:docker build -t web . - Antes de poder ejecutar una aplicación con varios contenedores, debe crear una red a través de la cual se puedan comunicar todos ellos. Puede hacerlo con el siguiente comando:
docker network create sample-app - Inicie el contenedor Redis ejecutando el siguiente comando, que lo adjuntará a la red creada previamente y creará un alias de red (útil para búsquedas de DNS):
docker run -d --name redis --network sample-app --network-alias redis redis - Inicie el primer contenedor web ejecutando el siguiente comando:
docker run -d --name web1 -h web1 --network sample-app --network-alias web1 web - Inicie el segundo contenedor web ejecutando lo siguiente:
docker run -d --name web2 -h web2 --network sample-app --network-alias web2 web - Inicie el contenedor Nginx ejecutando el siguiente comando:
docker run -d --name nginx --network sample-app -p 8090:80 nginx📝 Nginx se utiliza normalmente como proxy inverso para aplicaciones web, enrutando el tráfico a servidores backend. En este caso, enruta a los contenedores backend de Node.js (web1 o web2).
- Verifique que los contenedores estén activos ejecutando el siguiente comando:
Verá un resultado como el siguiente:
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2cf7c484c144 nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:80->80/tcp nginx 7a070c9ffeaa web "docker-entrypoint.s…" 19 seconds ago Up 18 seconds web2 6dc6d4e60aaf web "docker-entrypoint.s…" 34 seconds ago Up 33 seconds web1 008e0ecf4f36 redis "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp - Una vez que todo esté en funcionamiento, puede hacer varias peticiones a http://localhost con el comando:
Ejecute varias veces para ver el host que está manejando la solicitud y la cantidad total de solicitudes:
curl http://localhost:8090; echoweb2: Number of visits is: 9 web1: Number of visits is: 10 web2: Number of visits is: 11 web1: Number of visits is: 12📝 Es posible que haya notado que Nginx, que actúa como un proxy inverso, probablemente distribuye las solicitudes entrantes de manera rotatoria entre los dos contenedores del backend. Esto significa que cada solicitud puede dirigirse a un contenedor diferente (web1 y web2) de manera rotatoria. La salida muestra incrementos consecutivos para los contenedores web1 y web2 y el valor del contador real almacenado en Redis se actualiza solo después de que la respuesta se envía de vuelta al cliente.
Para limpiar el ambiente completamente, ejecuta los siguientes comandos:
docker stop web1 ; docker rm web1
docker stop web2 ; docker rm web2
docker stop redis ; docker rm redis
docker stop nginx ; docker rm nginx
docker network rm sample-app
Limpiar todo el ambiente del servidor Docker CE
docker rm -f $(docker ps -aq) && docker rmi -f $(docker images -q)
Laboratorio 2: Docker Networking (Red Personalizada)
El objetivo de este laboratorio, es explorar la función que tiene el desplegar un app utilizando una red personalizada.
Redes
| RED | SUBNET | GATEWAY |
|---|---|---|
| app1 | 192.168.25.0/28 | 192.168.25.1 |
Contenedores APP1
| NOMBRE | IMAGEN | RED | VARIABLES | PUERTO EXPUESTO |
|---|---|---|---|---|
| db_01 | mariadb:10.7 | app1 | MARIADB_PASSWORD='M4rI_dB' | N/A |
| MARIADB_DATABASE=db_app_01 | ||||
| MARIADB_RANDOM_ROOT_PASSWORD='yes' | ||||
| app_01 | phpmyadmin:latest | app1 | PMA_HOST=db_01 | 30080/tcp |
-
Crear crear red tipo bridge app1
docker network create --driver=bridge \ --subnet=192.168.25.0/28 --gateway=192.168.25.1 app1 -
Crear contenedor db_01
docker run --rm --net app1 -e MARIADB_USER=student \ -e MARIADB_PASSWORD='M4rI_dB' \ -e MARIADB_DATABASE=db_app_01 \ -e MARIADB_RANDOM_ROOT_PASSWORD="yes" -d --name db_01 mariadb:10.7 -
Identidicar el la ip asignada al contenedor db_01
docker inspect db_01 \ -f "{{.NetworkSettings.Networks.app1.IPAddress}}" -
Crear contenedor app_01. Este contenedor contiene una aplicación web, para la genstión de MySQL/MariaDB. Será utilizada en esta práctica con fines didacticos, no se recomienda exponer este tipo de aplicaciones al exterior de su red.
El contenido de la variabledocker run --rm --net app1 --name app_01 \ -e PMA_HOST=db_01 -d -p 30080:80 phpmyadmin/phpmyadmin:latestPMA_HOST, contiene el nombre del contenedor que está ejecutandose en la misma red de docker`app01. Esta es la forma recomendada, evitando utilizar --link. -
Valide la dirección IP de su servidor de docker.
HOST_EXTERNAL_IP=$(curl -s http://showip.net) echo http://$HOST_EXTERNAL_IP:30080 -
Validar desde su navegador de internet el URL deplegado en el paso anterior.

-
Ingrese con las credenciales definidas en el paso 2.
student/M4rI_dB -
Obtenga la contraseña autogenerada para el usuario root de la base de datos.
docker logs db_01 2>&1|grep "GENERATED ROOT PASSWORD" -
Cierre la sesión en el app phpmyadmin

-
Ingrese con las credenciales obtenidas en el paso 8.
root/************
Limpieza de ambiente
-
Detenga/elimine los contenedores e imágenes utilizados
docker stop db_01 app_01docker rmi phpmyadmin/phpmyadmin:latest mariadb:10.7 -
Eliminar redes creadas
docker network rm app1