前面说过了docker的基础网络bridge、host、none,可以解决单个容器的通信。今天来说跨网络的通信。我们继续用上一次的实验环境。

跨网路通信的手段主要有overlay、macvlan、weave等,今天主要说overlay和macvlan。

 

实验环境:  docker          192.168.1.10

host1          192.168.1.20
host2   192.168.1.30

 

一、overlay

实验步骤:
 

  1. 配置一个节点发现的工具,用来收集保存我们网络状态信息,这里用的consul
    # docker search consul
    # docker pull progrium/consul
  2. 启动容器
# docker run -dit --restart always -p 8500:8500 -p 8400:8400 -p 8600:53/udp --name consul progrium/consul -server -bootstrap -ui-dir /ui

  1. 参数解析:--restart 容器故障就尝试重启
              -p  端口映射
              -server -bootstrap -ui..   可以在浏览器管理容器
  2. 关闭三台主机的防火墙(仅限实验)
     
  3. 在consul主机中指定consul服务器
1.  #  vi /usr/local/systemcd/system/docker.server
  ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-  store=consul://192.168.0.120:8500 --cluster-advertise=ens33:2376
  1. 在其他主机上也指定consul服务器
1.  # vi /etc/systemd/system/docker.service.d/10-machine.conf
 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://192.168.0.120:8500 --cluster-advertise=ens33:2376
  1. 重启服务
    # systemctl daemon-reload && systemctl restart docker
    在浏览器的KEY/VALUE中可以看到发现的节点


    后来补上的图IP不对。
  2. 在host1或host2上创建一个overlay的网络,看看是否可以同步
1.  # docker-machine use host1
 [host1]# docker network create -d overlay my_ov1
 [host1]# docker network ls
 [host1]# docker-machine use host2
 [host2]# docker network ls
  1. 在两个节点上创建容器验证网络
    使用ping命令
1.  [host2]# docker run -dit --network my_ov1 busybox
 [host2]# docker-machine use host1
 [host1]# docker run -dit --network my_ov1 busybox
 [host1]#docker exec -it 3f ping 10.0.0.2
  1. 不同网段的overlay网络通信
    a、再创建一个overlay网络命名my_ov2,自定义网段
    b、启动一个容器,命名test1,使用my_ov2,
    c、把my_ov1网络加入到容器test1中,测试ping
1.  [host1]# docker network create -d voverlay --subnet 192.168.10.0/24 --gateway 192.168.10.1 my_ov2
 [host1]# docker run -dit --name test1 --network my_ov2 --ip 192.168.10.50 busybox
 [host1]# docker networl connect my_ov1 test1
 [host1]# docker exec -it test1 ping 10.0.0.2

二、macvlan

      同样的实验环境

  1. 先打开host1和host2的网卡混杂模式
    混杂模式:对于网关来说,是自己的网段就接收转发,不是就丢弃,开启了混在模式以后,不论是不是自己的网段都会接收, 然后由网络层判断,是递交上层,还是丢弃,还是交给下层转发
1.  [host1]# ip link set ens33 promisc on
 [host1]# ifconfig ens33
  1. 在host1上创建macvlan网络
[host1]# docker network create -d macvlan --subnet 192.168.20.0/24 --gateway 192.168.20.1 -o parent=ens33 mac_net1
 [host1]# docker run -dit --name test2 --ip 192.168.20.10 --network mac_net1 busybox

  1. [host1]# docker exec -it test1 ip a
  2. 在host2上创建macvlan网络,俩个节点应该一样,属于同一网络
1.  [host1]# docker-machine use host2
 [host2]# docker network create -d macvlan --subnet 192.168.20.0/24 --gateway 192.168.20.1 -o parent=ens33 mac_net1
 [host2]# docker run -dit --name test3 --ip 192.168.20.20 --network mac_net1 busybox
 [host2]# docker exec -it test3 ping 192.168.20.10
  1. 由于macvlan是基于网卡的mac地址,一个网卡默认只有一个mac地址,想要再创建第二个网络是不行的
  2. 通过macvlan实现多网络
        macvlan 本身是 linxu kernel 模块,功能是可以在同一个物理网卡上配置多个mac地址,也可以配置自己的IP,macvlan 本质上是一种网卡虚拟化技术。

macvlan 的最大优点是性能极好,相比其他实现,macvlan 不需要创建 Linux bridge,而是直接通过以太 interface 连接到物理网络。

[host2]# ip link add link ens33 name ens33.10 type vlan id 10
 [host2]# ip link add link ens33 name ens33.20 type vlan id 20
 [host2]# ip addr add 192.168.20.0/24 brd 192.168.20.255 dev ens33.10
 [host2]# ip addr add 192.168.30.0/24 brd 192.168.30.255 dev ens33.20
 [host2]# ip link set dev ens33.10 up
 [host2]# ip link set dev ens33.20 up
 [host2]# docker network create -d macvlan --subnet 192.168.100.0/24 --gateway 192.168.100.1 -o ens33.10 mac_net2
 [host2]# docker network ls

接下来就可以用这个虚拟网卡创建容器了!!!