首页/云/Docker 容器速查/EXPOSE 声明端口
镜像与构建107 条

EXPOSE 声明端口

在镜像里声明服务监听的端口(文档性质):为使用者提示,配合 -P 随机映射或编排读取;它本身不会打开或发布端口。

Docker 容器速查云更新于 2026-10-13

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 随机映射到宿主高位端口

声明与发布的区别

动作写在哪里实际效果
EXPOSEDockerfile只打标记,不改变任何网络行为
-p 指定映射docker run建立宿主端口到容器端口的映射
-P 随机映射docker run按 EXPOSE 自动分配到高位端口
ports 字段compose 文件项目化声明映射,可只写容器端口
network_mode host运行参数直接占用宿主端口,映射不生效
访问不通的排查顺序:先用 docker port 看有没有映射,再看宿主是否在监听(ss -ltnp),最后确认容器内应用监听的是 0.0.0.0 还是 127.0.0.1。
应用只监听回环地址时,即使发布了端口也从外部访问不到;这类情况在容器里很常见,配置上要改成监听所有网卡。

易错点

  • 把 EXPOSE 当成发布端口:只在 Dockerfile 里声明而运行时没加 -p,外部依然访问不到
  • 端口写错会导致编排与监控按错误端口探测,表现为服务反复被判定不健康
  • 用 -P 随机映射后不看实际分配的端口就去测连通性,连不上其实只是端口不对,docker port 一看就清楚
  • 多协议应用只声明了 tcp,UDP 服务在随机映射或编排里拿不到对应端口

数据来源与参考

  • Docker 官方文档:Dockerfile EXPOSE(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌