Hace algún tiempo, cuando usaba Docker para desarrollo e implementación, encontré un conflicto de puerto. Cuando iniciamos un contenedor Docker, en ocasiones aparece el siguiente mensaje de error:
docker: Error response from daemon: driver failed programming external connectivity on endpoint container-name (hash):
Error starting userland proxy: Bind for 0.0.0.0:port failed: port is already allocated.
Aquí presentaré cómo resolver este problema.
análisis del problema
Este mensaje de error indica que ya hay un puerto en uso. Al iniciar un contenedor, Docker intentará asignar el puerto del contenedor al host, de modo que se pueda acceder a la aplicación en el contenedor a través de la dirección IP y el puerto del host. Sin embargo, si otro proceso en el host ya ocupa el mismo puerto, Docker no podrá vincularse a ese puerto, lo que generará un error.
Solución
Paso 1: busque el proceso que está utilizando el puerto
Primero necesitamos averiguar qué proceso está ocupando el puerto al que deseamos vincularnos. Puede utilizar el siguiente comando para encontrar el ID del proceso correspondiente al puerto deseado:
sudo lsof -i :port
Entre ellos, port
se encuentra el puerto donde se informó el error cuando intentó iniciar el contenedor Docker.
Paso 2: acabar con el proceso de acaparamiento
Utilizando el ID de proceso que se encuentra en el paso 1, se puede utilizar el siguiente comando para finalizar el proceso que ocupa el puerto:
sudo kill -9 <PID>
Tenga en cuenta que <PID>
es el ID del proceso que se encuentra en el paso 1.
Paso 3: reinicie el contenedor Docker
Una vez que se finaliza el proceso que utiliza el puerto, se puede reiniciar el contenedor Docker. La ejecución del comando para iniciar el contenedor debería ejecutarse normalmente sin encontrar errores de conflicto de puerto.
Código de muestra
A continuación se muestra un ejemplo de comando de inicio de Docker y un comando de shell para verificar y eliminar procesos que ocupan puertos:
# 启动容器
docker run -d -p host_port:container_port image_name
# 检查占用端口的进程
sudo lsof -i :port
# 杀死占用进程
sudo kill -9 <PID>
donde host_port
está el puerto en el host, container_port
es el puerto en el contenedor y image_name
es el nombre de la imagen de Docker para comenzar.