首页/云/云与容器速查/Compose 端口发布写法
容器与 Docker106 条

Compose 端口发布写法

compose 的 ports 支持短语法字符串与长语法结构:务必给短语法加引号,否则 YAML 会把 22:22 解析成六十进制整数,映射到离谱端口。

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

Compose 端口发布是什么

compose 的 ports 字段把容器端口发布到宿主机,支持短语法字符串与长语法结构两种写法。最大的坑在 YAML 解析:未加引号的 22:22 会被 YAML 1.1 当作六十进制数字,实际得到完全不同的端口号。所以短语法端口一律加引号,这是写 compose 文件时必须养成的习惯。

基本信息

短语法"8080:80" 表示宿主 8080 映射到容器 80
只写容器端口"80" 表示宿主随机分配一个高位端口
绑定地址"127.0.0.1:3306:3306" 只绑回环,不对公网暴露
长语法target、published、protocol、mode 逐项显式声明
协议"53:53/udp" 用短语法后缀声明 UDP

典型使用场景

  • 本地访问服务:把容器内的 80 映射到宿主 8080,浏览器直接打开
  • 安全加固:数据库端口只绑 127.0.0.1,避免暴露到公网
  • 多实例并存:不给固定宿主端口,让系统自动分配,避免冲突
  • UDP 服务:DNS 或日志采集等需要显式声明 UDP 协议
  • 临时演示:用随机端口起好环境,再把实际端口填进访问文档

示例

示例
ports:
  - "8080:80"                    # 宿主 8080 → 容器 80,务必加引号
  - "127.0.0.1:3306:3306"        # 只绑回环,数据库不对公网开放
  - "53:53/udp"                  # 声明 UDP 协议
  - target: 443                  # 长语法:逐项显式,可读性更好
    published: 8443
    protocol: tcp
    mode: host                   # 每节点一个端口,而非负载均衡
# 查看实际映射结果
docker compose port web 80

写法与效果对照

写法宿主端口是否暴露公网适用
"8080:80"固定 8080默认暴露所有地址对外提供的服务
"127.0.0.1:8080:80"固定 8080仅本机可访问调试、内部管理面板
"80"随机分配默认暴露所有地址多实例并行,避免冲突
长语法 target/publishedpublished 指定取决于绑定配置需要显式声明协议与模式
YAML 1.1 会把未加引号的 xx:yy 当成六十进制数解析:22:22 会变成 1342 这样的整数,映射结果完全不对,且不一定报错,排查起来非常费时。短语法端口一律加引号。
需要横向扩容到多个实例时不要保留固定宿主端口:第二个实例会直接报端口占用。改成只写容器端口,让宿主自动分配,再由负载均衡或反向代理统一入口。

易错点

  • ports 写成 8080:80 不带引号,YAML 把它解析成整数,映射结果完全不对
  • 扩容到多实例时保留固定宿主端口,第二个实例直接报端口占用
  • 数据库端口绑定到所有地址,等于把数据库直接暴露在公网
  • 长语法只写 target 不写 published,实际并未发布到宿主

数据来源与参考

  • Docker Docs:Compose ports
  • YAML 1.1 规范(sexagesimal)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌