docker / Guías

Docker port already allocated: resolver un puerto ocupado

Un puerto publicado utiliza una dirección y un puerto del host Docker. Otro contenedor o programa puede estar escuchando allí. Cambiar el puerto del host mantiene el puerto interno del contenedor.

Los ejemplos usan Bash; consulta las referencias para los detalles de tu entorno.

Identifica el servicio antes de detenerlo

Lista los contenedores activos y sus puertos publicados. Busca el lado del host en un mapeo como 8080->80/tcp. En Linux, ss -ltnp también lista escuchas TCP; algunos detalles requieren privilegios adecuados.

docker ps --format 'table {{.Names}}\t{{.Ports}}'

Una lista vacía de contenedores no demuestra que el puerto esté libre: puede ocuparlo un programa del host. Revisa también la dirección y el protocolo. Identifica el servicio y su función antes de detenerlo.

Elige un puerto del host disponible

Para este ejemplo web temporal, comprueba que el puerto host 8081 esté libre y el nombre devsheet-web no se use. El ejemplo utiliza la dirección de loopback del host e inicia nginx en primer plano.

docker run --rm --name devsheet-web -p 127.0.0.1:8081:80 nginx

El mapeo es HOST_IP:HOST_PORT:CONTAINER_PORT. Solo cambia el puerto del host a 8081; nginx sigue en el puerto interno 80. Prueba desde otra terminal. Ctrl+C detiene el ejemplo y --rm elimina su contenedor.

Actualiza el mapeo en Compose

En tu archivo Compose, cambia la entrada ports del servicio previsto a 127.0.0.1:8081:80, después de comprobar el puerto. Recrea ese servicio para aplicar el cambio; sustituye web por su nombre real.

docker compose ps
docker compose up -d web

Un simple reinicio no aplica un mapeo modificado. Revisa el proyecto Compose antes de recrear el servicio y conserva sus montajes y datos. Detener contenedores ajenos puede interrumpir otros servicios.

Comprueba el servicio publicado

Revisa el mapeo activo y envía una petición HTTP al puerto host elegido. El ejemplo nginx debería responder; otras aplicaciones pueden tardar en arrancar.

docker ps --format 'table {{.Names}}\t{{.Ports}}'
curl --head http://127.0.0.1:8081/

Si el conflicto persiste, revisa dirección, puerto y protocolo, incluidas las escuchas IPv4 e IPv6. Un error HTTP después de conectar es distinto de un fallo de enlace del puerto. Consulta logs y configuración del servicio afectado.

Referencias

Todas las guías