GVKun编程网logo

docker 跨主机通信 - 手工版(docker跨主机通信解决方案)

12

如果您想了解docker跨主机通信-手工版的相关知识,那么本文是一篇不可错过的文章,我们将对docker跨主机通信解决方案进行全面详尽的解释,并且为您提供关于Docker-多主机通信、Docker实现

如果您想了解docker 跨主机通信 - 手工版的相关知识,那么本文是一篇不可错过的文章,我们将对docker跨主机通信解决方案进行全面详尽的解释,并且为您提供关于Docker - 多主机通信、Docker 实现跨主机互联、Docker 容器跨主机多网段通信解决方案、Docker 容器跨主机通信之:OVS+GRE的有价值的信息。

本文目录一览:

docker 跨主机通信 - 手工版(docker跨主机通信解决方案)

docker 跨主机通信 - 手工版(docker跨主机通信解决方案)

#A 主机 192.168.100.120#

在主机 A 中创建一个子网,范围是 10.52.100.2->10.52.100.254

docker network create --subnet=10.52.100.0/24 snake120

运行一个 centos7 的容器作为客户端

docker run --name centos -dit --network snake120 --ip 10.52.100.2 uhub.service.ucloud.cn/pub021/centos:7.4.1708

增加路由指向目标地址所在的宿主机,-net 目标 IP , gw 网关 IP , 默认 eth0 网卡

route add -net 10.52.121.0 netmask 255.255.255.0 gw 192.168.100.121

服务端开放转发规则,用于 B 主机向 A 主机通信

iptables -A FORWARD -j ACCEPT

#B 主机 192.168.100.121#

在主机 B 中创建一个子网,范围是 10.52.121.2->10.52.121.254

docker network create --subnet=10.52.121.0/24 snake121

运行一个目标服务

docker run --name nginx -dit --network snake121 --ip 10.52.121.10 uhub.service.ucloud.cn/pub021/nginx:1.17.10

服务端开放转发规则,用于 A 主机向 B 主机通信

iptables -A FORWARD -j ACCEPT

增加路由指向目标地址所在的宿主机,-net 目标 IP , gw 网关 IP , 默认 eth0 网卡 这个是为了可以从 B 主机向 A 主机主动发起通信,实现相互通信

route add -net 10.52.120.0 netmask 255.255.255.0 gw 192.168.100.120

Docker - 多主机通信

Docker - 多主机通信

Docker 多主机通信

Docker 容器指定自定义网段的固定 IP/ 静态 IP 地址

第一步:创建自定义网络

备注:这里选取了 172.172.0.0 网段,也可以指定其他任意空闲的网段

docker network create --subnet=172.172.0.0/16 docker-ice

注:docker-ice 为自定义网桥的名字,可自己任意取名。

第二步:在你自定义的网段选取任意 IP 地址作为你要启动的 container 的静态 IP 地址

备注:这里在第二步中创建的网段中选取了 172.172.0.10 作为静态 IP 地址。这里以启动 docker-ice 为例。

docker run -d --net docker-ice --ip 172.172.0.10 ubuntu:16.04

 

查看路由

ip route show|column -t

 

#v1 192.168.1.111

docker network create --subnet=172.15.1.0/16 docker-mimi1

route add -net 172.16.2.0 netmask 255.255.255.0 gw 192.168.1.112

route add -net 172.19.3.0 netmask 255.255.255.0 gw 192.168.1.244

docker run -it --net docker-mimi1 --ip 172.15.1.1 standard:1.0 /bin/bash

 

#v2 192.168.1.112

docker network create --subnet=172.16.2.0/16 docker-mimi2

route add -net 172.15.1.0 netmask 255.255.255.0 gw 192.168.1.111

route add -net 172.19.3.0 netmask 255.255.255.0 gw 192.168.1.244

docker run -it --net docker-mimi2 --ip 172.16.2.1 standard:1.0 /bin/bash

 

#v3 192.168.1.244

docker network create --subnet=172.19.3.0/16 docker-mimi3

route add -net 172.15.1.0 netmask 255.255.255.0 gw 192.168.1.111

route add -net 172.16.2.0 netmask 255.255.255.0 gw 192.168.1.112

docker run -it --net docker-mimi3 --ip 172.19.3.1 standard:1.0 /bin/bash

 

添加永久静态路由

#设置开机启动

#把写好的启动脚本 (route) 添加到目录 /etc/rc.d/init.d/

#chkconfig --add route

#chkconfig route on

# systemctl enable route

 

route file:

 

#!/bin/bash

#chkconfig: - 90 10

#description: 配置路由

 

route add -net 172.15.1.0 netmask 255.255.255.0 gw 192.168.1.111

route add -net 172.16.2.0 netmask 255.255.255.0 gw 192.168.1.112

Docker 实现跨主机互联

Docker 实现跨主机互联

  首先修改一台 docker 的默认网络段

  修改配置文件 /usr/lib/systemd/system/docker.service

 

  设置生效(重载配置文件并且重启)

systemctl daemon-reload
systemctl restart docker

  查看 ip

 

  修改另外一台 docker 的默认网段

  

  保证两台宿主机是可以互通的(ping)

  node1 启动一个容器

docker run -it --name node1 centos bash

 

  node2 也启动一个容器

docker run -it --name node1 centos bash

  PS:在容器内 ctrl+p+q 退出容器,容器不会退出

  在 node1 上面添加路由

route add -net 192.168.158.0/24 gw 192.168.56.11

  同理在 node2 上面添加路由

 

Docker 容器跨主机多网段通信解决方案

Docker 容器跨主机多网段通信解决方案

一、MacVlan
实现 Docker 的跨主机网络通信的方案有很多,如之前博文中写到的通过部署 Consul 服务实现 Docker 容器跨主机通信

Macvlan 工作原理:

Macvlan 是 Linux 内核支持的网络接口。要求的 Linux 内部版本是 v3.9–3.19 和 4.0+;
通过为物理网卡创建 Macvlan 子接口,允许一块物理网卡拥有多个独立的 MAC 地址和 IP 地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样;
物理网卡收到包后,会根据收到包的目的 MAC 地址判断这个包需要交给其中虚拟网卡。

当容器需要直连入物理网络时,可以使用 Macvlan。Macvlan 本身不创建网络,本质上首先使宿主机物理网卡工作在‘混杂模式’,这样物理网卡的 MAC 地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定 MAC 地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。

使用 Macvlan 注意:

  • 容器直接连接物理网络,由物理网络负责分配 IP 地址,可能的结果是物理网络 IP 地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题;
  • 宿主机上的某张网上需要工作在‘混乱模式’下;
  • 前面说到,工作在混乱模式下的物理网卡,其 MAC 地址会失效,所以,此模式中运行的容器并不能与外网进行通信,但是不会影响宿主机与外网通信;
  • 从长远来看 bridge 网络与 overlay 网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。

工作示意图:
Docker 容器跨主机多网段通信解决方案
二、配置实例
实例 1(实现容器基于 macvlan 的单网段跨主机通信)


实现效果:

两台 centos 7.3,分别运行着 docker 服务;
两台 docker 服务器创建相同的一个 MacVlan 网络,使 docker 服务器上的容器可以实现跨主机通信。

开始配置
1、第一台 docker 服务器配置如下

[root@docker01 ~]# ip link set ens33 promisc on             # 开启ens33网卡的混杂模式
[root@docker01 ~]# ip link show ens33      # 确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,''PROMISC'',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff
[root@docker01 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o pa
rent=ens33 mac_net1
#创建macvlan网络,指定网关、网段等信息,“-o”指定绑定在哪张网卡之上
[root@docker01 ~]# docker run -itd --name test1 --ip 172.22.16.10 --network mac_net1 busybox     # 基于新创建的macvlan网络运行一个容器,并指定其IP

确认运行的容器的 IP 地址

[root@docker01 ~]# docker exec test1 ip a     # 查看IP,确定以下标红与配置的一样
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:16:10:0a brd ff:ff:ff:ff:ff:ff
    inet ''172.22.16.10/24'' brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever

2、第二台 docker 服务器配置如下(与第一台 docker 服务器基本相似)

[root@docker02 ~]# ip link set ens33 promisc on       # 开启混杂模式
[root@docker02 ~]# ip link show ens33 
2: ens33: <BROADCAST,MULTICAST,''PROMISC'',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway=172.22.16.1 -o parent=ens33 mac_net1
#创建一个与第一台docker服务器的网段、网关相同的macvlan。并绑定到物理网卡上。
#为了可以直观的看出其他docker服务器上的macvlan和第这台是在同一个网段的。所以,建议设置的网络名称一样。
[root@docker02 ~]# docker run -itd --name test2 --ip 172.22.16.11 --network mac_net1 busybox
#运行一个容器,并指定是基于macvlan网络的
#注意,其IP地址不要与其他docker服务器上的容器IP地址冲突

确认运行的容器的 IP 地址

[root@docker02 ~]# docker exec test2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:16:10:0b brd ff:ff:ff:ff:ff:ff
    inet ''172.22.16.11/24'' brd 172.22.16.255 scope global eth0
       valid_lft forever preferred_lft forever

使用第二台 docker 服务器上的容器 test2 对第一台 docker 服务器上的容器 test1 进行 ping 测试
Docker 容器跨主机多网段通信解决方案
OK,跨主机的容器通信就通过 macvlan 实现了。由于使用混杂模式会造成物理网卡的 MAC 地址失效,所以容器并不能通过此模式进行与外网的通信。

实例 2(基于 macvlan 的跨主机网络多网段的解决方案)

实现的效果如下:

  • 两台 centos 7.3,分别运行着 docker 服务;
  • 每台宿主机创建了两个 MacVlan 网段供容器使用(172.10.16.0/24 和 172.20.16.0/24);
  • 第一台 docker 服务器上运行容器 test1 和 test2,第二台 docker 服务器运行容器 test3 和 test4。
  • 最终实现跨主机的同网段容器互相通信。

开始配置:
1、第一台 docker 服务器配置如下

[root@docker01 ~]# ip link set ens33 promisc on             # 开启ens33网卡的混杂模式
#也就是开启网卡的多个虚拟interface(接口)  
[root@docker01 ~]# ip link show ens33      # 确定查看的信息包含以下标红的字样
2: ens33: <BROADCAST,MULTICAST,''PROMISC'',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff
[root@docker01 ~]# modinfo 8021q
 #查看是否加载8021q模块,如果有信息返回,则表示该模块已经加载

modinfo 8021q 命令返回的信息如下
Docker 容器跨主机多网段通信解决方案

[root@docker01 ~]# modprobe 8021q     #若没有加载8021q模块,则执行此命令
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 network-scripts]# vim ifcfg-ens33  
                     ...................
BOOTPROTO=manual             # 将此配置项改为“manual”,也是手动的意思
[root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10             # 复制一份网卡配置文件,-p保留原本文件的属性
[root@docker01 network-scripts]# vim ifcfg-ens33.10 
BOOTPROTO=none 
NAME=ens33.10               #注意更改名称
DEVICE=ens33.10      #注意更改名称
ONBOOT=yes
IPADDR=192.168.10.11             # 给虚拟网卡设置一个IP
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
[root@docker01 network-scripts]# cp ifcfg-ens33.10 ifcfg-ens33.20 
[root@docker01 network-scripts]# vim ifcfg-ens33.20 
BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.20.10               #  注意,此处的IP与ens33.10并不在同一网段
PREFIX=24
GATEWAY=192.168.20.2
VLAN=yes
[root@docker01 network-scripts]# ifdown ens33;ifup ens33          #重启网卡,使更改生效
[root@docker01 network-scripts]# ifup ens33.10      # 启动该网卡
[root@docker01 network-scripts]# ifup ens33.20     # 启动
[root@docker01 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
#创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.10
[root@docker01 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#创建一个macvlan网络,给其定义一个网段、网关及绑定到ens33.20
#接下来分别基于刚刚创建的macvlan网络运行一个容器

2、第二台 docker 服务器配置如下(基本与第一台操作类似,要注意 IP 不要冲突)

[root@docker02 ~]# ip link set ens33 promisc on       # 开启混杂模式
[root@docker02 ~]# ip link show ens33 
2: ens33: <BROADCAST,MULTICAST,''PROMISC'',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff
[root@docker02 ~]# modinfo 8021q
返回信息可参考图一
[root@docker02 ~]# modprobe 8021q     #若没有加载8021q模块,则执行此命令
[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 network-scripts]# vim ifcfg-ens33 
            ...............#省略部分内容
BOOTPROTO=manual        
[root@docker02 network-scripts]# scp root@192.168.171.151:/etc/sysconfig/network-scripts/ifcfg-ens33.* .                 # 要注意后面的“.”
ifcfg-ens33.10                                                       100%  128    83.4KB/s   00:00    
ifcfg-ens33.20                                                       100%  124    75.0KB/s   00:00  
[root@docker02 network-scripts]# vim ifcfg-ens33.10 
BOOTPROTO=none
NAME=ens33.10
DEVICE=ens33.10
ONBOOT=yes
IPADDR=192.168.10.11           # 更改IP,以防和第一台冲突
PREFIX=24
GATEWAY=192.168.10.2
VLAN=yes
[root@docker02 network-scripts]# vim ifcfg-ens33.20 

BOOTPROTO=none
NAME=ens33.20
DEVICE=ens33.20
ONBOOT=yes
IPADDR=192.168.20.11
PREFIX=24
GATEWAY=192.168.20.2
VLAN=yes
[root@docker02 network-scripts]# ifdown ens33;ifup ens33         # 重启网卡 ,使配置生效
[root@docker02 network-scripts]# ifup ens33.10     # 启动网卡
[root@docker02 network-scripts]# ifup ens33.20
#接下来创建macvlan网络,与第一台docker服务器创建的网络一样
[root@docker02 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
[root@docker02 ~]# docker network create -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20 
[root@docker02 ~]# docker run -itd --name test3 --network mac_net10 --ip 172.10.16.11 busybox
[root@docker02 ~]# docker run -itd --name test4 --network mac_net20 --ip 172.20.16.21 busybox

配置至此,即可进行 ping 测试了,如果配置无误,则 test3 应该和 test1 互通(因为其都是基于 mac_net10 网络);test4 应该和 test2 互通(同理)。
但 test3 和 test1 不能和 test4 和 test2 互通(因为其不是基于同一个虚拟局域网)。
容器 test3 ping 容器 test1 测试(注意:若是使用 vmware 虚拟机进行测试,由于 vmware 的特性,需将其网络适配器改为 “桥接模式”,而不是 NAT 模式等。否则无法通信)
Docker 容器跨主机多网段通信解决方案
容器 test4 ping 容器 test2 测试:
Docker 容器跨主机多网段通信解决方案
至此,跨主机网络多网段已经实现,同样,各个容器无法与外网进行通信。若有耐心,还是建议阅读 docker 官方文档





Docker 容器跨主机通信之:OVS+GRE

Docker 容器跨主机通信之:OVS+GRE

一、概述

由于 docker 自身还未支持跨主机容器通信,需要借助 docker 网络开源解决方案

OVS

OpenVSwich 即开放式虚拟交换机实现,简称 OVS,OVS 在云计算领域应用广泛,值得我们去学习使用。

OpenVSwich

OpenVSwich 是一种开源软件,通过软件的方式实现二层交换机功能,专门管理多租赁云计算网络环境,提供虚拟网络中的访问策略、网络隔离、流量监控等。

既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识。

GRE 隧道

GRE 即通用路由协议封装,隧道技术是一种封装技术,将网络层协议(如 IP)的数据报文进行封装,使这些封装的数据报文能够在另一个网络层协议中传输。可以看作是一个虚拟点到点连接,所以建立隧道时,要配置好隧道源地址和目的地址。

 

二、基于 OVS+GRE 的大二层通信

实验环境

操作系统 主机 主机 ip 容器网段
ubuntu-16.04.4-server-amd64 主机 1 172.31.15.168 172.17.43.1/24
ubuntu-16.04.4-server-amd64 主机 2 172.31.4.143 172.17.42.1/24

 

 

 

 

示意图

 

修改 Docker0 的网络地址

编辑主机 1 上的 /etc/docker/daemon.json 文件,添加内容:

{ "bip": "172.17.43.1/24" }

 

编辑主机 2 上的 /etc/docker/daemon.json 文件,添加内容:

{ "bip":"172.17.42.1/24" }

 

重启 docker 服务

主机 1主机 2 上均执行如下命令重启 docker 服务以使修改后的 docker0 网段生效

systemctl restart docker

 

创建 ovs bridge

主机 1主机 2 操作:

安装 openvswitch

apt install -y openvswitch-switch

创建 bro 网桥

ovs-vsctl add-br br0

 

查看 bro 网桥

root@ubuntu:~# ifconfig br0
br0       Link encap:以太网  硬件地址 1e:cc:2c:52:13:42  
          BROADCAST MULTICAST  MTU:1500  跃点数:1
          接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:1 
          接收字节:0 (0.0 B)  发送字节:0 (0.0 B)

 

设置 gre 端口

将 gre0 接口加入到网桥 obr0, 远程 IP 写对端 IP(创建一个 GRE 隧道并添加到网桥中)

主机 1 执行:

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.4.143

注意:172.31.4.143 是主机 2 的 ip 地址。

 

主机 2 执行:

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.15.168

注意:172.31.15.168 是主机 1 的 ip 地址。

 

主机 1主机 2 操作:

# 将br0网桥加入docker0网桥
brctl addif docker0 br0
# 启动br0网桥
ip link set dev br0 up
# 启动docker0网桥
ip link set dev docker0 up
# 添加路由条目
ip route add 172.17.0.0/16 dev docker0

注意:由于主机 1 和主机 2 的网络掩码为 24,因此 16 位就可以包含这 2 个网络了。

 

查看网桥信息

root@ubuntu:~# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.0242f148614e    no        br0

 

启动容器测试

主机 1主机 2 操作:

docker run -itd --name test busybox /bin/sh

 

查看容器信息

主机 1 执行:

docker inspect test

输出:

...
            "Gateway": "172.17.43.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.43.2",
...

 

ping 主机 2 的 docker ip

root@ubuntu:~# ping 172.17.42.2 -c 2
PING 172.17.42.2 (172.17.42.2) 56(84) bytes of data.
64 bytes from 172.17.42.2: icmp_seq=1 ttl=63 time=0.505 ms
64 bytes from 172.17.42.2: icmp_seq=2 ttl=63 time=0.858 ms

--- 172.17.42.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.505/0.681/0.858/0.178 ms

 

主机 2 执行:

ping 主机 1 的 docker ip

root@ubuntu:~# ping 172.17.43.2 -c 2
PING 172.17.43.2 (172.17.43.2) 56(84) bytes of data.
64 bytes from 172.17.43.2: icmp_seq=1 ttl=63 time=1.90 ms
64 bytes from 172.17.43.2: icmp_seq=2 ttl=63 time=0.641 ms

--- 172.17.43.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.641/1.274/1.907/0.633 ms

 

 

本文参考链接:

https://blog.csdn.net/xialingming/article/details/83093031

 

关于docker 跨主机通信 - 手工版docker跨主机通信解决方案的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Docker - 多主机通信、Docker 实现跨主机互联、Docker 容器跨主机多网段通信解决方案、Docker 容器跨主机通信之:OVS+GRE的相关知识,请在本站寻找。

本文标签: