Docker 容器端口未发布问题快速排查文档

1. 问题现象

容器正在运行,容器内部服务也正常监听,但主机无法访问对应端口。

典型现象:

bash 复制代码
docker ps

容器 PORTS 列为空,或没有显示预期端口映射。

bash 复制代码
docker port zentao

没有任何输出。

但容器配置中可以看到端口映射:

bash 复制代码
docker inspect zentao --format '{{json .HostConfig.PortBindings}}'

例如:

json 复制代码
{"8050/tcp":[{"HostIp":"","HostPort":"8050"},{"HostIp":"","HostPort":"80"}]}

说明容器原本配置了:

text 复制代码
主机 8050 -> 容器 8050
主机 80   -> 容器 8050

2. 快速判断端口是否真正发布成功

查看运行时端口状态:

bash 复制代码
docker inspect zentao --format '{{json .NetworkSettings.Ports}}'

正常应类似:

json 复制代码
{"8050/tcp":[{"HostIp":"0.0.0.0","HostPort":"8050"},{"HostIp":"0.0.0.0","HostPort":"80"}]}

异常情况:

json 复制代码
{}

说明 Docker 当前没有实际发布端口。


3. 检查主机端口是否被占用

bash 复制代码
sudo ss -lntp | grep -E ':(80|8050)\b'

如果没有输出,说明主机 80 / 8050 没有被其他进程占用。

如果有输出,需要先停止占用端口的服务或容器。

例如停止无效容器:

bash 复制代码
docker stop vi_gitlab
docker update --restart=no vi_gitlab

4. 检查容器内部服务是否正常

进入容器:

bash 复制代码
docker exec -it zentao bash

查看监听端口:

bash 复制代码
ss -natl

正常应看到类似:

text 复制代码
LISTEN 0 511 *:8050 *:*

说明容器内部服务正常监听 8050。

如果只监听:

text 复制代码
127.0.0.1:8050

则外部可能无法访问,需要修改服务监听地址为 0.0.0.0 或 *。


5. 检查容器是否接入 Docker 网络

查看容器网络 IP:

bash 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zentao

正常应输出类似:

text 复制代码
10.1.0.3

如果没有任何输出,说明容器没有正常接入 Docker 网络。


6. 检查指定网络中是否有该容器

查看网络列表:

bash 复制代码
docker network ls

查看目标网络,例如 vinet:

bash 复制代码
docker network inspect vinet

重点看 Containers 字段中是否包含 zentao。

如果只有其他容器,例如:

text 复制代码
vi_minio -> 10.1.0.2

但没有 zentao,说明 zentao 没有接入该网络。


7. 修复:重新接入 Docker 网络

如果确认 zentao 没有接入 vinet,执行:

bash 复制代码
docker network connect vinet zentao

该操作不会重建容器,不会删除容器数据、配置、用户或数据库。

执行后检查:

bash 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zentao

正常应输出容器 IP,例如:

text 复制代码
10.1.0.3

再检查端口:

bash 复制代码
docker port zentao
docker inspect zentao --format '{{json .NetworkSettings.Ports}}'
docker ps

如果恢复正常,应看到类似:

text 复制代码
8050/tcp -> 0.0.0.0:8050
8050/tcp -> 0.0.0.0:80

8. 验证访问

主机本机测试:

bash 复制代码
curl -I http://127.0.0.1
curl -I http://127.0.0.1:8050

局域网测试:

bash 复制代码
curl -I http://192.100.40.131
curl -I http://192.100.40.131:8050

浏览器访问:

text 复制代码
http://192.100.40.131
http://192.100.40.131:8050

9. 常见根因总结

本次问题的典型链路:

text 复制代码
容器进程正常
容器内部服务正常
主机端口未被占用
HostConfig.PortBindings 有端口配置

但容器没有接入 vinet 网络
导致容器没有 IP
导致 Docker 无法建立端口发布
导致 docker ps 的 PORTS 为空
导致 docker port 没有输出

关键修复命令:

bash 复制代码
docker network connect vinet zentao

10. 防止再次发生

检查 docker-compose.yml 是否明确配置网络:

yaml 复制代码
services:
  zentao:
    container_name: zentao
    networks:
      - vinet
    ports:
      - "80:8050"
      - "8050:8050"
    restart: unless-stopped

networks:
  vinet:
    external: true

确认自启动策略:

bash 复制代码
docker inspect zentao --format '{{.HostConfig.RestartPolicy.Name}}'

建议设置:

bash 复制代码
docker update --restart=unless-stopped zentao

11. 快速排查命令合集

bash 复制代码
docker ps

docker port zentao

docker inspect zentao --format '{{json .HostConfig.PortBindings}}'

docker inspect zentao --format '{{json .NetworkSettings.Ports}}'

sudo ss -lntp | grep -E ':(80|8050)\b'

docker exec -it zentao ss -natl

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zentao

docker network inspect vinet

docker network connect vinet zentao
相关推荐
迪康coolmu1 小时前
迪康Defender网络准入控制系统落地实战:部署、配置与问题排查记录
运维·开发语言·网络·经验分享·php
Dovis(誓平步青云)1 小时前
一年1956亿行:智能电表场景下的时序数据存储实践
运维·前端·自动化·音视频·prometheus
不停喝水1 小时前
【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码
java·开发语言·前端·ai·容器
小白鸽i1 小时前
【linux】麒麟桌面版安装人大金仓V8
linux·运维
Ruiery1 小时前
Linux 6.6内核内存管理深度解析(三):页表与缺页处理 — 虚拟地址怎么按需映射到物理页
linux·运维·服务器
研发小能1 小时前
DevOps 流水线怎么选?自研、开源拼装还是企业级平台
运维·开源·devops·嘉为蓝鲸
迪康Defender2 小时前
终端安全行为分析:审计日志如何转化为业务报表?落地实践与避坑指南
运维·经验分享·安全·信息可视化·自动化·安全威胁分析·运维开发
专注API从业者2 小时前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
大盛供应链·卢生2 小时前
集成电路出口金额增长的原因有哪些
容器·新浪微博