Skip to content

Commit 2ac52fc

Browse files
committed
revisado el contenido del modulo de networking
1 parent 7e7ebbe commit 2ac52fc

File tree

1 file changed

+87
-98
lines changed

1 file changed

+87
-98
lines changed

01-contenedores/contenedores-v/contenedores-v.sh

Lines changed: 87 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,5 @@
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
254
docker 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
3211
docker 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
4823
docker ps
4924

5025
#Inspeccionar la configuración de una red
5126
docker 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)
6946
docker 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
8684
exit
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
144132
docker 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
149138
docker network prune

0 commit comments

Comments
 (0)