Docker的网络子系统采用可插拔的驱动架构,默认提供多种网络驱动:
- bridge
:默认网络驱动,适用于独立容器通信
- host
:移除容器与主机间的网络隔离
- overlay
:连接多个Docker守护进程,支持Swarm服务通信
- macvlan
:为容器分配MAC地址,使其在网络上显示为物理设备
- none
:禁用所有网络
安装Docker时自动创建三个网络:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local
工作原理:
docker0
配置示例:
# 创建自定义bridge网络
docker network create --driver bridge --subnet 172.18.0.0/16 my-bridge
# 运行容器并指定网络
docker run -d --name web --network my-bridge nginx
docker run -d --network host nginx
# 在Swarm模式下创建
docker network create -d overlay my-overlay
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlan
# 容器1
docker run -d --name web --network my-bridge nginx
# 容器2可以直接ping web
docker run -it --network my-bridge busybox ping web
# 将已有容器连接到另一个网络
docker network connect another-network web
docker run -d -p 8080:80 nginx
docker run --dns 8.8.8.8 --dns-search example.com nginx
docker network connect --alias db --alias mysql my-network web
# 禁用容器间通信
docker network create --driver bridge --internal my-isolated-net
# 启用容器网络加密
docker network create --opt encrypted overlay my-secure-net
# 检查容器网络配置
docker inspect <container> | grep -i network
# 进入容器诊断
docker exec -it <container> sh
# 容器内可用的命令:
ip addr # 查看IP配置
ping # 测试连通性
nslookup # DNS解析测试
traceroute # 路由跟踪
问题1:容器无法访问外部网络
- 检查:
bash
# 查看NAT规则
iptables -t nat -L -n
# 检查ip_forward是否启用
cat /proc/sys/net/ipv4/ip_forward
- 解决:
bash
# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
问题2:端口绑定冲突
- 检查:
bash
netstat -tuln | grep <port>
- 解决:
bash
# 更改主机端口或停止冲突服务
docker run -p 8081:80 nginx
生产环境建议:
性能优化:
安全建议:
通过深入理解Docker网络模型和灵活运用各种网络驱动,可以构建出既满足业务需求又安全高效的容器网络架构。