EXPOSE 是什么
EXPOSE 在镜像里声明应用监听的端口,属于元数据:给使用者提示、供 -P 随机映射与编排工具读取。它本身既不打开也不发布端口,能否从外部访问取决于运行时的 -p 映射或 host 网络模式。
基本信息
| 用途 | 声明监听端口(元数据) |
|---|---|
| 语法 | EXPOSE 8080 或 EXPOSE 80/tcp 443/tcp 53/udp |
| 协议 | 默认 tcp,需要 UDP 时显式写 /udp |
| 实际发布 | 由 docker run -p、compose 的 ports 字段或 host 网络决定 |
| 读取方 | -P 随机映射、编排与监控工具会读取这份声明 |
典型使用场景
- 让使用者知道服务在哪个端口监听,属于镜像自我说明的一部分
- 配合 docker run -P 把声明的端口全部随机映射到宿主高位端口,便于临时验证
- 编排与监控读取声明端口做服务发现与探测
- 多端口应用(业务端口与指标端口)一次性声明清楚
- 生成镜像清单与资产台账时作为端口信息来源
- 迁移到编排平台时给运维提供端口对照表,减少沟通成本
示例
示例
EXPOSE 8080 # 声明监听端口,而不是发布端口
EXPOSE 80/tcp 443/tcp
EXPOSE 53/udp # 需要显式指定协议时
# 真正对外要在运行时做:
docker run -p 8080:8080 app/web:1.0
docker run -P app/web:1.0 # 按 EXPOSE 随机映射到宿主高位端口声明与发布的区别
| 动作 | 写在哪里 | 实际效果 |
|---|---|---|
| EXPOSE | Dockerfile | 只打标记,不改变任何网络行为 |
| -p 指定映射 | docker run | 建立宿主端口到容器端口的映射 |
| -P 随机映射 | docker run | 按 EXPOSE 自动分配到高位端口 |
| ports 字段 | compose 文件 | 项目化声明映射,可只写容器端口 |
| network_mode host | 运行参数 | 直接占用宿主端口,映射不生效 |
访问不通的排查顺序:先用 docker port 看有没有映射,再看宿主是否在监听(ss -ltnp),最后确认容器内应用监听的是 0.0.0.0 还是 127.0.0.1。
应用只监听回环地址时,即使发布了端口也从外部访问不到;这类情况在容器里很常见,配置上要改成监听所有网卡。