Skip to content

Commit dc6df1a

Browse files
committed
revisado modulo IV
1 parent 020fa3e commit dc6df1a

2 files changed

Lines changed: 102 additions & 16 deletions

File tree

01-contenedores/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,5 @@
7272
- Crear un contenedor asociado a una red específica
7373
- Descubrimiento de servicios y comunicación entre contenedores de la misma red
7474
- Un contenedor con dos endpoints
75+
- Deshabilitar la red para un contenedor
7576
- Crear una red de tipo overlay

01-contenedores/contenedores-iv/contenedores-iv.sh

Lines changed: 101 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
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
1012
docker run -d --name hello-world-with-a-lot-of-ports --publish-all hello-world:latest
1113
#o bien
1214
docker run -d --name hello-world-with-a-lot-of-ports -P hello-world:latest
@@ -23,42 +25,125 @@ exit
2325
docker 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+
2734
docker 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)
3669
docker 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
5986
exit
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
64149
docker network prune

0 commit comments

Comments
 (0)