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/published | published 指定 | 取决于绑定配置 | 需要显式声明协议与模式 |
YAML 1.1 会把未加引号的 xx:yy 当成六十进制数解析:22:22 会变成 1342 这样的整数,映射结果完全不对,且不一定报错,排查起来非常费时。短语法端口一律加引号。
需要横向扩容到多个实例时不要保留固定宿主端口:第二个实例会直接报端口占用。改成只写容器端口,让宿主自动分配,再由负载均衡或反向代理统一入口。