编排里的端口字段
在编排文件里声明端口映射,效果与运行命令的端口参数一致:把容器内监听的端口发布到宿主机。它支持简洁写法,也支持逐字段展开的写法,后者能明确指定监听地址与协议。写错时的后果往往不是报错,而是服务只在内网可达或对外暴露过宽。
基本信息
| 简洁写法 | 用冒号连接宿主端口与容器端口,含冒号的值建议加引号 |
|---|---|
| 展开写法 | 逐项声明容器端口、宿主端口、协议与监听地址 |
| 默认行为 | 监听宿主全部地址,协议为传输控制协议 |
| 绑定地址 | 可指定只监听回环地址,仅本机可访问 |
| 生效时机 | 属于创建期配置,改动后需要重新拉起触发容器重建 |
典型使用场景
- 对外发布服务:把 Web 服务端口映射到宿主的常规端口
- 仅本机暴露:管理接口只绑定回环地址,配合隧道使用
- 同一端口多服务:不同环境用不同宿主端口,避免冲突
- 用户数据报协议服务:显式声明协议,避免默认协议不匹配
- 区间映射:一个服务占用多个连续端口时按区间书写
常用写法
常用写法
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80" # 宿主 8080 到容器 80
- "127.0.0.1:9000:9000" # 仅本机可访问
- "53:53/udp" # 指定用户数据报协议
- target: 8443 # 展开写法:容器端口
published: "8443" # 宿主端口
protocol: tcp写得不对会怎样
| 写法问题 | 后果 | 处理 |
|---|---|---|
| 宿主端口被占用 | 创建容器阶段失败,整套服务拉起中断 | 先查占用进程,或改宿主端口 |
| 值没加引号 | 被解析成非常规数值,端口语义改变 | 含冒号的值统一加引号 |
| 绑定地址写成通配 | 服务对全网开放,安全面扩大 | 明确写回环或内网地址 |
| 协议写错 | 用户数据报协议服务用传输控制协议发布,访问不通 | 按应用实际协议声明 |
| 改了端口没重新拉起 | 旧映射继续生效,改动看似无效 | 重新拉起触发容器重建 |
端口与网络的配合
- 同一网络内的服务用服务名互访,不必逐个映射端口,减少暴露面
- 需要外部访问的服务才映射端口,内部服务留给内部网络
- 网关类服务集中映射端口,后端服务不直接暴露
- 宿主端口规划按服务分段登记,避免多项目混部时冲突
- 映射与防火墙策略同步维护,否则应用正常但外部访问不通
容器之间的通信不需要端口映射。把数据库端口映射出来只是方便本机调试,生产环境应当只保留在内部网络里。
改了端口字段后必须重新拉起让容器重建,只重启进程不会应用新的端口配置,这是「改了没生效」的高频原因。