一、核心概念
Docker 网络(Network)
Docker 通过虚拟网络实现容器间、容器与主机间的通信。网络定义容器的 IP 地址、DNS 解析和端口映射规则。网络驱动(Network Driver)
Docker 支持多种网络驱动,决定网络的实现方式:- bridge:默认驱动,适用于单机容器间通信(类似物理交换机)。
- host:容器直接使用主机网络,端口与主机共享。
- overlay:跨主机容器通信(需 Swarm 或 Kubernetes 支持)。
- none:禁用网络,容器无网络接口。
- macvlan:为容器分配独立 MAC 地址,模拟物理设备。
默认网络
Docker 安装后自动创建三个网络:bridge
:默认桥接网络。host
:主机网络模式。none
:无网络模式。
二、常用命令详解
1. 查看网络列表
docker network ls
2. 创建自定义网络
docker network create [OPTIONS] NETWORK
- 常用选项:
--driver
:指定驱动(默认bridge
)。--subnet
:定义子网(如192.168.1.0/24
)。--gateway
:设置网关。
示例:
docker network create --driver bridge --subnet 192.168.10.0/24 my_network
3. 连接容器到网络
# 启动时连接
docker run -d --name web_app --network my_network nginx
# 动态连接已运行容器
docker network connect my_network existing_container
4. 断开容器与网络的连接
docker network disconnect my_network existing_container
5. 查看网络详情
docker network inspect my_network
6. 删除网络
docker network rm my_network
三、网络模式详解
1. Bridge 模式(默认)
- 特点:
- 容器通过虚拟网桥(
docker0
)互联。 - 每个容器分配独立 IP 和端口,默认无法通过容器名解析(需自定义 DNS)。
- 容器通过虚拟网桥(
- 使用场景:单机环境下容器间隔离通信。
2. Host 模式
- 特点:
- 容器直接使用主机网络,端口与主机共享。
- 性能最高,但端口冲突风险大。
- 示例:
docker run -d --name web_host --network host nginx
3. Overlay 模式
- 特点:
- 支持跨主机容器通信(需 Swarm 集群或 Kubernetes)。
- 使用 VXLAN 封装数据包。
- 使用场景:分布式应用、微服务架构。
4. None 模式
- 特点:容器无网络接口,仅保留 loopback 设备。
- 示例:
docker run -d --name no_network --network none busybox sleep 3600
5. Macvlan 模式
- 特点:为容器分配独立 MAC 地址,模拟物理设备。
- 示例:
docker network create -d macvlan --subnet 192.168.1.0/24 --gateway 192.168.1.1 -o parent=eth0 mac_net
四、容器间通信
1. 同一网络内的通信
- 自动 DNS 解析:同一网络内的容器可通过容器名互相访问。
- 示例:
# 创建网络 docker network create my_net # 启动两个容器并连接网络 docker run -d --name web1 --network my_net nginx docker run -d --name web2 --network my_net nginx # 进入 web1 容器测试 docker exec -it web1 curl http://web2
2. 跨网络通信
- 方案:通过路由或代理实现。
- 示例:使用
nginx
反向代理:# 创建两个网络 docker network create net_a docker network create net_b # 启动代理容器并连接两个网络 docker run -d --name proxy --network net_a --network net_b nginx # 启动两个服务容器 docker run -d --name app1 --network net_a httpd docker run -d --name app2 --network net_b httpd # 配置代理规则,将 net_a 的请求转发到 app1,net_b 的请求转发到 app2
五、端口映射
1. 发布容器端口到主机
docker run -d --name web -p 8080:80 nginx # 主机8080映射到容器80
2. 随机端口映射
docker run -d --name web -P nginx # 随机映射暴露的端口
3. 查看端口绑定
docker port web
六、最佳实践
1. 使用自定义网络代替默认 bridge
- 默认
bridge
网络不支持自动 DNS 解析,建议创建自定义网络:docker network create my_app_net
2. 合理规划子网和 IP 范围
- 避免与主机或物理网络冲突:
docker network create --subnet 172.18.0.0/16 my_private_net
3. 隔离不同环境的网络
- 开发、测试、生产环境使用独立网络:
docker network create dev_net docker network create prod_net
4. 使用 Compose 管理网络
- 通过
docker-compose.yml
定义网络:services: web: networks: - frontend db: networks: - backend networks: frontend: backend:
5. 监控网络性能
- 使用
docker stats
或第三方工具(如ctop
)监控网络流量。
七、常见问题
1. 容器无法通信
- 原因:未连接同一网络或防火墙限制。
- 解决:
- 检查网络连接:
docker network inspect
。 - 临时关闭防火墙测试:
systemctl stop firewalld
(CentOS)。
- 检查网络连接:
2. 端口冲突
- 原因:主机端口已被占用。
- 解决:
- 修改容器映射端口:
-p 8081:80
。 - 查找占用端口的进程:
lsof -i :8080
。
- 修改容器映射端口:
3. DNS 解析失败
- 原因:容器未连接自定义网络或 Docker DNS 配置错误。
- 解决:
- 创建自定义网络并连接容器。
- 检查 Docker DNS 配置(
/etc/docker/daemon.json
)。
4. Macvlan 无法获取 IP
- 原因:物理网卡不支持或未启用混杂模式。
- 解决:
- 启用混杂模式:
ip link set eth0 promisc on
。 - 检查网卡驱动兼容性。
- 启用混杂模式:
八、总结
- 核心命令:
docker network create/connect/disconnect/inspect
。 - 网络模式:根据场景选择
bridge
(默认)、host
(高性能)、overlay
(跨主机)。 - 通信规则:同一网络内通过容器名解析,跨网络需路由或代理。
- 最佳实践:自定义网络、合理规划子网、使用 Compose 管理。