Docker多主机网络
网络术语概念
1 2 3 4 | 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发。它解决了局域网中网段规划之后,网段中子网必须依赖路由器进行管理的局面 网桥(Brideg):工作在OSI七层网络模型的第二层,根据MAC地址转发,类似于二层交换机。Linux网桥将不同的网络接口连接起来,连接的网络接口可以来自不同的局域网,网桥决定了接收的数据包是转发给同一个局域网内逐级还是别的网络上 VLAN(虚拟局域网):在物理网络(通常是路由器接口)基础上建立一个或多少逻辑子网,将一个大广播域切分成多个小的广播域。一个VLAN就是一个广播域,VLAN之间通信通过三层路由器或者交换机来完成。 |
Overlay Network
1 2 3 4 5 6 7 8 | 覆盖网络,在基础网络上叠加一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来 Overlay网络有以下三种实现方式: VXLAN(Virtual Extensible Local Area Network,虚拟可扩展局域网),通过将物理服务器或虚拟机发出的数据包封装到UDP中,并使用物理网络的IP / MAC作为外层报文头进行封装,然后在IP网络上传输,到达目的地后由隧道端点解封装并将数据发送给目标物理服务器或虚拟机,扩展了大规模虚拟机网络通信。 由于VLAN Header头部限制长度是 12bit ,导致只能分配 4095 个VLAN,也就是 4095 个网段,在大规模虚拟网络。VXLAN标准定义Header限制长度 24bit ,可以支持 1600 万个VLAN,满足大规模虚拟机网络需求。 VXLAN有以下核心技术组成: NVE(Network Vritual Endpoint,网络虚拟端点):实现网络虚拟化功能。报文经过NVE封装转换后,NVE间就可基于三层基础网络建立二层虚拟化网络。 VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点):封装在NVE中,用于VXLAN报文的封装和解封装。 VNI(VXLAN Network Identifier,VXLAN网络标识 ID ):类似于VLAN ID ,用于区分VXLAN段,不同的VXLAN段不能直接二层 |
其他两种实现方式
1 2 3 4 | NVGRE(Network Virtual using Generic Routing Encapsulation,使用GRE虚拟网络):与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP / UDP),而是借助通用路由封装协议(GRE)。采用 24bit 标识二层网络分段,与VXLAN一样可以支持 1600 万个虚拟网络。 STT(Stateless Transport Tunneling,无状态传输隧道):模拟TCP数据格式进行封装,改造了TCP传输机制,不维护TCP状态信息。 Overlay Network 讲 |
Docker主机之间容器通信解决方案
1 2 3 4 5 6 7 8 9 10 11 12 | 桥接宿主机网络 端口映射 Docker网络驱动 - Overlay:基于VXLAN封装实现原生Overlay网络 - Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一个VLAN。容器接口直接连接Docker主机网卡接口,通过路由策略转发到另一台Docker主机 第三方网络项目 隧道方案 - Flannel:支持UPD和VXLAN封装传输方式 - Weave: 支持UDP(sleeve模式)和VXLAN(优先fastdp模式) - OpenSwitch: 支持VXLAN和GRE协议 路由方案 - CAlico: 支持BGP协议和IPIP隧道。每台宿主机作为虚拟路由,通过BGP谢谢实现不同主机容器间通信 |
部署前提
1 2 3 4 5 6 7 8 9 | Docker通过overlay网络驱动程序支持多主机容器网络通信。 要想使用Docker原生Overlay网络,需要满足以下任意条件: Docker运行在Swarm模式 使用键值存储的Docker主机集群 我们这里演示第二种,需要满足以下条件: 1. 集群中主机连接到键值存储,Docker支持Consul、Etcd和Zookeeper; 2. 集群中主机运行一个Docker守护进程; 3. 集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员; 4. 集群中Linux主机内核版本 3.12 + ,支持VXLAN数据包处理,否则可能无法通信。 |
部署
节点1 192.168.56.128 主机名 docker1 节点2 192.168.56.129主机名docker2
查看内核版本大于3.12即可
1 | uname - r |
安装只需要在一个节点安装即可(是一个命令直接可以使用)
1 2 3 | wget https: / / releases.hashicorp.com / consul / 0.9 . 2 / consul_0. 9.2_linux_amd64 . zip unzip consul_0. 9.2_linux_amd64 . zip mv consul / usr / bin / consul && chmod + x / usr / bin / consul |
启动
1 | nohup consul agent - server - bootstrap - ui - data - dir / var / lib / consul - client = 192.168 . 56.128 - bind = 192.168 . 56.128 &> / var / log / consul.log & |
日志跟踪
1 | tail - f / var / log / consul.log |
节点配置守护进程连接consul
1 | vi / lib / systemd / system / docker.service |
1 | ExecStart = / usr / bin / dockerd - H fd: / / - H tcp: / / 0.0 . 0.0 : 2375 - - cluster - store consul: / / 192.168 . 56.128 : 8500 - - cluster - advertise 192.168 . 56.128 : 2375 |
访问consul的web页面 http://192.168.56.128:8500
重启docker 修改了配置文件需要加载一下在重启
1 2 | systemctl daemon - reload service docker restart |
修改节点2的配置
1 | / lib / systemd / system / docker.service |
1 | ExecStart = / usr / bin / dockerd - H fd: / / - H tcp: / / 0.0 . 0.0 : 2375 - - cluster - store consul: / / 192.168 . 56.128 : 8500 - - cluster - advertise 192.168 . 56.129 : 2375 |
重启docker
PS:如果节点加入到swarm模式需要删除
1 | docker swarm leave |
查看
节点2上创建overlay网络
1 | docker network create - d overlay multi_host |
在节点1再次创建会报错,网络已经同步了
1 | Error response from daemon: network with name multi_host already exists |
查看网络
1 | docker network ls |
查看网络属性信息
1 | network inspect dc4cc9130f97 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | [ { "Name" : "multi_host" , "Id" : "dc4cc9130f971707d833450e87d93433029b97fcc0541bfbf7ae15a4db8293a5" , "Created" : "2018-12-21T18:22:05.983865969+08:00" , "Scope" : "global" , "Driver" : "overlay" , "EnableIPv6" : false, "IPAM" : { "Driver" : "default" , "Options" : {}, "Config" : [ { "Subnet" : "10.0.0.0/24" , "Gateway" : "10.0.0.1" } ] }, "Internal" : false, "Attachable" : false, "Ingress" : false, "ConfigFrom" : { "Network" : "" }, "ConfigOnly" : false, "Containers" : {}, "Options" : {}, "Labels" : {} } ] |
测试互通
节点1创建容器指定overlay网络
1 | docker run - it - - net = multi_host busybox |
节点2创建
正常可以ping通 本次测试没有通
Overlay工作流程
安装查看桥接的工具
1 | apt - get install bridge - utils |
使用命令查看
1 | brctl show |
命名空间管理overlay网络
1 | ln - s / var / run / docker / netns / / var / run / netns |
启动的容器busybox不退出另外打开一个终端输入命令ip netns ls
带-的是创建overlay网络时候创建的网络
显示的IP和容器内是完全一样的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2017-12-21 Python全栈day10(基本数据类型及其常用方法)
2017-12-21 Python全栈day10(运算符)
2017-12-21 Rsync文件同步机备份工具使用