前面说过了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
实验步骤:
- 配置一个节点发现的工具,用来收集保存我们网络状态信息,这里用的consul
# docker search consul
# docker pull progrium/consul - 启动容器
# docker run -dit --restart always -p 8500:8500 -p 8400:8400 -p 8600:53/udp --name consul progrium/consul -server -bootstrap -ui-dir /ui
参数解析:--restart 容器故障就尝试重启
-p 端口映射
-server -bootstrap -ui.. 可以在浏览器管理容器- 关闭三台主机的防火墙(仅限实验)
- 在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
- 在其他主机上也指定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
- 重启服务
# systemctl daemon-reload && systemctl restart docker
在浏览器的KEY/VALUE中可以看到发现的节点
后来补上的图IP不对。 - 在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
- 在两个节点上创建容器验证网络
使用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
- 不同网段的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
同样的实验环境
- 先打开host1和host2的网卡混杂模式
混杂模式:对于网关来说,是自己的网段就接收转发,不是就丢弃,开启了混在模式以后,不论是不是自己的网段都会接收, 然后由网络层判断,是递交上层,还是丢弃,还是交给下层转发
1. [host1]# ip link set ens33 promisc on
[host1]# ifconfig ens33
- 在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
[host1]# docker exec -it test1 ip a- 在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
- 由于macvlan是基于网卡的mac地址,一个网卡默认只有一个mac地址,想要再创建第二个网络是不行的
- 通过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
接下来就可以用这个虚拟网卡创建容器了!!!