Skip to content

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)

  1. 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
    
  2. Navegar hasta el directorio llamado nginx-node-redis:
    cd nginx-node-redis
    
    Dentro de este directorio, encontrará dos subdirectorios: nginx y web.
  3. Ingresar al directorio llamado nginx para crear la imagen ejecutando el siguiente comando:
    docker build -t nginx .
    
  4. Ingresar al directorio llamado web para crear la imagen ejecutando el siguiente comando:
    docker build -t web .
    
  5. 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
    
  6. 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
    
  7. Inicie el primer contenedor web ejecutando el siguiente comando:
    docker run -d --name web1 -h web1 --network sample-app --network-alias web1 web
    
  8. Inicie el segundo contenedor web ejecutando lo siguiente:
    docker run -d --name web2 -h web2 --network sample-app --network-alias web2 web
    
  9. 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).

  10. Verifique que los contenedores estén activos ejecutando el siguiente comando:
    docker ps
    
    Verá un resultado como el siguiente:
    CONTAINER 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
    
  11. Una vez que todo esté en funcionamiento, puede hacer varias peticiones a http://localhost con el comando:
    curl http://localhost:8090; echo
    
    Ejecute varias veces para ver el host que está manejando la solicitud y la cantidad total de solicitudes:
    web2: 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)
🛑 Precaución: Este comando eliminará todos los contenedores e imágenes, lo que puede afectar servicios en producción si se ejecuta en un entorno en uso.

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
  1. Crear crear red tipo bridge app1

    docker network create   --driver=bridge \
    --subnet=192.168.25.0/28 --gateway=192.168.25.1 app1
    

  2. 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
    

  3. Identidicar el la ip asignada al contenedor db_01

    docker inspect db_01 \
    -f "{{.NetworkSettings.Networks.app1.IPAddress}}"
    

  4. 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.

    docker run --rm --net app1 --name app_01 \
    -e PMA_HOST=db_01 -d  -p 30080:80 phpmyadmin/phpmyadmin:latest 
    
    El contenido de la variable PMA_HOST, contiene el nombre del contenedor que está ejecutandose en la misma red de docker `app01. Esta es la forma recomendada, evitando utilizar --link.

  5. Valide la dirección IP de su servidor de docker.

    HOST_EXTERNAL_IP=$(curl -s http://showip.net)
    echo http://$HOST_EXTERNAL_IP:30080
    

  6. Validar desde su navegador de internet el URL deplegado en el paso anterior. app_01

  7. Ingrese con las credenciales definidas en el paso 2. student/M4rI_dB

  8. Obtenga la contraseña autogenerada para el usuario root de la base de datos.

    docker logs db_01 2>&1|grep "GENERATED ROOT PASSWORD"
    

  9. Cierre la sesión en el app phpmyadmin logout_app_01

  10. Ingrese con las credenciales obtenidas en el paso 8. root/************

Limpieza de ambiente

  1. Detenga/elimine los contenedores e imágenes utilizados

    docker stop db_01 app_01
    
    docker rmi phpmyadmin/phpmyadmin:latest mariadb:10.7
    

  2. Eliminar redes creadas

    docker network rm app1