33# Lo que habíamos visto hasta ahora: Port Mapping
44
55# 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 8080 :80 nginx
6+ docker run -d -p 9090 :80 nginx
77
88# Podemos aprovecharnos de la información de EXPOSE para publicar todos los puertos que
99# Utiliza el contenedor
10+ # A través de inspect puedo saber qué puertos utilizará esta imagen
11+ docker inspect hello-world
1012docker run -d --name hello-world-with-a-lot-of-ports --publish-all hello-world:latest
1113# o bien
1214docker run -d --name hello-world-with-a-lot-of-ports -P hello-world:latest
@@ -23,42 +25,125 @@ exit
2325docker network ls
2426# Por defecto, ya hay una red creada en un host de Docker (En Linux se llama bridge y el Docker se llama nat)
2527
28+ # Usando el bridge por defecto#
29+ # Esta red no es la mejor opción para entornos productivos
30+
2631# 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+ docker network inspect bridge # En el apartado Containers es donde verás todos los contenedores que están conectados a esta red.
33+
2734docker network inspect bridge --format ' {{json .Containers}}' | jq
2835
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
39+
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
45+
46+ # Elimina el anterior para que quede más limpia la salida
47+ docker rm -f hello-world-with-a-lot-of-ports
48+ docker ps
49+
2950# Inspeccionar la configuración de una red
30- docker network inspect bridge
51+ docker network inspect bridge --format ' {{json .Containers}}' | jq
52+
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
63+
3164
3265# Crear una nueva red
33- docker network create localnet
66+ docker network create network-a
3467
3568# Por defecto la crea de tipo bridge en Linux (y tipo NAT en Windows)
3669docker network ls
3770
3871# Ahora crea un contenedor que esté asociado a tu nueva red
39- docker container run -d --name container-a \
40- --network localnet \
41- alpine sleep 1d
42-
72+ docker container run -dit --name container-a --network network-a alpine ash
4373
4474# Con el siguiente comando puedes saber qué contenedores están asociados a una red
45- docker network inspect localnet --format ' {{json .Containers}}' | jq
75+ docker network inspect network-a --format ' {{json .Containers}}' | jq
4676
4777# Ahora vamos a añadir un segundo contenedor a nuestra nueva red
48- docker container run -d --name container-b \
49- --network localnet \
50- alpine sleep 1d
78+ docker container run -dit --name container-b --network network-a alpine ash
5179
5280# Ahora tienes dos contenedores dentro de la misma red:
53- docker network inspect localnet --format ' {{json .Containers}}' | jq
54-
81+ docker network inspect network-a --format ' {{json .Containers}}' | jq
5582
5683# Atacha el terminal a container-b y haz un ping al container-a utilizando su nombre
57- docker exec -it container-b sh
58- ping container-a
84+ docker attach container-b
85+ ping -c 3 container-a
5986exit
6087
61- # TODO: Un contenedor con dos endpoints!!!!
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
90+
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
97+
98+ # Revisa los contenedores que tienes
99+ docker ps
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
104+
105+ # El contenedor a y b están en localnet y b también está en localnet-2
106+
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
111+
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
117+
118+
119+
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+
129+ # 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
140+
141+ # Deshabilitar completamente la red de un contenedor
142+ docker run --rm -dit --network none --name no-net-alpine alpine ash
143+ # Ahora comprueba que efectivamente no tienes eth0 creado, solo loopback
144+ 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
62147
63148# Eliminar todos las redes que están en desuso en un host
64149docker network prune
0 commit comments