深色模式
容器网络基础:bridge、host 与端口映射
摘要:本文讲清 Docker 四种网络模式的区别与适用场景,演示如何创建自定义 bridge 让容器按名字互通,并给出端口映射与容器网络不通时的排查命令清单。
适用环境
- Linux 主机 + Docker Engine
- 有
ip、ss、curl等基础网络工具 - 示例镜像:
nginx:alpine、busybox
操作步骤
一、查看默认网络
bash
docker network ls
docker network inspect bridge1
2
2
默认会看到 bridge、host、none 三个网络。
| 模式 | 说明 | 适用场景 |
|---|---|---|
bridge(默认) | 容器接虚拟网桥 docker0,独立网络命名空间,NAT 出网 | 绝大多数场景 |
host | 容器直接用宿主网络栈,无 NAT | 追求性能、需绑定大量端口 |
none | 只有 loopback,完全隔离 | 离线批处理任务 |
container:<name> | 共享另一个容器的网络命名空间 | sidecar 调试抓包 |
二、端口映射(-p)
bash
docker run -d --name web -p 8080:80 nginx:alpine
docker port web
curl -I http://127.0.0.1:80801
2
3
2
3
格式是 -p 宿主端口:容器端口。只想在宿主机内部访问时绑定到 127.0.0.1:
bash
docker run -d --name web-inner -p 127.0.0.1:8081:80 nginx:alpine1
注意
-p 8080:80 会在宿主机 iptables 上开端口,任何能访问该机的来源都能连进来。不想暴露公网就务必加 127.0.0.1: 前缀,或配合防火墙。
三、自定义 bridge 让容器按名字互通
默认 bridge 网络里容器只能用 IP 互访,而容器 IP 重启就变。做法是自建网络:
bash
docker network create --driver bridge app-net
docker run -d --name web --network app-net nginx:alpine
docker run -d --name tool --network app-net busybox sleep 3600
docker exec tool ping -c 2 web # 直接用容器名解析,能通
docker exec tool nslookup web1
2
3
4
5
2
3
4
5
Docker 内置 DNS 会自动把同一自定义网络里的容器名解析为对应 IP。
四、host 模式
bash
docker run -d --name web-host --network host nginx:alpine
ss -lntp | grep :801
2
2
此时容器直接占用宿主机 80 端口,不需要也不能再用 -p。
五、容器网络排查命令
bash
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
docker exec web ip addr
docker exec web cat /etc/resolv.conf
iptables -t nat -L DOCKER -n # 查看映射规则1
2
3
4
2
3
4
容器访问不了外网时,按顺序查:容器 DNS(resolv.conf)→ 宿主转发开关 → 宿主防火墙。
bash
cat /proc/sys/net/ipv4/ip_forward # 必须为 1
sysctl -w net.ipv4.ip_forward=11
2
2
六、清理
bash
docker rm -f web tool web-host web-inner
docker network rm app-net1
2
2
验证
- [ ]
curl http://127.0.0.1:8080返回 nginx 欢迎页 - [ ] 同网络内容器
ping web能解析并通 - [ ]
docker network inspect app-net能看到两个容器
常见坑
docker exec tool ping web不通:两个容器不在同一自定义网络,或用了默认 bridge(默认 bridge 需--link才支持名字解析,不建议再用)。- 端口映射后外部仍访问不了:应用监听的是
127.0.0.1而非0.0.0.0,容器内只监听回环,外部永远连不上。 - host 模式报端口占用:宿主已有进程占用该端口,用
ss -lntp确认。 - 容器间突然不通:手动
iptables刷新或 firewalld 重启可能清掉 Docker 规则,重启 docker 服务可恢复。