端口映射是什么
端口映射把容器内监听的端口发布到宿主机上,外部流量才有机会到达容器。写法是宿主端口与容器端口用冒号分隔,也可以只写容器端口让引擎自动分配宿主端口。需要清楚的是,同一容器的多个实例只有映射了宿主端口才对外可见,容器之间在同网络内通信不需要映射。
基本信息
| 语法 | -p [宿主地址:]宿主端口:容器端口[/协议] |
|---|---|
| 默认行为 | 监听宿主全部地址,协议为传输控制协议 |
| 省略宿主端口 | 只写容器端口时由引擎随机分配宿主端口 |
| 端口范围 | 可写成区间,两侧数量要一致 |
| 生效时机 | 创建容器时确定,事后修改必须删除重建 |
典型使用场景
- 对外提供服务:把 Web 服务的容器端口发布到宿主,供外部访问
- 本地开发联调:把数据库、缓存端口映射出来,用本机客户端直连
- 只对内部开放:绑定回环地址,仅允许本机访问,避免暴露到内网或公网
- 批量端口发布:一个容器内有多个监听端口时逐个写出来
- 临时端口分配:让引擎自动挑一个空闲宿主端口,避免与既有服务冲突
常用示例
常用示例
docker run -d -p 8080:80 nginx:1.27-alpine # 宿主 8080 映射到容器 80
docker run -d -p 127.0.0.1:9000:9000 app/api:v1.2 # 只允许本机访问
docker run -d -p 8080-8082:80-82 myapp/web:1.0 # 端口区间映射
docker run -d -p 53:53/udp dns-service # 指定用户数据报协议
docker port web # 查看容器实际映射关系映射相关核对项
| 核对项 | 怎么看 | 异常表现 |
|---|---|---|
| 映射是否生效 | 用查看端口命令或读容器元数据 | 映射写在命令里但列表为空,说明容器未运行 |
| 宿主端口是否被占 | 在宿主上查看监听列表 | 启动报端口已被占用 |
| 监听地址范围 | 看映射是否绑定了具体地址 | 只写宿主端口时对内网全网开放,安全面偏大 |
| 协议是否匹配 | 确认应用用的是传输控制协议还是用户数据报协议 | 协议写错时连接超时或被拒绝 |
| 容器内是否真的监听 | 在容器内查看监听状态 | 映射正常但访问不通,通常是应用没在预期端口启动 |
规划端口时的建议
- 把宿主端口按服务分段规划并登记,避免多次部署后端口冲突
- 只对需要外部访问的服务做映射,其余服务走同一内部网络互通即可
- 生产环境明确绑定监听地址,缩小暴露范围
- 需要多个实例时优先让引擎分配端口,再通过上游做反向代理
- 映射关系与防火墙策略一并维护,否则应用正常但访问仍不通
访问不通的排查顺序
- 先在宿主上本地访问映射端口,区分是应用问题还是网络问题
- 再进容器内访问应用端口,确认应用真的在监听并响应
- 检查地址绑定:绑定回环时外部机器本来就访问不到
- 检查防火墙与安全组,确认宿主端口在放行范围内
- 检查上游代理配置,确认转发目标与端口一致
端口映射在创建容器时确定,属于不可变配置的一部分。规划时预留调整空间,避免上线后发现冲突只能重建容器。
不加宿主地址的映射会监听宿主全部网络接口。云主机上若安全组与防火墙不严,等于把服务直接暴露到公网,发布前要确认访问范围确实是预期的。