0% encontró este documento útil (0 votos)
210 vistas12 páginas

Redes en Docker

Las tres redes preconfiguradas en Docker son bridge, host y none. La red bridge es la red estándar a la que se conectan todos los contenedores de forma predeterminada. Los contenedores pueden comunicarse entre sí a través de esta red interna privada. Los usuarios pueden crear redes personalizadas para aislar lógicamente los contenedores de diferentes aplicaciones y evitar su comunicación.

Cargado por

Juan Alonso
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
210 vistas12 páginas

Redes en Docker

Las tres redes preconfiguradas en Docker son bridge, host y none. La red bridge es la red estándar a la que se conectan todos los contenedores de forma predeterminada. Los contenedores pueden comunicarse entre sí a través de esta red interna privada. Los usuarios pueden crear redes personalizadas para aislar lógicamente los contenedores de diferentes aplicaciones y evitar su comunicación.

Cargado por

Juan Alonso
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 12

REDES EN DOCKER

Cuando se instala Docker, se crean tres redes: Bridge, none y host.

Estas 3 redes preconfiguradas en Docker son:

1. Bridge. La red standard que usarán todos los contenedores.


2. Host. El contenedor usará el mismo IP del servidor real que tengamos.
3. None. Se utiliza para indicar que un contenedor no tiene asignada una red.

La red “bridge” es una red interna privada creada por Docker en el host. Todos los
contenedores se conectan a esta red de forma predeterminada y obtienen una dirección IP
interna,  generalmente en el rango 172.17.0.*. Los contenedores pueden acceder entre sí
utilizando esta IP interna

Para este tutorial, vas a utilizar una imagen de alpine. Lo cierto es que tendrás que levantar
tantos contenedores como sean necesarios para ver como se relacionan unos con otros, y que
sentido tienen esto de las redes.

GESTIÓN DE REDES EN DOCKER

Antes de adentrarte en esto de las redes en Docker, te indico los comandos que tienes a tu
alcance para gestionar las redes,

 connect te permitirá conectar un contenedor a un red


 disconnect hace la operación opuesta a la anterior, es decir, desconecta un contenedor
de una red
 create es el comando que debes utilizar para crear una red
 inspect te permite obtener información detallada de una red
 ls es el comando a utilizar para ver las redes que tienes
 prune es el comando con el que borrará todas las redes que no estés utilizando
 rm te permite borrar una o mas redes

Redes en Docker
1
TIPOS DE CONTROLADORES DE RED EN DOCKER

Existen diferentes tipos controladores de red (network drivers) en Docker.

 driver este es el controlador por defecto. Es el que en condiciones normales tienes que


utilizar para conectar contenedores entre si. Por esta razón es la mejor solución para
conectar contenedores que se encuentran corriendo en el mismo anfitrión.
 host este tipo de controlador elimina el aislamiento entre el contenedor y el anfitrión.
 overlay. Permite conectar diferentes contenedores en diferentes nodos.
 macvila permite asingar una dirección MAC a un contenedor.
 none inhabilita todas las redes.

A parte, es posible instalar complementos de terceros.

¿QUE TIENES AHORA MISMO?

Primero ejecuta 

docker network ls

Verás que tienes tres redes actualmente levantadas,

¿Pueden los contenedores comunicarse entre sí?  Vamos a averiguarlo.


1. Ejecute un nginx y un contenedor httpd

docker run -i -t --name apache1 httpd
docker run -i -t --name nginx1 nginx

2. Inicie una sesión de bash dentro del contenedor de


apache
docker exec -it apache1 bash     
root@bcdd99ca3f9d:/usr/local/apache2#

3. Instale iputils-ping para intentar hablar con el


contenedor nginx
apt update && apt install iputils-ping -y
4. Averigüemos la dirección IP del contenedor nginx.
docker container inspect nginx1

Redes en Docker
2
5. Haga ping al contenedor nginx usando la dirección IP que vimos arriba, desde dentro del
contenedor apache,

docker exec -it apache1 bash    
root@8287b6b9583a:/usr/local/apache2# ping 172.17.0.2 

¡Excelente! podemos hablar con el contenedor nginx.

Esto es posible gracias a las redes acoplables. ¿Qué es una


red?

Se puede pensar en una red como una


colección de contenedores / nodos
conectados entre sí de tal manera que
pueden comunicarse con cualquier

Redes en Docker
3
contenedor / nodo que se encuentre dentro
de esta red.

Creando nuestra propia red

Ahora, ya sabemos que los contenedores pueden


comunicarse entre sí en la misma red.

Consideremos un escenario en el que tenemos dos


aplicaciones diferentes ejecutándose, que no están
relacionadas entre sí. ¿Cómo nos aseguraríamos de que no
se permita la comunicación entre contenedores de
diferentes aplicaciones en tal escenario?

Echemos un vistazo a la solución.

Podemos crear nuestras propias redes para aislar


contenedores de forma lógica.

Los contenedores de la misma red pueden comunicarse


entre sí.

Redes en Docker
4
Veamos esto en acción.

1. Cree una red llamada aplicación y otra llamada web

docker network create app
docker network create web

2. Verifiquemos que se creó la red


docker network ls 

3. Inicie un contenedor de apache y agréguelo a la red de


app
docker  run -d --name apacheapp --network app httpd 
4. Inicie un contenedor mongo db y agréguelo a la red de
app también
docker  run -d --name mongoapp --network app mongo

5.  Inicie otro contenedor mongo db y agréguelo a la red


web de la siguiente manera
docker  run -d --name mongoweb --network web mongo

Redes en Docker
5
6.  Inicie una sesión de bash dentro del contenedor de
apache de la red web
docker exec -it apacheapp bash

7. Instale iputils-ping a ping para hablar con el


contenedor mongo
apt update && apt install iputils-ping –y

8. Descubra la dirección IP del contenedor apachedb


docker  inspect --format '{{json .NetworkSettings.Networks}}' mongoapp

9. Haga ping al contenedor Mongo desde el de apacheapp


usando la dirección IP que vimos arriba
docker exec -it apacheapp bash

¡Excelente! podemos hablar con el contenedor mongo en la


misma red.

Redes en Docker
6
10. Ahora, intentemos hacer ping al contenedor webdb de
otra red. Descubra la dirección IP de la misma manera que
lo hicimos antes
docker  inspect --format '{{json .NetworkSettings.Networks}}' mongoweb

docker exec -it apacheapp bash

Por lo tanto, podemos asegurarnos de que los contenedores de diferentes aplicaciones no

puedan comunicarse entre sí.

Información adicional: los contenedores en diferentes redes no pueden comunicarse entre

sí porque se encuentran en diferentes subredes.

Entonces, ¿cómo interactúa el mundo exterior con el


contenedor?

Esto se puede lograr abriendo puertos del contenedor y


mapeándolos al puerto del host.

Redes en Docker
7
Veamos cómo hacer esto.

1. Ejecute un contenedor nginx y asigne el puerto 80 del


host al puerto 80 del contenedor.

docker run -it --name nginx2 -p 80:80 nginx

2. Veamos si el mapeo se realizó correctamente.


docker port 9bebce79bdaf

3. También verifiquemos si podemos ver el servidor nginx


ejecutándose en el puerto 80 del host navegando
a http: // localhost: 80

Redes en Docker
8
Nombres DNS

En el entorno de Docker, las direcciones IP no son


confiables.

Esto se debe a que un contenedor puede bloquearse /


detenerse inesperadamente y luego un nuevo contenedor
toma su lugar con una IP diferente.

Entonces, ¿cómo aseguramos la comunicación en tal


situación?

Aquí es donde entra en juego un nombre de DNS. Docker


por defecto usa nombres de contenedor como nombres de
host que los contenedores pueden usar para comunicarse
entre sí.

Hagamos un ejercicio para ver cómo es útil. Vamos a


trabajar ahora con la red web.

Redes en Docker
9
1. Entramos en el bash de apacheapp, haga ping al
contenedor mongoapp usando su nombre
docker exec -it apacheapp bash

2. Detenga y borra este contenedor


docker  rm -f mongoapp

3. Inicie cualquier contenedor en la misma red para que se le asigne la ip 172.20.0.3


docker  run -d --name mongo_temp --network app mongo

docker  inspect --format '{{json .NetworkSettings.Networks}}' mongo_temp

4.  Inicie otro contenedor de mongo con el mismo nombre


docker container run -d --name mongoapp --network app mongo

5.  Intente volver a hacer ping al contenedor mongoapp desde el contenedor de apache


docker exec -it apacheapp bash

Redes en Docker
10
Notará que incluso cuando la ip del contenedor ha cambiado, podemos hacer ping usando el

DNS (nombre del contenedor).


Esto asegura una comunicación confiable en un entorno muy dinámico.

UN CONTENEDOR EN DOS REDES DOCKER

Por supuesto, puedes tener un contenedor conectado a dos redes Docker. Para ello, crea una
nueva red con la definición que has visto anteriormente,

docker network create red1

Crea 2 contenedores que pertenezcan a esa red creada

docker run -dit --rm --name alpine1 --network red1 alpine sh
docker run -dit --rm --name alpine2 --network red1 alpine sh

Crea una nueva red

docker network create red2

Ahora levanta un tercer contenedor que tenga una pata en esta red,

docker run -dit --rm --name alpine3 --network red2 alpine sh

Y conecta este tercer contenedor alpine3 con la primera de las redes red1. Para hacer esto,
ejecuta la siguiente instrucción,

docker network connect red1 alpine3
Así tienes el contenedor alpine3 con una pata en cada una de las redes red1 y red2. De esta
manera desde este contendor puedes hacer ping a los otros dos contenedores. Pero, si
levantamos otro contenedor mas que esté en esta segunda red y que solo esté conectado
con alpine3, no verá a los otros contenedores, vamos allá,

docker run -dit --name alpine4 --network red2 alpine sh

Redes en Docker
11
Así si intentas hacer ping desde alpine3 a cualquier otro docker, ya sea directamente por su
nombre o por la IP, verás que tienes respuesta de cualquiera de ellos. Si por el contrario, lo
intentas hacer desde este último contenedor alpine4, verás que solo te responde alpine3, tanto
por IP como por nombre. Si intentas hacer ping desde alpine4 a alpine1 ó alpine2, verás que
ninguno de los dos te da respuesta, ni por IP ni por nombre.

Una vez hayas terminado de jugar con todos los contenedores, tan solo tienes que hacer docker
stop $(docker ps -q), y se detendrán y borrarán todos los contenedores. Y lo único que te
resta por hacer es borrar las redes. Esto último, es tan sencillo como ejecutar docker network
prune, que borrará todas las redes que no se estén utilizando excepto a las que están por
defecto.

Redes en Docker
12

También podría gustarte