1
1
# Parte 5: Networking #
2
2
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
-
24
3
# Listar las redes disponibles en este host
25
4
docker network ls
26
5
# 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
31
10
# 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
32
11
docker network inspect bridge # En el apartado Containers es donde verás todos los contenedores que están conectados a esta red.
33
12
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
35
15
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
39
18
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
45
21
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
48
23
docker ps
49
24
50
25
# Inspeccionar la configuración de una red
51
26
docker network inspect bridge --format ' {{json .Containers}}' | jq
52
27
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
63
30
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
64
41
65
42
# Crear una nueva red
66
- docker network create network-a
43
+ docker network create lemoncode-net
67
44
68
45
# Por defecto la crea de tipo bridge en Linux (y tipo NAT en Windows)
69
46
docker network ls
70
47
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
73
51
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
76
53
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
79
56
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
82
68
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
86
84
exit
87
85
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
90
88
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
97
91
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
100
100
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
104
102
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
106
105
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 .
111
108
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
117
111
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
118
116
117
+ # En docker ps se ven todos los puertos asociado
118
+ docker ps
119
+
120
+ # O más claro
121
+ docker port 1fc1f692cf14
119
122
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
128
123
129
124
# 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
140
128
141
129
# 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
143
131
# Ahora comprueba que efectivamente no tienes eth0 creado, solo loopback
144
132
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
147
136
148
137
# Eliminar todos las redes que están en desuso en un host
149
138
docker network prune
0 commit comments