11# Parte 5: Networking #
22
3- # Lo que habíamos visto hasta ahora: Port Mapping
4-
5- # Vimos el ejemplo con Nginx, en el que mapeábamos un puerto del host al puerto 80, que es el que teníamos configurado como servidor web.
6- docker run -d -p 9090:80 nginx
7-
8- # Podemos aprovecharnos de la información de EXPOSE para publicar todos los puertos que
9- # Utiliza el contenedor
10- # A través de inspect puedo saber qué puertos utilizará esta imagen
11- docker inspect hello-world
12- docker run -d --name hello-world-with-a-lot-of-ports --publish-all hello-world:latest
13- # o bien
14- docker run -d --name hello-world-with-a-lot-of-ports -P hello-world:latest
15-
16- # Para poder visualizar cuáles son los puertos expuestos y cuáles han sido asignados del host:
17- docker port hello-world-with-a-lot-of-ports
18-
19- # En linux puedes ver que hay una interfaz más llamada docker0
20- ssh gis@137.135.216.143
21- ifconfig
22- exit
23-
243# Listar las redes disponibles en este host
254docker network ls
265# Por defecto, ya hay una red creada en un host de Docker (En Linux se llama bridge y el Docker se llama nat)
@@ -31,119 +10,129 @@ docker network ls
3110# De forma predeterminada, esta es la red a la que se conectarán todos los contenedores para los que NO especifiquemos una red a través de --network
3211docker network inspect bridge # En el apartado Containers es donde verás todos los contenedores que están conectados a esta red.
3312
34- docker network inspect bridge --format ' {{json .Containers}}' | jq
13+ # Creo un nuevo contenedor sin especificar la red
14+ docker run -d --name web nginx
3515
36- # A modo de ejemplo vamos a crear dos contenedores que se conecten a la red por defecto
37- docker run -dit --name container-1 alpine ash
38- docker run -dit --name container-2 alpine ash
16+ # BONUS: otra forma de mostrar el resultado
17+ docker network inspect bridge --format ' {{json .Containers}}' | jq
3918
40- # El comando -d significa que estos dos contenedores estarán desatachados del terminal. Sin embargo con -it indicamos
41- # que ambos serán interactivos (es decir que podemos escribir en el terminal de estos) y la t significa que podemos ver
42- # tanto lo que escribimos como lo que nos devuelve como resultado.
43- # ash es el shell que utiliza por defecto Alpine, en lugar de bash que se utiliza en otras distros.
44- docker ps
19+ # Ahora creamos otro contenedor sin especificar tampoco la red, por lo tanto también se conectará a bridge
20+ docker run -d --name web-apache httpd
4521
46- # Elimina el anterior para que quede más limpia la salida
47- docker rm -f hello-world-with-a-lot-of-ports
22+ # Comprobamos cuántos contenedores se están ejecutando
4823docker ps
4924
5025# Inspeccionar la configuración de una red
5126docker network inspect bridge --format ' {{json .Containers}}' | jq
5227
53- # Conectate al primer contenedor alpine1
54- docker attach container-1
55- # visualiza las interfaces de red de este contenedor
56- ip addr show
57- # La primera interfaz es la llamada loopback, esta permite al contenedor hablar consigo mismo.
58- # La llamada eth0 es la que tiene la IP adjudicada para la red bridge
59- # Otra prueba que puedes hacer es comprobar que el contenedor está conectado a internet
60- ping -c 2 172.17.0.4
61- ping -c 2 container-2 # En la red por defecto, bridge, los contenedores no se conocen por su nombre, solo por la IP
62- exit
28+ # Conectate al contenedor web
29+ docker exec -ti web /bin/bash
6330
31+ # En esta distribución de debian no está instalado net-tools
32+ apt update && apt -y install net-tools iputils-ping
33+ # Ver las interfaces de red del contenedor
34+ ifconfig
35+ # Hace ping al contenedor web-apache
36+ ping 172.17.0.3
37+ # Hace ping usando el nombre del contenedor
38+ ping web-apache
39+ # Salir del terminal asociado al contenedor
40+ exit
6441
6542# Crear una nueva red
66- docker network create network-a
43+ docker network create lemoncode-net
6744
6845# Por defecto la crea de tipo bridge en Linux (y tipo NAT en Windows)
6946docker network ls
7047
71- # Ahora crea un contenedor que esté asociado a tu nueva red
72- docker container run -dit --name container-a --network network-a alpine ash
48+ # Inspeccionamos la nueva red
49+ # En las redes definidas por el usuario los contenedores no solo pueden comunicarse a través de su IP
50+ # sino que también pueden hacerlo a través del nombre del contenedor
7351
74- # Con el siguiente comando puedes saber qué contenedores están asociados a una red
75- docker network inspect network-a --format ' {{json .Containers}}' | jq
52+ docker network inspect lemoncode-net
7653
77- # Ahora vamos a añadir un segundo contenedor a nuestra nueva red
78- docker container run -dit --name container-b --network network-a alpine ash
54+ # Creo un nuevo contenedor en la red lemoncode-net
55+ docker run -d --name web2 --network lemoncode-net nginx
7956
80- # Ahora tienes dos contenedores dentro de la misma red:
81- docker network inspect network-a --format ' {{json .Containers}}' | jq
57+ # Me conecto a un terminal como hice anteriormente
58+ # Conectate al contenedor web
59+ docker exec -ti web2 /bin/bash
60+ # Instalo las herramientas
61+ apt update && apt -y install net-tools iputils-ping
62+ # Compruebo las interfaces de red
63+ ifconfig
64+ # Intento hacer ping a uno de los contenedores de la otra red
65+ ping 172.17.0.2
66+ # Salimos del terminal asociado al contenedor
67+ exit
8268
83- # Atacha el terminal a container-b y haz un ping al container-a utilizando su nombre
84- docker attach container-b
85- ping -c 3 container-a
69+ # Creo otro contenedor en la misma red que el anterior
70+ docker run -d --name web-apache2 --network lemoncode-net httpd
71+
72+ # Inspeccionamos la nueva red
73+ docker network inspect lemoncode-net
74+
75+ # Si vuelvo a conectarme al contenedor de antes
76+ docker exec -ti web2 /bin/bash
77+ # Hago ping al nuevo contenedor por IP
78+ ping 172.18.0.3
79+ # Hago ping a través del nombre del contenedor
80+ ping web-apache2
81+ # cURL al contenedor
82+ curl http://web-apache2
83+ # Salimos del terminal asociado al contenedor
8684exit
8785
88- # En las redes definidas por el usuario los contenedores no solo pueden comunicarse a través de su IP
89- # sino que también pueden hacerlo a través del nombre del contenedor
86+ # ¿Y si queremos que un contenedor esté en dos redes?
87+ docker network connect bridge web2
9088
91- # Un contenedor con dos endpoints
92- # Para conectar un contenedor a una segunda, tercera, etc red necesitas hacerlo a posteriori.
93- # Es decir que solo puedes conectar un contenedor a una sola red en el momento de su creación con docker run
94- docker network create network-b
95- docker container run -dit --name container-c --network network-b alpine ash
96- docker network connect network-b container-b
89+ # Inspeccionamos la red bridge para ver si está web2
90+ docker network inspect bridge
9791
98- # Revisa los contenedores que tienes
99- docker ps
92+ # Vuelvo a conectarme al contenedor
93+ docker exec -ti web2 /bin/bash
94+ # Compruebo las interfaces de red
95+ ifconfig
96+ # Intento hacer ping a uno de los contenedores de la red bridge
97+ ping 172.17.0.2
98+ # Intento hacer ping a uno de los contenedores de la red bridge
99+ ping 172.18.0.2
100100
101- # Inspecciona qué contenedores tienes en cada red
102- docker network inspect network-a --format ' {{json .Containers}}' | jq
103- docker network inspect network-b --format ' {{json .Containers}}' | jq
101+ # Lo que habíamos visto hasta ahora: Port Mapping
104102
105- # El contenedor a y b están en localnet y b también está en localnet-2
103+ # Vimos el ejemplo con Nginx, en el que mapeábamos un puerto del host al puerto 80, que es el que teníamos configurado como servidor web.
104+ docker run -d -p 9090:80 nginx
106105
107- # Por lo tanto, el contenedor b podrá hablar tanto con el a, al estar ambos en localnet, y con el c, al estar ambos en localnet-2
108- docker attach container-b
109- ping -c 2 container-a
110- ping -c 2 container-c
106+ # Creo una imagen súper sencilla que usa como base la de nginx
107+ docker build -t nginx-custom .
111108
112- # Sin embargo, el A no podrá hablar con el C
113- docker attach container-a
114- ping -c 2 container-c
115- # Solo con el b
116- ping -c 2 container-b
109+ # Inspecciono la imagen
110+ docker inspect nginx-custom
117111
112+ # Podemos aprovecharnos de la información de EXPOSE para publicar todos los puertos que utiliza el contenedor
113+ docker run -d --publish-all nginx-custom
114+ # O bien
115+ docker run -d -P nginx-custom
118116
117+ # En docker ps se ven todos los puertos asociado
118+ docker ps
119+
120+ # O más claro
121+ docker port 1fc1f692cf14
119122
120- # Por otro lado, si conectamos al container-b a la red bridge también
121- docker network connect bridge container-b
122- # E intentamos hacer un ping al contenedor alpine2 no podremos hacerlo a través de su nombre
123- docker attach container-b
124- ping container-1
125- # Tendremos que usar su IP
126- ping -c 3 172.17.0.3
127- exit
128123
129124# Red de tipo host
130- # Para este escenario necesito conectarme a un host Linux
131- ssh gis@137.135.216.143
132- # El objetivo es poder crear un contenedor con la imagen de nginx dentro de esta red
133- # y comunicarme con él a través del puerto 80 de host directamente, sin mapeos.
134- sudo docker run --rm -d --network host --name my_nginx nginx
135- sudo docker ps
136- sudo netstat -tulpn | grep :80
137- curl 137.135.216.143
138- # Si paras el contenedor se eliminará automáticamente
139- sudo docker container stop my_nginx
125+ docker run -d --name web-apache3 --network host httpd
126+ # Inspeccionamos la misma para ver si el contenedor está asociado a ella
127+ docker network inspect host
140128
141129# Deshabilitar completamente la red de un contenedor
142- docker run --rm - dit --network none --name no-net-alpine alpine ash
130+ docker run -dit --network none --name no-net-alpine alpine ash
143131# Ahora comprueba que efectivamente no tienes eth0 creado, solo loopback
144132docker exec no-net-alpine ip link show
145- # Si paras el contenedor este será eliminado automáticamente, debido al flag --rm
146- docker stop no-net-alpine
133+
134+ # Eliminar una red
135+ docker network rm lemoncode-net
147136
148137# Eliminar todos las redes que están en desuso en un host
149138docker network prune
0 commit comments