外观
端口冲突
适用范围
- 容器启动失败,报
Bind for 0.0.0.0:8080 failed: port is already allocated或address already in use。 - 容器起来了,但访问那个端口,打开的是别的服务。
- 装了某个容器(反向代理、网络工具等)之后,OMV 的 Web 界面打不开了。
开始排查前
一个 IP 上的一个端口(再加上协议,TCP 或 UDP),同一时刻只能被一个程序监听。Compose 里 ports: 的写法是「主机端口:容器端口」,冲突只发生在冒号左边的主机端口上,右边是容器内部的端口,各容器之间互不影响。
OMV 自己也占着一批端口,容器不能再用:Web 界面默认 80(启用 HTTPS 时还有 443),SMB 的 445,另外还有 SSH 的 22 等,以你的设置为准。
修改端口的影响
影响范围:改容器的主机端口,会重建这个容器,应用短暂中断,书签、反向代理、手机 App 和其他容器里引用旧端口的地方都要同步修改。改 OMV 自己的 Web 端口,则之后只能用新端口访问界面。
前置条件:先确认新端口没有被占用,并记下改动之前的端口。
回退办法:把端口改回原来的值,重新点上线。
排查步骤
1. 确认谁占了端口
sh
# 在 OMV 的 shell 里执行(只读);<端口> 换成冲突的端口,例如 8080
ss -tulpn | grep ':<端口> 'ss -tulpn 列出所有监听的 TCP 和 UDP 端口,以及占用它的进程。看最后一列的进程名:
docker-proxy:是另一个容器映射的端口。用docker ps看PORTS一列,找出是哪个容器。nginx:OMV 自己的 Web 界面。- 其他进程(
smbd、sshd等):主机上的服务。 - 没有任何输出,但 Docker 仍然报冲突:看
docker ps -a,是不是有别的栈在重启循环,反复占用这个端口。
注意,使用 network_mode: host 的容器会直接占用主机端口,它不会出现在 ports: 里,也不会出现在下面的端口页里,只能用 ss 找到。
2. 用 Compose 的端口页汇总
在 服务 → Compose → 端口(Services → Compose → Ports)页面,列出所有 compose 文件映射的主机端口(文件、服务、主机端口、容器端口、协议),可以按列排序,重复的一眼就能看出。工具栏的建议空闲端口(Suggest free ports)可以从你指定的起始端口(默认 1024)起,找出接下来的 20 个空闲端口。
这个页面只看 compose 文件,不看系统里实际在监听什么
「建议空闲端口」只检查 Compose 文件里已经写出来的端口,不会检查系统上其他服务或手工运行的程序占用的端口。采用建议的端口之前,用上面的 ss -tulpn 再核对一次。
3. OMV 自己占着 80 和 443
反向代理、Pi-hole 的 Web 界面之类的容器,常常想用 80 或 443,而它们正好是 OMV Web 界面的端口。有两种办法:
- 推荐:让容器改用别的主机端口,例如
8080:80。前面需要 80 和 443 的入口,用反向代理,见反向代理与 HTTPS。 - 把 OMV 自己的 Web 界面改到别的端口:在
系统 → 工作台 → 设置(System → Workbench → Settings)里修改端口,点应用。之后要用新端口访问界面,见Web 界面安全:HTTPS、端口与自动注销。
如果已经是「容器抢走了 80,OMV 的 nginx 起不来,界面打不开」,先让容器让出端口,再重启 nginx,见Web 界面打不开的第 4 节。不要为了让容器用上 80,去停 OMV 的 nginx。
4. 修改容器的主机端口
在 compose 文件里,把冒号左边的数字改掉:
yaml
ports:
- "8081:80" # 左边是主机端口,右边是容器内部的端口保存之后点上线,容器会按新端口重建。较新的 Compose 插件还支持自动分配空闲端口的占位符,写法见写好 compose 文件:卷、端口、环境变量与网络。
5. TCP 和 UDP 要分开看
冲突按「协议加端口」计算。DNS(53)这类服务同时用 TCP 和 UDP,只映射了其中一个的话,另一个协议可能仍被主机上的服务占着。ss -tulpn 同时显示两种协议,注意核对。
确认恢复
- 容器正常上线,状态是「上线」。
ss -tulpn里,这个端口由预期的进程监听。- 用新的地址访问应用正常,OMV 的 Web 界面也仍然能访问。
- 重启 NAS 一次,确认没有冲突复发,见重启后容器没起来。
仍未解决
附上:报错原文、ss -tulpn 的输出、docker ps 的输出,以及 compose 文件里 ports: 的部分。读如何有效求助。
参考资料
- omv-extras wiki:Docker in OMV、Utilities, Maintenance and Backup,都提到 OMV 与 Docker 抢 80 端口的问题,并强调容器应当使用没有被占用的端口
- 本站:写好 compose 文件:卷、端口、环境变量与网络、容器启动失败