首页/云/Docker 容器速查/docker run -p 端口映射基础语法
网络与存储52 条

docker run -p 端口映射基础语法

把宿主机端口映射到容器端口:-p 宿主:容器 是常用形式,默认监听全部地址;容器间同网络直接通信时不需要映射。

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

端口映射是什么

端口映射把容器内监听的端口发布到宿主机上,外部流量才有机会到达容器。写法是宿主端口与容器端口用冒号分隔,也可以只写容器端口让引擎自动分配宿主端口。需要清楚的是,同一容器的多个实例只有映射了宿主端口才对外可见,容器之间在同网络内通信不需要映射。

基本信息

语法-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                                           # 查看容器实际映射关系

映射相关核对项

核对项怎么看异常表现
映射是否生效用查看端口命令或读容器元数据映射写在命令里但列表为空,说明容器未运行
宿主端口是否被占在宿主上查看监听列表启动报端口已被占用
监听地址范围看映射是否绑定了具体地址只写宿主端口时对内网全网开放,安全面偏大
协议是否匹配确认应用用的是传输控制协议还是用户数据报协议协议写错时连接超时或被拒绝
容器内是否真的监听在容器内查看监听状态映射正常但访问不通,通常是应用没在预期端口启动

规划端口时的建议

  • 把宿主端口按服务分段规划并登记,避免多次部署后端口冲突
  • 只对需要外部访问的服务做映射,其余服务走同一内部网络互通即可
  • 生产环境明确绑定监听地址,缩小暴露范围
  • 需要多个实例时优先让引擎分配端口,再通过上游做反向代理
  • 映射关系与防火墙策略一并维护,否则应用正常但访问仍不通

访问不通的排查顺序

  • 先在宿主上本地访问映射端口,区分是应用问题还是网络问题
  • 再进容器内访问应用端口,确认应用真的在监听并响应
  • 检查地址绑定:绑定回环时外部机器本来就访问不到
  • 检查防火墙与安全组,确认宿主端口在放行范围内
  • 检查上游代理配置,确认转发目标与端口一致
端口映射在创建容器时确定,属于不可变配置的一部分。规划时预留调整空间,避免上线后发现冲突只能重建容器。
不加宿主地址的映射会监听宿主全部网络接口。云主机上若安全组与防火墙不严,等于把服务直接暴露到公网,发布前要确认访问范围确实是预期的。

易错点

  • 宿主端口已被占用导致启动失败,先查监听列表找出占用者再决定换端口还是停掉占用进程
  • 只写宿主端口没绑定地址,服务意外暴露到公网
  • 协议写错,用户数据报协议的服务用传输控制协议发布,表现为访问不通
  • 端口写反,把宿主端口与容器端口颠倒,容器内应用根本没监听该端口

数据来源与参考

  • Docker 官方 CLI 参考:docker run 的 -p/--publish(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌