Docker 网络是容器之间以及容器与外部世界通信的核心组件,理解 Docker 网络的不同模式、配置方法和实际应用场景非常重要。以下是详细的解释和示例:
一、Docker 网络基础
1. 默认网络模式
安装 Docker 后,默认会创建以下三种网络:
bash
docker network ls输出示例:
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local- bridge:默认桥接网络,容器默认连接到此网络。
- host:容器直接使用宿主机的网络栈。
- none:禁用所有网络(只有
lo回环接口)。
二、Docker 网络模式详解
1. 桥接网络(Bridge)
- 特点:
- 容器通过虚拟网桥
docker0通信。 - 每个容器分配独立的内部 IP(如
172.17.0.2)。 - 容器间可以相互通信(通过 IP),但需手动配置端口映射才能与宿主机或外部通信。
- 容器通过虚拟网桥
- 适用场景:单机环境下的容器隔离和通信。
示例 1:使用默认桥接网络
bash
# 运行一个 Nginx 容器,映射宿主机端口 8080 到容器的 80 端口
docker run -d --name web -p 8080:80 nginx
# 访问宿主机 IP:8080 即可访问容器内的 Nginx 服务
curl http://localhost:8080示例 2:容器间通过 IP 通信
bash
# 运行两个容器(使用默认桥接网络)
docker run -d --name container1 alpine sleep 3600
docker run -d --name container2 alpine sleep 3600
# 进入 container1,ping container2 的 IP
docker exec -it container1 sh
ping 172.17.0.3 # 假设 container2 的 IP 是 172.17.0.32. Host 网络模式
- 特点:
- 容器共享宿主机的网络命名空间,直接使用宿主机的 IP 和端口。
- 无需端口映射(如容器运行在 80 端口,宿主机 80 端口直接被占用)。
- 适用场景:需要高性能网络(如负载均衡、实时流媒体)。
示例:使用 Host 模式
bash
# 运行一个 Nginx 容器,直接使用宿主机的网络
docker run -d --name web-host --network=host nginx
# 访问宿主机 IP:80 即可(无需端口映射)
curl http://localhost:803. None 网络模式
- 特点:
- 容器只有
lo回环接口,无法与外部通信。 - 适用于完全隔离或自定义网络配置的场景。
- 容器只有
- 适用场景:安全测试、手动配置网络栈。
示例:使用 None 模式
bash
docker run -it --network=none --name isolated-container alpine sh
# 进入容器后执行 `ifconfig`,只能看到 `lo` 接口4. 容器共享网络(Container)
- 特点:
- 新容器共享指定容器的网络命名空间(共用 IP 和端口)。
- 类似“网络双胞胎”,适合日志收集或监控容器。
- 示例:
bash
# 运行一个主容器
docker run -d --name main-container nginx
# 新容器共享 main-container 的网络
docker run -it --network=container:main-container alpine sh
# 此时,两个容器的网络完全相同三、自定义网络
Docker 允许创建自定义桥接网络,提供更好的容器间通信(支持 DNS 自动解析容器名称)。
1. 创建自定义桥接网络
bash
docker network create my-network2. 将容器连接到自定义网络
bash
# 运行两个容器并连接到自定义网络
docker run -d --name web-app --network=my-network nginx
docker run -it --name debug-tool --network=my-network alpine sh3. 容器间通过名称通信
在 debug-tool 容器内:
bash
ping web-app # 直接通过容器名 ping 通(无需 IP)
curl http://web-app:80 # 通过容器名访问服务4. 自定义网络的优点
- DNS 自动解析:容器可通过名称互相通信。
- 隔离性:不同自定义网络中的容器默认无法通信。
- 灵活性:支持配置子网、网关和 IP 地址范围。
四、Docker 网络常用命令
1. 查看网络列表
bash
docker network ls2. 检查网络详情
bash
docker network inspect bridge # 查看默认桥接网络的详细信息3. 连接/断开容器与网络
bash
docker network connect my-network existing-container
docker network disconnect my-network existing-container4. 删除网络
bash
docker network rm my-network五、端口映射详解
通过 -p 参数将容器端口映射到宿主机:
bash
# 格式:-p <宿主机端口>:<容器端口>
docker run -d -p 8080:80 --name web nginx
# 绑定特定 IP
docker run -d -p 192.168.1.100:8080:80 nginx
# 映射 UDP 端口
docker run -d -p 53:53/udp dns-server六、常见问题与排查
1. 容器无法访问外部网络
- 检查宿主机的防火墙或 iptables 规则。
- 确保 Docker 服务正常运行:
systemctl status docker。
2. 容器间无法通信
- 确认容器在同一网络中。
- 检查自定义网络的 DNS 解析是否正常。
3. 端口冲突
- 使用
docker ps查看已占用的端口。 - 更换宿主机端口或停止冲突的容器。
七、总结
| 网络模式 | 特点 | 适用场景 |
|---|---|---|
| bridge | 默认隔离,需端口映射 | 大多数单机应用 |
| host | 直接使用宿主机网络 | 高性能需求(如负载均衡) |
| none | 完全无网络 | 安全测试/手动配置网络 |
| container | 共享其他容器的网络 | 监控/日志收集容器 |
| 自定义网络 | DNS 自动解析,隔离性强 | 多容器协作(如微服务) |
通过合理选择网络模式,您可以优化容器的通信效率和安全性。实际使用中,推荐优先使用自定义网络以简化服务发现。