expose是Docker Compose中声明仅容器间可达、不映射到宿主机的端口机制,专为服务内部通信设计;它仅在Docker内部网络生效,使同网容器可通过service-name:port访问,不占用主机端口,也不对外暴露。
expose 是 docker compose 中用于声明“仅容器间可达、不映射到宿主机”的端口机制。它不占用主机端口,也不对外暴露,专为服务内部通信设计(比如健康检查、指标采集、服务间调用)。
expose 的作用范围和本质
expose 只影响 Docker 内部网络(如默认 bridge 或自定义网络),让同一网络下的其他容器能通过 service-name:port 访问该端口。它不会:
- 在宿主机上监听任何端口
- 触发 iptables 规则或 NAT 转发
- 被外部 IP(包括本机 localhost)直接访问
- 替代 ports 字段的对外暴露功能
如何在 docker-compose.yml 中使用 expose
在服务定义下添加 expose 字段,列出容器内实际监听的端口号(字符串形式):
services:
api:
image: my-api:latest
expose:
- "8080" # HTTP 接口,供其他容器调用
- "9090" # Prometheus 指标端点
- "8081" # 健康检查端点(/actuator/health)
注意:expose 的端口号必须与应用实际 bind 的端口一致(例如 Spring Boot 的 server.port=8080),否则其他容器连接会失败。
expose 和 ports 的关键区别
两者用途完全不同,不能混用或互换:
| 配置项 | 作用范围 | 是否占用宿主机端口 | 能否被宿主机 localhost 访问 | 典型用途 |
|---|---|---|---|---|
expose |
仅限同一 Docker 网络内的容器 | 否 | 否 | 服务发现、健康探针、指标采集 |
ports |
宿主机 ↔ 容器 | 是 | 是(默认绑定 0.0.0.0) | 对外提供 Web、API、调试接口 |
配合使用示例:内外分离暴露
一个典型微服务可同时用 expose 和 ports 实现分层暴露:
services:
user-service:
image: user-svc:1.2
expose:
- "8080" # 允许 order-service、auth-service 调用
- "9090" # 允许 prometheus 容器抓取指标
ports:
- "127.0.0.1:8080:8080" # 仅本地开发调试,不暴露公网
<p>prometheus:
image: prom/prometheus
depends_on:</p><ul><li>user-service<h1>无需 ports,它只通过 Docker 网络访问 user-service:9090</h1><p>这样既保障了内部服务连通性,又避免了敏感端口(如指标端点)意外暴露到宿主机或公网。


















