Red en docker

El otro día me propuse hacer un tutorial rápido sobre docker, pero me quedó un poco coja la parte de red, así que hoy voy a intentar avanzar un poco más, porque docker es un tema realmente fascinante, así que si me prestáis un rato de vuestro preciado tiempo intentaremos avanzar un poquito más por el camino de docker.

El otro día empezamos a hablar un poco de red en docker y os comenté como enlazar un puerto externo a uno interno con -p puerto_externo:puerto_de_docker pero claro, eso está bien si ejecutamos un sólo contenedor, pero ¿qué ocurre si estamos ejecutando varios?, llevar el control de los puertos puede ser complejo así que tenemos la opción de la gestión dinámica de puertos.

Para ver los puertos asignados dinámicamente lo hacemos con docker port y el nombre

edu@thinkpad ~ # docker run --name nc -p 80 -p 443 -d nextcloud
edu@thinkpad ~ # docker port nc 
443/tcp -> 0.0.0.0:32768
80/tcp -> 0.0.0.0:32769

A mi personalmente me gusta fijar los puertos siempre que sea posible, pero la opción ahí está.

Y si queremos fijar un puerto, pero UDP podemos indicarlo

docker run -p 1234:1234/udp -d imagen

Imaginad un servidor de DNS dockerizado, pues ahí podríamos mostrar un puerto udp, el 53.

Ahora vamos a ir un poco más allá y vamos a conectar por red dos contenedores. Para ello tenemos la opción de conectarlos vía el host, vía el mapeo de puertos definido antes, no creo que haga falta hablar más de ello, o bien, directamente, de un contenedor a otro, pero sin usar el host.

Una opción es la del enlace directo, en la que tenemos una arquitectura cliente servidor, donde el cliente se lanza con la opción –link que lo que hace es meter en el fichero de hosts el contenedor que queramos.

edu@thinkpad ~ # docker run -ti --name servidor ubuntu bash
root@46096ba9221f:/#
edu@thinkpad ~ # docker run -ti --name cliente --link servidor ubuntu:latest bash
root@ab6b148a4b59:/# cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	servidor 46096ba9221f
172.17.0.3	ab6b148a4b59

Pero claro, lo suyo es crear una red para aquellos contenedores que se quieran ver entre sí.

La red se crea con docker network create y docker nos asignará un direccionamiento con su NAT y todo.

edu@thinkpad ~ # docker network create red_interna
3c259b15e3850f62540ed8e1ba3b6ed6610c78d8f531a3d401868fbff34f362d
edu@thinkpad ~ # docker run -ti --rm --net=red_interna --name servidor2 ubuntu bash

Hay una cosa que podemos hacer y es limitar el acceso a la red de docker vía el PAT en función de la IP que accede, por ejemplo.

docker run -p 127.0.0.1:8080:80/tcp