Docker Compose检查端口与网络解析
Docker Compose 排查端口和网络时,最容易把两个入口混为一谈:宿主机通过映射后的端口访问服务,容器之间则通过 Compose 服务名和容器端口通信。下面用一个 web 服务和一个 db 服务,把“端口有没有发布”和“服务名能不能解析”拆开检查。
官方地址:https://docs.docker.com/compose/
建议先记住这个例子:8080:80 表示宿主机的 8080 转到容器的 80;8001:5432 表示宿主机的 8001 转到容器的 5432。容器内的 web 访问数据库时,应使用 db:5432,而不是 localhost:8001。
先准备一个能观察的 Compose 项目
在项目目录创建 compose.yaml。这里不把它当作生产配置,而是专门用来观察端口映射和默认网络中的服务发现。
services:
web:
image: nginx:alpine
ports:
- "8080:80" # 宿主机访问 8080,容器内服务监听 80
networks:
- app-net
db:
image: postgres:latest
ports:
- "8001:5432" # 宿主机访问 8001,容器内数据库端口是 5432
networks:
- app-net
networks:
app-net:
driver: bridge # 让 web 和 db 进入同一个 Compose 网络
在项目目录的命令入口执行:
# 启动 compose.yaml 中声明的服务,并在后台运行 docker compose up -d
可见状态应是两个服务都处于运行中。若某个服务没有启动,先看服务状态,不要直接把问题归因于 DNS 或端口。
从状态表确认宿主机端口
在项目目录打开“Compose 项目 → 服务状态”入口,先执行 docker compose ps。它会列出服务、当前状态和公开端口;端口列出现 0.0.0.0:8080->80/tcp 时,左侧是宿主机端口,右侧是容器端口。
# 只查看当前项目的运行状态和端口映射 docker compose ps # 包括已经停止的容器,排查服务是否启动后又退出 docker compose ps --all

这一步的确认点有三个:web 和 db 是否为运行状态;端口映射是否与 compose.yaml 一致;协议是否为预期的 tcp。宿主机访问数据库时使用 localhost:8001,不要把容器端口 5432 直接当成宿主机端口。
用 compose port 精确查询单个映射
如果状态表信息较多,可以在“服务状态 → 端口查询”入口单独查询某个服务的容器端口。命令格式是 docker compose port SERVICE PRIVATE_PORT:
# 查询 web 服务容器 80 端口对应的公开端口 docker compose port web 80 # 查询 db 服务容器 5432 端口对应的公开端口 docker compose port db 5432 # 多副本服务可指定容器序号;默认协议是 tcp docker compose port --index 1 db 5432
如果这里查不到映射,通常不是网络解析问题,而是服务没有运行、端口没有写入 ports,或者查询的容器端口与服务实际监听端口不一致。只有对外访问需要 ports;同一 Compose 网络里的服务互访,不需要为了“能解析”而额外发布宿主机端口。
从容器内部检查服务名解析
在“服务状态 → web → 网络诊断”入口执行容器内检查。Compose 默认会创建项目网络,并把服务名注册到内部 DNS;因此检查重点应该从 web 容器内部发起。
# -T 关闭伪终端,便于把命令用于脚本或自动化检查 docker compose exec -T web getent hosts db # 用服务名和容器端口检查 web 到 db 的 TCP 连接 docker compose exec -T web sh -c 'nc -zv db 5432'
当第一条命令能解析出 db 的容器地址,说明服务名解析已建立;第二条命令能连通时,才说明网络路径和数据库监听端口也基本匹配。这里的地址应写成 db:5432。localhost 在 web 容器里指向的是 web 自己,不是宿主机,也不是 db。

按网络边界定位连接失败
把失败点放回访问边界,排查会更快:
| 访问场景 | 应使用的地址 | 优先检查 |
|---|---|---|
| 浏览器或宿主机访问 web | localhost:8080 | ports、docker compose ps |
| 宿主机工具访问 db | localhost:8001 | 宿主机端口是否被占用、映射是否存在 |
| web 容器访问 db | db:5432 | 服务名、共同网络、容器端口 |
如果两个服务没有加入同一个自定义网络,先检查服务级 networks 是否都包含 app-net。如果配置了 network_mode: host,容器会共享宿主机网络栈,端口映射和服务名 DNS 的判断方式都会改变,不要继续套用默认 bridge 网络的结论。
# 查看 Compose 最终识别到的服务,排除文件路径或服务名写错 docker compose config --services # 完成排查后停止并移除本次示例创建的服务 docker compose down
常见问题
为什么 ps 显示 Up,但宿主机访问不了?
先看 ports 是否存在,再用 docker compose port 查询容器端口。只有 expose 或仅在容器内监听,并不会自动创建宿主机入口。
为什么容器内不能连接 localhost:8001?
因为容器内的 localhost 指向当前容器。跨服务连接应使用 Compose 服务名和容器端口,也就是本例的 db:5432。
为什么重建容器后旧 IP 失效?
Compose 网络中的容器 IP 可以随重建变化,服务名保持稳定。应用配置应保存服务名,不要把临时容器 IP 写死。
最后可以把排查顺序固定为:先用 docker compose ps 看服务是否运行,再用 docker compose port 看宿主机映射,最后进入调用方容器检查服务名解析。这样能把端口发布、容器端口和网络 DNS 三个问题分开,定位会比反复修改端口号更快。
Docker Compose init怎样回收容器里的子进程
- 上一篇
- Docker Compose init怎样回收容器里的子进程
- 下一篇
- Transformers pipeline快速完成文本分类
-
- 文章 · 软件教程 | 33分钟前 |
- Docker Compose init怎样回收容器里的子进程
- 228浏览 收藏
-
- 文章 · 软件教程 | 36分钟前 |
- Docker Compose events怎样实时查看服务状态变化
- 159浏览 收藏
-
- 文章 · 软件教程 | 40分钟前 | 私有仓库 · ssh · docker 私有仓库 BuildKit Docker Buildx SSH挂载
- Docker BuildKit用SSH挂载私有仓库
- 429浏览 收藏
-
- 文章 · 软件教程 | 40分钟前 |
- Docker Compose up只重建指定服务
- 172浏览 收藏
-
- 文章 · 软件教程 | 43分钟前 | docker · build Docker Compose no-cache 重建镜像
- Docker Compose build关闭缓存重建镜像
- 486浏览 收藏
-
- 文章 · 软件教程 | 47分钟前 |
- Docker Compose config查看变量展开结果
- 216浏览 收藏
-
- 文章 · 软件教程 | 48分钟前 | docker · 容器存储 临时目录 Docker Compose tmpfs Compose服务
- Docker Compose怎样用tmpfs挂载临时目录
- 320浏览 收藏
-
- 文章 · 软件教程 | 51分钟前 | docker · Redis · redis 持久化 Docker Compose 命名卷
- Docker Compose用命名卷持久化Redis
- 351浏览 收藏
-
- 文章 · 软件教程 | 51分钟前 |
- Docker Compose怎样用日志轮转避免容器日志占满磁盘
- 221浏览 收藏
-
- 文章 · 软件教程 | 54分钟前 |
- Docker构建阶段使用secret mount
- 222浏览 收藏
-
- 文章 · 软件教程 | 56分钟前 |
- Docker Compose怎样让服务使用host网络模式
- 497浏览 收藏
-
- 文章 · 软件教程 | 1小时前 |
- GitHub Desktop怎样为提交创建并推送标签
- 364浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1036次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1034次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1178次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1139次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 981次使用
-
- VS Code Markdown 预览怎样同步定位当前标题
- 2026-11-04 501浏览
-
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 2026-07-09 501浏览
-
- Windows 11 如何开启 HEIF 图片支持
- 2026-05-31 501浏览
-
- TikTok用户画像与付费订阅变现方法
- 2026-05-27 501浏览
-
- 学信网学历翻译件申请方法
- 2026-05-27 501浏览
