# 5.1.- Redes en Docker.

pixabay.com. Conectivity Network (CC BY)

Antes de seguir avanzando en la complejidad de la creación y ejecución de contenedores, debemos tener claros los conceptos de Redes y Almacenamiento en Docker. En primer lugar, hablaremos de las redes de Docker.

Docker permite manejar redes de manera flexible y configurable. Cada contenedor de Docker puede conectarse a una o varias redes, y cada red puede tener múltiples contenedores conectados. Docker ofrece varios tipos de redes, incluyendo bridge, host, none y overlay.

Es la red por defecto que se crea cuando instalas Docker. Cada contenedor conectado a una red Bridge obtiene su propia dirección IP y subnet. Los contenedores en la misma red Bridge pueden comunicarse entre sí utilizando direcciones IP. El acceso a la red externa se logra a través de NAT (Network Address Translation).

Elimina la capa de red entre el contenedor y el host de Docker. Cuando un contenedor se ejecuta en esta red, comparte el espacio de red del host, utilizando el mismo puerto y la misma dirección IP que el host. No hay aislamiento de red entre el contenedor y el host.

Proporciona a los contenedores su propio espacio de red, pero sin ninguna capacidad para comunicarse con otros contenedores o con el host. Se utiliza cuando quieres aislar completamente la red de un contenedor.

Permite a los contenedores en diferentes hosts comunicarse como si estuvieran en la misma red. Se utiliza en aplicaciones de varios contenedores que se ejecutan en un clúster de Docker. Proporciona equilibrio de carga de red y servicios de red seguros entre diferentes nodos en un clúster de Docker.

Estos son los comandos básicos para manejar las redes en Docker. Con ellos, puedes crear, inspeccionar, conectar, desconectar y eliminar redes, lo que te da mucho control sobre cómo tus contenedores se comunican entre sí:

## Crear una red

Para crear una red nueva, puedes usar el comando docker network create. Por ejemplo, para crear una red de tipo bridge llamada my-network, puedes usar el siguiente comando:

    docker network create --driver bridge my-network

Por defecto si no indicamos --driver, Docker creará la red de tipo bridge.

## Listar redes

Para listar todas las redes existentes en Docker, puedes usar el comando docker network ls. Este comando te mostrará todas las redes, incluyendo su ID, nombre, driver y tipo de scope.

Manuel J. Rodríguez. Listar redes Docker (Dominio público)

## Inspeccionar una red

Para obtener más información sobre una red en particular, puedes usar el comando docker network inspect. Por ejemplo, para inspeccionar la red minikube que tengo disponible en el servidor, podríamos usar el siguiente comando:

    docker network inspect minikube

Este comando te mostrará toda la información sobre la red, incluyendo su configuración y los contenedores conectados a ella. Y obtendríamos un resultado tal que así:

Manuel J. Rodríguez. docker network inspect (Dominio público)

## Conectar un contenedor a una red

Para conectar un contenedor existente a una red, puedes usar el comando docker network connect. Por ejemplo, para conectar el contenedor my-container a la red my-network, puedes usar el siguiente comando:

    docker network connect my-network my-container

## Desconectar un contenedor de una red

Para desconectar un contenedor de una red, puedes usar el comando docker network disconnect. Por ejemplo, para desconectar el contenedor my-container de la red my-network, puedes usar el siguiente comando:

    docker network disconnect my-network my-container

## Eliminar una red

Para eliminar una red, puedes usar el comando docker network rm. Por ejemplo, para eliminar la red my-network, puedes usar el siguiente comando:

    docker network rm my-network

IMPORTANTE: Ten en cuenta que solo puedes eliminar una red si no hay contenedores conectados a ella.

# Para saber más

Estos recursos cubren una amplia gama de temas relacionados con las redes de Docker y deberían ayudarte a profundizar en el tema:

- Docker Networking: https://docs.docker.com/network/
- Understanding Docker Networking Drivers and their Use Cases: https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/

# Ejercicio Resuelto

Se requiere la creación de dos contenedores Docker, uno para un servidor web Apache (httpd) y otro para una base de datos MySQL (mysql/mysql-server:8.0). Ambos contenedores deben estar en la misma red personalizada de tipo bridge para poder comunicarse entre sí.

# Retroalimentación

Primero, debes crear una red personalizada de tipo bridge. Para hacerlo, puedes usar el comando docker network create:

    docker network create my_bridge_network

Ahora, puedes iniciar el contenedor de MySQL, asegurándote de agregarlo a my_bridge_network. También necesitarás establecer una contraseña de root para MySQL usando la variable de entorno MYSQL_ROOT_PASSWORD:

    docker run -d \
    --network my_bridge_network \
    --name mysql-container \
    -e MYSQL_ROOT_PASSWORD=root \
    mysql/mysql-server:8.0

A continuación, inicia el contenedor httpd, asegurándote de agregarlo también a my_bridge_network:

    docker run -d \
    --network my_bridge_network \
    --name apache-container \
    -p 8080:80 \
    httpd

Aquí, el flag -p 8080:80 está exponiendo el puerto 80 del contenedor al puerto 8080 del host para que puedas acceder al servidor web Apache desde tu navegador web en http://localhost:8080.

Ahora tienes dos contenedores ejecutándose en la misma red personalizada. Pueden comunicarse entre sí usando los nombres de los contenedores (mysql-container y apache-container) como hostnames.

Para verificar que los contenedores están correctamente conectados en la misma red, puedes realizar las siguientes pruebas:

Verificar la red con docker network inspect: Este comando muestra la información detallada sobre la red my_bridge_network, incluyendo qué contenedores están en la red y las direcciones IP que se les han asignado.

    docker network inspect my_bridge_network

En la salida de este comando, deberías ver algo similar a esto:

Manuel J. Rodríguez. Docker network inspect (Dominio público)

Como puedes ver, tanto apache-container como mysql-container están en la red my_bridge_network y tienen direcciones IP asignadas.

Para comprobar que los contenedores pueden comunicarse entre sí, puedes hacer un ping desde uno de los contenedores al otro. Primero, inicia una terminal en el contenedor apache-container:

    docker exec -it apache-container bash

Luego, desde la terminal del contenedor, haz un ping al contenedor mysql-container usando su nombre como hostname:

    ping mysql-container

Deberías ver una salida similar a la siguiente, lo que indica que los contenedores pueden comunicarse entre sí a través de la red:

    PING mysql-container (172.19.0.3): 56 data bytes
    64 bytes from 172.19.0.3: icmp_seq=0 ttl=64 time=0.070 ms

No olvides salir de la terminal del contenedor cuando hayas terminado:

    exit

# Autoevaluación

# Pregunta

¿Cuál de las siguientes afirmaciones sobre las redes en Docker es correcta?

# Respuestas

Opción 1

La red de tipo 'none' en Docker permite la comunicación entre contenedores en la misma máquina host.

Opción 2

La red de tipo 'host' en Docker hace que los contenedores compartan la red del host, pero sin su propio espacio de direcciones IP.

Opción 3

La red de tipo 'overlay' en Docker es útil para habilitar la comunicación entre contenedores en diferentes máquinas host en un clúster de Docker Swarm o Kubernetes.

Opción 4

La red de tipo 'bridge' en Docker no permite la comunicación entre contenedores.

# Retroalimentación

La red de tipo 'overlay' en Docker permite la comunicación entre contenedores en diferentes hosts y es comúnmente utilizada en configuraciones de Docker Swarm y Kubernetes.

# Solución

1. Incorrecto
2. Incorrecto
3. Correcto
4. Incorrecto

Creado con eXeLearning (Ventana nueva)