使用docker时报Respuesta de error del demonio: el controlador falló al programar la conectividad externa en el punto final

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, portse 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.

Supongo que te gusta

Origin blog.csdn.net/liuqingup/article/details/131726371
Recomendado
Clasificación