Docker网络
▶ docker网络类型
• bridge(默认): #类似于虚拟机NAT网络
容器可以通过NAT访问外部网络
• host(主机网络):
容器的网络配置跟宿主机网络一模一样
• none(无网络):
▪ 容器没有配置任何网络,没有任何网络接口配置(网卡等)
▪ 用来测试,只有回环地址127.0.0.1
• overlay(覆盖网络):
用与Docker集群下的跨主机容器通信。通过VXLAN隧道技术,将不同宿主机上的容器连接到同一个虚拟网络
• macvlan: #类似于虚拟机桥接网络
▪ 为容器分配一个MAC地址,使容器直接连接到物理网络,在网络上表现为一个独立的物理设备。
▪ 容器可以被网络中的其他设备访问
• ipvlan:
与macvlan类似,但容器共享宿主机的MAC地址,使用不同的IP地址。减少MAC地址消耗
• 自定义网络:
自定义网络和默认桥接最大不同是:
可以使用容器名来跟对方通信
▶ Docker网络基础操作
• 增
▪ 创建自定义网络(指定子网):
docker network create --driver=bridge --subnet=192.169.100.0/24 mynet
▪ 将容器连接到自定义网络
docker run -d --name box1 --network=mynet busybox:latest
• 删
删除自定义网络:
docker network rm mynet
• 查
• 查看网络列表
docker network ls
• 查看网络详情
docker network inspect bridge
输出内容:包括子网、网关、连接的容器等信息
▶ 高级网络模式示例
• Host网络模式(直接使用宿主机网络)
docker run -d --network=host --name nginx-host nginx
#容器与宿主机共享网络栈(无NAT性能损耗)
适用场景:高性能需求(如负载均衡器)
• Macvlan网络(直接分配MAC地址)
docker network create -d macvlan \
--subnet=xxx.xxx.xx.x/24 \ #指定IP
--gateway=xxx.xxx.x.x \ #指定网关
-o parent=eth0 \ #指定宿主机网卡
my_macvlan #网络名
特点:容器像物理设备一样出现在局域网中
▶ 容器网络隔离与连接
• 断开/连接网络
▪ docker network disconnect bridge web #从默认网络断开
▪ docker network connect mynet web #连接到新网络
• 端口映射
▪ docker run -d -p 80 --name nginx nginx:v1
#宿主机任意端口映射到容器80端口
▪ docker port nginx
#查看实际映射的端口
▶ 网络故障排查
1.测试容器间连通性
docker exec -it box1 sh #进入容器内部
ping box2 #测试DNS解析
curl http://box2:80 #测试HTTP连接
2.抓包分析
docker run --rm --net=host nicolaka/netshoot tcpdump -i eth0 port 80
#在宿主机抓取容器流量
#nicolaka/netshoot是一个非常流行的网络调试工具镜像(网络工具箱)
内置tcpdump、ping、curl、nslookup、ss、ip等一堆排错工具
3.重置Docker网络
docker network prune #清理所有未使用的网络
systemctl restart docker #重启docker服务
▶ 网络驱动对比表
网络类型| 驱动名| 特点| 适用场景
---|---|---|---
Bridge| bridge| 默认 NAT 网络,端口映射| 单机容器通信
Host| host| 共享宿主机网络栈| 高性能场景
Macvlan| macvlan| 直接分配 MAC 地址| 容器需表现为局域网中一台独立主机
None| null| 完全无网络| 特殊隔离需求
▶ 经典问题解决方案
问题1:容器无法访问外网
1.检查DNS配置:
docker run --rm 容器名 cat /etc/resolv.conf
2.临时解决方案:运行容器时指定DNS:
docker run --dns=223.5.5.5 --rm 容器名 ping www.baidu.com
问题2:端口冲突
1.查看端口占用:
ss -tunlp #docker run运行指定的端口映射,宿主机端口可能被占用
2.修改容器映射端口:
docker run -d -p 81:80 --name nginx nginx:v1