Clase 7: Redes en Docker
Cuando instalamos docker tenemos las siguientes redes predefinidas:
$ docker network list
NETWORK ID NAME DRIVER SCOPE
fe965af60795 bridge bridge local
eb1b46382ff0 host host local
fe713d203f5b none null local
- Por defecto los contenedores que creamos se conectan a la red de tipo bridge llamada
bridge(por defecto el direccionamiento de esta red es 172.17.0.0/16, y ofrece un servidor DHCP y DNS y el host realiza routing/NAT). Los contenedores conectados a esta red que quieren exponer algún puerto al exterior tienen que usar la opción-ppara mapear puertos. Este tipo de red nos van a permitir:- Aislar los distintos contenedores que tengo en distintas subredes docker, de tal manera que desde cada una de las subredes solo podremos acceder a los equipos de esa misma subred.
- Aislar los contenedores del acceso exterior.
- Publicar servicios que tengamos en los contenedores mediante redirecciones que docker implementará con las pertinentes reglas de iptables.
- Si conecto un contenedor a la red host, el contenedor ofrece el servicio que tiene configurado en el puerto de la red del anfitrión. No tiene ip propia, sino es cómo si tuviera la ip del anfitrión. Por lo tanto, los puertos son accesibles directamente desde el host.
- La red none no configurará ninguna IP para el contenedor y no tiene acceso a la red externa ni a otros contenedores. Tiene la dirección loopback y se puede usar para ejecutar trabajos por lotes.
La red bridge por defecto
Los contenedores, por defecto se conectan a una red de tipo NAT que tiene las siguientes características:
- El puente que se crea en el host se llama
docker0. - El direccionamiento es 172.17.0.0/16.
- El host está conectado a la red con la dirección 172.17.0.1.
- El host hace de servidor DHCP y de router/NAT, por lo tanto los contenedores tienen acceso a internet.
- El host hace de servidor DNS para nombres externos.
Redes definidas por el usuario
Para implantaciones en producción no se usa la red bridge por defecto. Vamos a definir una nueva red de tipo bridge para conectar los contenedores de una determinada aplicación web. Esto lo hacemos por dos razones fundamentales:
- Las redes que nosotros definamos proporcionan resolución DNS entre los contenedores.
- Al usar redes definidas por el usuario obtengo más aislamiento y control, ya que los contenedores necesarios de una aplicación no comparten la red con otros contenedores.
Para gestionar las redes creadas por el usuario:
- docker network ls: Listado de las redes.
- docker network create: Creación de redes. Ejemplos:
docker network create red1docker network create -d bridge --subnet 172.24.0.0/16 --gateway 172.24.0.1 red2
- docker network rm/prune: Borrar redes. Teniendo en cuenta que no puedo borrar una red que tenga contenedores que la estén usando. deberé primero borrar los contenedores o desconectar la red.
- docker network inspect: Nos da información de la red.
Uso de las redes bridge definidas por el usuario
Vamos a crear una red tipo bridge definida por el usuario con la instrucción docker network create:
$ docker network create red1
Vamos a crear dos contenedores conectados a dicha red:
$ docker run -d --name my-apache-app --network red1 -p 8080:80 httpd:2.4
Lo primero que vamos a comprobar es la resolución DNS:
$ docker run -it --name contenedor1 --network red1 debian bash
root@98ab5a0c2f0c:/# apt update && apt install dnsutils -y
...
root@98ab5a0c2f0c:/# dig my-apache-app
...
;; ANSWER SECTION:
my-apache-app. 600 IN A 172.18.0.2
...
;; SERVER: 127.0.0.11#53(127.0.0.11)
...