端口发布是什么
端口发布是 docker run 时通过 -p 把容器端口暴露到宿主机的机制,写法是宿主地址、宿主端口与容器端口的组合。关键点在于默认绑定全网卡:不写绑定地址时容器端口会监听在 0.0.0.0 上,只要宿主网络可达就能连上,所以内网服务应显式绑定回环地址或指定内网网卡,避免数据库与管理后台直接对公网开放。
基本信息
| 格式 | [-p 绑定地址:]宿主端口:容器端口[/协议] |
|---|---|
| 随机宿主端口 | 只写容器端口时,宿主侧会分配一个高位随机端口 |
| 仅本机访问 | 写成 127.0.0.1 加端口的形式,只有宿主回环地址可连 |
| 指定网卡 | 绑定某个内网地址,让服务只在特定网络可达 |
| 协议 | 默认 TCP,需要 UDP 时显式声明,如 53 端口的 UDP |
| 查看映射 | 用 docker port 或 inspect 查看实际映射结果 |
典型使用场景
- 对外提供 Web 服务:把宿主的 80 或 443 映射到容器内应用端口
- 内网数据库:映射时绑定回环地址,只允许本机或经隧道访问
- 多实例共存:同一镜像起多个容器,用不同宿主端口区分
- 临时调试:只写容器端口让宿主随机分配,用完即删
- UDP 服务:为域名解析、日志采集这类服务显式声明协议
- 限制暴露范围:绑定在内网网卡上,公网网卡完全不监听
常见写法与含义
| 写法 | 含义 | 风险提示 |
|---|---|---|
| -p 8080:80 | 宿主全部网卡的 8080 映射到容器 80 | 默认全网监听,需配合防火墙 |
| -p 127.0.0.1:3306:3306 | 只有宿主本机可连数据库 | 推荐的内网服务写法 |
| -p 10.0.0.5:8080:80 | 只绑定指定内网地址 | 多网卡主机的常见选择 |
| -p 80 | 宿主随机高位端口映射容器 80 | 重启后端口可能变化 |
| -p 53:53/udp | 显式声明 UDP 协议 | 漏写协议时按 TCP 处理,服务不可用 |
使用示例
使用示例
docker run -d -p 127.0.0.1:3306:3306 --name db mysql:8.0 # 数据库只对宿主开放
docker run -d -p 8080:80 --name web nginx:1.27 # Web 服务对外
docker port web # 查看实际映射
docker inspect -f "{{json .NetworkSettings.Ports}}" web # 核对监听地址
ss -lntp | grep 8080 # 在宿主侧确认监听默认的端口发布等于监听全部网卡:安全组或宿主防火墙一旦漏配,数据库与管理端口就是公网未授权访问,属于高频事故点。
端口发布与容器内监听的地址是两件事:容器内应用只监听回环地址时,即使做了端口映射也无法从外部访问。
随机宿主端口适合临时验证,不适合长期服务:容器重建后端口可能变化,防火墙规则与前端配置都要跟着改。
排查端口不通要分三层看:容器内是否监听、宿主是否映射成功、网络策略是否放行,三层都对才通。
暴露面收敛的做法
- 内网服务统一绑定回环地址,需要外部访问时经反向代理转发
- 只在必要时使用固定宿主端口,随机端口会带来配置漂移
- 把端口映射清单纳入例行审计,定期核对公网可达的服务
- 同一宿主承载多实例时用命名规范区分端口用途
- 容器内应用监听地址要与映射方式匹配,否则映射成功也访问不到
- 排查不通时按容器内监听、宿主映射、网络策略三层依次确认
宿主端口与容器端口很容易混淆:排障时先确认映射方向,再看容器内是否监听对应端口,顺序对了能少走一遍弯路。