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