Saltar al contenido
Curso Docker y Laravel Sail desde cero
06/10 Dockerizar una aplicación PHP a mano Redes y puertos en Docker Compose, y los comandos del día a día
Tu lectura Quedan 11 min
Lección 6 de 10 · Dockerizar una aplicación PHP a mano

Redes y puertos en Docker Compose, y los comandos del día a día

11 min de lectura Docker Engine 29.8

Hola, bienvenido. Docker Compose crea una red para cada proyecto y registra cada servicio con su nombre en un DNS interno, así que desde un contenedor llegas a otro con el nombre del servicio, como mysql, sin saber su IP. Los puertos solo hacen falta para entrar desde tu máquina: con ports publicas uno, y sin él el servicio solo es accesible desde dentro de la red.

En esta lección vamos a ver esa red por dentro, a publicar el puerto de MySQL para conectarte con tu cliente de base de datos, y a repasar los comandos que vas a usar cada día con Compose, incluido cómo limpiar lo que Docker va acumulando. Es la última lección de la primera sección, y al terminarla tendrás todas las piezas que vamos a buscar en Laravel Sail.

La red del proyecto y el DNS por nombre de servicio

Cuando lanzamos docker compose up -d por primera vez, Compose creó una red llamada tasks_default, con el nombre del proyecto delante. Puedes verla con:

Terminal
docker network ls
Salida
NETWORK ID NAME DRIVER SCOPE 99440623f369 bridge bridge local 7742dc5fc1a1 host host local 7a2b7cafbfa4 none null local f917b2c3cddf tasks_default bridge local

Las 3 primeras las crea Docker al instalarse, y en tu máquina puede haber más si tienes otros proyectos. Todos los servicios de tasks están conectados a tasks_default, y cada uno se registra con su nombre en el DNS interno de Docker. Lo comprobamos preguntando desde el contenedor de app por el nombre mysql:

Terminal
docker compose exec app getent hosts mysql
Salida
172.19.0.2 mysql mysql

Por eso funciona DB_HOST: mysql: PDO pregunta por mysql, el DNS de Docker responde con la IP del contenedor y la conexión llega. Y por eso funciona fastcgi_pass app:9000 en Nginx. La IP que veas en tu máquina será otra, y además cambia cada vez que se recrea el contenedor. La propia documentación de Compose lo recomienda: usa siempre el nombre del servicio, nunca la IP.

Esto también explica el Connection refused que vimos en la lección de Compose. Sin DB_HOST, la aplicación intentaba conectar con 127.0.0.1, y dentro de un contenedor 127.0.0.1 y localhost son el propio contenedor. En el de app solo está PHP-FPM, así que nadie respondía en el 3306.

Hay un caso concreto en el que el DNS nos puede jugar una mala pasada. Nginx resuelve el nombre app al arrancar y se queda con esa IP. Si recreas el contenedor de app y le toca otra IP mientras web sigue en marcha, Nginx responde con un 502 Bad Gateway, porque sigue llamando a la IP antigua. La solución es reiniciar web, como veremos en los comandos del día a día.

Lo que queda de esta lección
  1. 02Publicar puertos: ports y expose
  2. 03Los comandos del día a día
  3. 04Qué ocupa Docker y cómo limpiarlo
Sigue leyendo gratis Este curso es gratuito. Déjanos tu email y te enviamos un enlace para leerlo entero, junto con el resto de cursos gratuitos.

¿Ya lo habías pedido o entras desde otro dispositivo? Escribe el mismo email: recuperas tu acceso y tu avance.