一、报错信息
(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 端口
-
查找占用端口的进程:
sudo lsof -i :8001 # 或 sudo netstat -tulpn | grep :8001
- 记录输出的 PID(进程 ID)。
-
终止占用进程:
sudo kill -9 <PID>
- 如果关键进程占用了端口,请跳过此步骤,改用方法 2。
方法 2:修改 Docker 容器的映射端口
-
停止并删除旧容器(数据会保留在卷中):
docker stop sc_vllm docker rm sc_vllm
-
重新运行容器并映射到新端口(例如 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 端口。按以下步骤修复:
-
编辑 SSH 配置文件:
sudo vi /etc/ssh/sshd_config
-
查找
Port
配置项:- 找到类似
Port 8001
的行(可能在文件末尾或独立配置块中)。 - 注释掉这行(在行首添加
#
):#Port 8001
- 确保默认的
Port 22
存在且未被注释。
- 找到类似
-
重启 SSH 服务:
sudo systemctl restart sshd
-
验证端口释放:
sudo netstat -tulpn | grep :8001
- 如果输出为空,说明 8001 端口已释放。
重启 Docker 容器
现在可以正常启动容器:
docker start sc_vllm
备选方案:修改 Docker 端口映射
如果必须保留 SSH 对 8001 端口的占用(不推荐),可修改 Docker 容器的端口映射:
-
停止并删除旧容器:
docker stop sc_vllm docker rm sc_vllm
-
重新运行容器并映射到新端口(例如 8002):
docker run -d --name sc_vllm -p 8002:8001 your_image_name
关键注意事项
- 不要强制终止
sshd
进程:这会导致当前 SSH 连接中断,且可能导致服务器无法远程登录。 - 修改 SSH 配置后,确保你仍有其他方式访问服务器(例如通过控制台),以防配置错误导致 SSH 服务不可用。