绑定指定 IP 发布端口是什么
发布端口时可以指定宿主侧的监听地址,写法是在主机端口前加 IP。这样做的价值在于控制暴露范围:把数据库、管理接口绑定到回环地址,只有本机进程能连;绑定到某块内网网卡地址,则只对特定网段开放。它属于最小暴露面的一种实现方式,配合防火墙规则效果更好,但要注意容器端口发布可能绕开部分主机防火墙链。
基本信息
| 语法 | -p 宿主IP:宿主端口:容器端口 |
|---|---|
| 仅本机 | -p 127.0.0.1:5432:5432,只有宿主本机可访问 |
| 指定网卡 | -p 192.168.1.10:8080:80,只在该地址上监听 |
| 等价写法 | 编排文件里的 ports 短格式或长格式 host_ip 字段 |
| 查看方式 | docker port 容器 与 docker inspect 的端口映射字段 |
| 注意事项 | 容器端口发布依赖地址转换规则,可能与主机防火墙策略有交叉 |
典型使用场景
- 数据库只给本机应用访问:绑定回环地址,避免直接暴露给局域网
- 内部管理端口通过宿主反向代理对外提供服务,源头只监听本机
- 多网卡主机上把服务只发布到业务网卡,隔离管理与存储网络
- 灰度验证:先绑定内网地址,确认稳定后再放开到外部
- 减少扫描面:不对外提供服务的端口一律绑定到回环或内网地址
绑定与核对
绑定与核对
# 只在本机监听:局域网内其他机器无法直接连接
docker run -d --name db -p 127.0.0.1:5432:5432 \
-e POSTGRES_PASSWORD=秘密 \
postgres:16-alpine
# 绑定到指定内网网卡地址
docker run -d --name web -p 192.168.1.10:8080:80 nginx:1.27-alpine
# 核对实际监听地址与映射
docker port db
docker inspect -f '{{json .NetworkSettings.Ports}}' db
# 宿主侧确认监听情况(只应在指定地址上出现)
ss -ltnp | grep 5432编排文件写法
编排文件写法
services:
api:
image: app/api:1.4.2
ports:
- "127.0.0.1:8080:8080" # 短格式:宿主地址加冒号加端口
db:
image: postgres:16-alpine
ports:
- target: 5432 # 长格式显式声明
published: 5432
host_ip: 127.0.0.1
protocol: tcp绑定方式对照
| 写法 | 可访问范围 | 适用场景 |
|---|---|---|
| -p 5432:5432 | 所有宿主地址(含外网) | 对外服务 |
| -p 127.0.0.1:5432:5432 | 仅宿主本机 | 数据库与内部管理口 |
| -p 192.168.1.10:8080:80 | 该地址所在网络 | 限定网段访问 |
| -p 0.0.0.0:8080:80 | 所有 IPv4 地址 | 显式放开(默认行为) |
| 不写 -p | 仅容器网络内可访问 | 同网络服务互相调用 |
绑定结果要结合宿主防火墙一起看:端口发布的转发规则与主机防火墙链的先后顺序会影响实际可达性,排查「绑了却访问不到」时先看监听地址,再看防火墙规则。
多网卡主机上绑定错误地址是最常见的失误:先看 ip addr 确认网卡地址,再决定绑定哪个 IP,避免只监听了一个外部访问不到的地址。