首页/云/Docker 容器速查/UDP 端口与多协议映射
网络与存储52 条

UDP 端口与多协议映射

默认映射按 TCP 处理:UDP 服务要在端口后加 /udp,同一端口同时提供两种协议时写两条 -p。

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

UDP 要显式声明

-p 的端口映射默认按 TCP 处理,UDP 服务必须在端口后加 /udp 后缀。同一个端口号同时提供两种协议时要写两条映射,DNS 的 53 端口就是最典型的例子。漏写后缀的后果不明显:UDP 请求不会得到「连接被拒绝」这类明确反馈,而是完全收不到响应,因此排查时容易误判为服务没起来。

基本信息

语法-p 宿主端口:容器端口/udp
双协议tcp 与 udp 分别声明两条映射
端口范围-p 1000-1010:1000-1010/udp 同样支持协议后缀
宿主核对ss -lun 查看 UDP 监听状态

典型使用场景

  • DNS 服务:常规查询走 UDP,区域传送走 TCP,两条都要有
  • 日志与指标采集:Syslog、StatsD 一类以 UDP 为主
  • 游戏与实时通信:低延迟场景普遍使用 UDP
  • 时间同步:NTP 服务需要 UDP 123 端口
  • 批量端口发布:范围映射漏写协议后缀,只发布了一半端口

映射写法与核对

映射写法与核对
# DNS 同时映射 TCP 与 UDP
docker run -d --name dns -p 53:53/tcp -p 53:53/udp myapp/dns:1.0

# 只要 UDP 的采集服务
docker run -d --name log-sink -p 5000:5000/udp myapp/collector:1.0

# 宿主侧核对监听情况
docker port dns
ss -lun | grep 53

# 局部测试:用 dig 指定协议验证
dig @127.0.0.1 -p 53 example.com +notcp

写法与覆盖范围

写法覆盖协议典型服务
-p 53:53仅 TCPDNS 区域传送、部分查询
-p 53:53/udp仅 UDPDNS 常规查询
-p 53:53 -p 53:53/udpTCP 与 UDP 都要完整支持 DNS 服务
-p 5000:5000/udp仅 UDP日志采集与实时数据上报
UDP 没有连接状态,端口没发布时客户端只会超时等待,排查时要在宿主侧确认监听是否存在,而不是等客户端报错。
范围映射也支持协议后缀,写成 -p 1000-1010:1000-1010/udp 才是完整的 UDP 覆盖,漏写会只发布其中一半流量。
排查 UDP 服务不通的顺序:先在宿主执行 ss -lun 确认端口确实在监听,再用客户端工具直连宿主 IP 验证,最后才怀疑云安全组与上游设备的 UDP 放行规则;这条链路里任何一环漏配,客户端看到的都只是超时。
同一个宿主端口不能同时被两个容器以同一种协议占用:先启动的容器拿到端口,后启动的直接失败,遇到端口冲突先看是不是 TCP 与 UDP 重复声明。

易错点

  • 只映射 TCP 就对外提供服务:UDP 请求静默失败,日志里连拒绝连接都看不到,先核对协议后缀
  • 范围映射漏写协议:以为整段端口都发布了,实际只覆盖一种协议
  • UDP 服务排查用 telnet 测试:TCP 工具无法验证 UDP 端口,改用 nc -u 或对应客户端
  • 忽略宿主防火墙对 UDP 的规则:UDP 放行常与 TCP 分开配置,检查时两类规则都要看

数据来源与参考

  • Docker 官方 CLI 参考:端口发布协议后缀(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌