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