【Docker容器】Error response from daemon: driver failed programming external connectivity on endpoint

一、报错信息

(base) [root@devserver-com ~]# docker start sc_vllm
Error response from daemon: driver failed programming external connectivity on endpoint sc_vllm (b572a6a69dfac9570eff8acd8df401f11e6b0116ed51a7c062e019621fb7c0f7): Error starting userland proxy: listen tcp4 0.0.0.0:8001: bind: address already in use
Error: failed to start containers: sc_vllm

二、分析原因

Docker 容器启动失败是因为主机的 8001 端口已被其他进程占用。以下是解决方法:


方法 1:释放 8001 端口

  1. 查找占用端口的进程

    sudo lsof -i :8001
    # 或
    sudo netstat -tulpn | grep :8001
    
    • 记录输出的 PID(进程 ID)。
  2. 终止占用进程

    sudo kill -9 <PID>
    
    • 如果关键进程占用了端口,请跳过此步骤,改用方法 2。

方法 2:修改 Docker 容器的映射端口

  1. 停止并删除旧容器(数据会保留在卷中):

    docker stop sc_vllm
    docker rm sc_vllm
    
  2. 重新运行容器并映射到新端口(例如 8002):

    docker run -d --name sc_vllm -p 8002:8001 your_image_name
    
    • 8002:8001 改为其他可用端口(如 主机端口:容器端口)。

方法 3:重启 Docker 服务(极端情况)

如果端口未被占用但 Docker 仍报错,可能是 Docker 代理异常:

sudo systemctl restart docker

验证结果

docker start sc_vllm
docker ps -a | grep sc_vllm

三、其他可能

操作

查看端口占用的程序:

(base) [root@devserver-com ~]# sudo lsof -i :8001
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    1393140 root    3u  IPv4 4580355      0t0  TCP *:vcom-tunnel (LISTEN)
sshd    1393140 root    4u  IPv6 4580357      0t0  TCP *:vcom-tunnel (LISTEN)
(base) [root@devserver-com ~]# # 或
(base) [root@devserver-com ~]# sudo netstat -tulpn | grep :8001
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      1393140/sshd: /usr/ 
tcp6       0      0 :::8001                 :::*                    LISTEN      1393140/sshd: /usr/

思考

发现是sshd占用了端口,考虑为什么sshd会使用8001端口。通常,sshd默认使用22端口,所以这里可能配置被修改过。用户可能在sshd的配置文件中将端口改为了8001,或者有其他配置导致sshd监听该端口。这时候,解决方法应该是修改sshd的配置,而不是直接杀死进程,否则可能导致无法远程连接服务器。

从排查结果来看,8001 端口被 sshd 系统进程占用,且这个进程是 SSH 服务的关键组件(/usr/sbin/sshd)。直接杀死此进程会导致 SSH 服务中断(你可能失去服务器连接),因此需要改用更安全的方案:


解决方案:修改 SSH 服务监听的端口

SSH 默认使用 22 端口,但你的配置中可能额外监听了 8001 端口。按以下步骤修复:

  1. 编辑 SSH 配置文件

    sudo vi /etc/ssh/sshd_config
    
  2. 查找 Port 配置项

    • 找到类似 Port 8001 的行(可能在文件末尾或独立配置块中)。
    • 注释掉这行(在行首添加 #):
      #Port 8001
      
    • 确保默认的 Port 22 存在且未被注释。
  3. 重启 SSH 服务

    sudo systemctl restart sshd
    
  4. 验证端口释放

    sudo netstat -tulpn | grep :8001
    
    • 如果输出为空,说明 8001 端口已释放。

重启 Docker 容器

现在可以正常启动容器:

docker start sc_vllm

备选方案:修改 Docker 端口映射

如果必须保留 SSH 对 8001 端口的占用(不推荐),可修改 Docker 容器的端口映射:

  1. 停止并删除旧容器

    docker stop sc_vllm
    docker rm sc_vllm
    
  2. 重新运行容器并映射到新端口(例如 8002):

    docker run -d --name sc_vllm -p 8002:8001 your_image_name
    

关键注意事项

  • 不要强制终止 sshd 进程:这会导致当前 SSH 连接中断,且可能导致服务器无法远程登录。
  • 修改 SSH 配置后,确保你仍有其他方式访问服务器(例如通过控制台),以防配置错误导致 SSH 服务不可用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值