容器跨主机通信
1、macvlan方式
场景1:
容器分配在docker管理的vlan中无法与宿主机互通,无法上外网,只能与同vlan中容器通信
一个macvlan只能绑定一个物理接口
环境信息:192.167.86.5,192.168.86.7
192.167.86.5操作如下:
docker network create -d macvlan --subnet=172.18.1.0/24 --gateway=172.18.1.1 -o parent=eth0 macvlan_net
docker run -itd --name test-1 --net macvlan_net --ip=172.18.1.10 alpine:latest
参数解释:
-d macvlan 指定创建网络类型
--subnet= 指定子网
-gateway 指定网关
-o parent=eth0 指定宿主机物理接口
macvlan_net 创建子网
192.167.86.7操作如下:
docker network create -d macvlan --subnet=172.18.1.0/24 --gateway=172.18.1.1 -o parent=eth0 macvlan_net
docker run -itd --name test-2 --net macvlan_net --ip=172.18.1.20 alpine:latest
测试:
docker exec -it test-1 ping 172.18.1.20
docker exec -it test-1 ping 192.168.86.7
docker exec -it test-1 ping baidu.com
docker exec -it test-2 ping 172.18.1.10
docker exec -it test-1 ping 192.168.86.5
docker exec -it test-1 ping baidu.com
清理测试环境
docker rm -f test-1
docker rm -f test-2
docker network rm macvlan_net
场景2:
环境信息:192.167.86.5,192.168.86.7
设置macvlan子网和宿主机完全同网段,容器和同网段其他设备互通,但是无法和宿主机互通(走的是本地的路由器)
192.168.86.5操作如下:
docker network create -d macvlan --subnet=192.168.86.0/24 --gateway=192.168.86.2 -o parent=eth0 macvlan_host_net
docker run -itd --name test-1 --net macvlan_host_net --ip=192.168.86.111 alpine:latest
192.168.86.7操作如下:
docker network create -d macvlan --subnet=192.168.86.0/24 --gateway=192.168.86.2 -o parent=eth0 macvlan_host_net
docker run -itd --name test-2 --net macvlan_host_net --ip=192.168.86.111 alpine:latest
测试:
docker exec -it test-1 ping 192.168.86.111
docker exec -it test-1 ping 192.168.86.7
docker exec -it test-1 ping baidu.com
docker exec -it test-2 ping 192.168.86.222
docker exec -it test-2 ping 192.168.86.5
docker exec -it test-2 ping baidu.com
2、多macvlan
场景:192.168.86.5、192.168.86.7
1、192.168.86.5操作
1、创建vlan id为50的vlan
ip link add link eth0 name eth0.50 type vlan id 50
ip addr 可以查看到vlan相关接口
2、docker创建macvlan网络(物理接口为vlanid的网卡eth0.50)
docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=eth0.50 macvlan_net99
docker run -itd --name test-1 --net macvlan_net99 --ip=172.99.0.88 alpine:latest
2、192.168.86.7操作
1、创建vlan id为50的vlan
ip link add link eth0 name eth0.50 type vlan id 50
ip addr 可以查看到vlan相关接口
2、docker创建macvlan网络(物理接口为vlanid的网卡eth0.50)
docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=eth0.50 macvlan_net99
docker run -itd --name test-2 --net macvlan_net99 --ip=172.99.0.99 alpine:latest
三、openvswitch方式
环境:centos7 192.168.86.5(172.17.1.1/24)、192.168.86.7(172.17.2.1/24)
每台机器都操作
1、修改docker默认网段
cat /etc/docker/daemon.json
{
"bip":"172.17.1.1/24"
}
cat /etc/docker/daemon.json
{
"bip":"172.17.2.1/24"
}
2、安装openvswitch
yum install wget openssl-devel python-sphinx gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel gcc-c++ python-six unbound unbound-devel -y
wget https://www.openvswitch.org/releases/openvswitch-2.11.0.tar.gz
mkdir -p ~/rpmbuild/SOURCES
mv openvswitch-2.11.0.tar.gz rpmbuild/SOURCES/
cd rpmbuild/SOURCES/
tar -xf openvswitch-2.11.0.tar.gz
rpmbuild -bb --nocheck openvswitch-2.11.0/rhel/openvswitch-fedora.spec
yum -y localinstall rpmbuild/RPMS/x86_64/openvswitch-2.11.0-1.el7.x86_64.rpm
systemctl start openvswitch.service
systemctl enable openvswitch.service
ovs-vsctl --version
3、创建网桥并激活
ovs-vsctl add-br br0
ip link set dev br0 up
192.168.86.5操作
4、将gre虚拟接口接入网桥br0,并设置接口类型和对端ip地址(远程ip地址指定对端)
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.86.7
5、添加docker0网桥到ovs网桥br0
yum -y install bridge-utils
brctl addif docker0 br0
6、添加静态路由
ip route add 172.17.0.0/16 dev docker0
192.168.86.7操作
7、将gre虚拟接口接入网桥br0,并设置接口类型和对端ip地址(远程ip地址指定对端)
ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.86.5
8、添加docker0网桥到ovs网桥br0
brctl addif docker0 br0
9、添加静态路由
ip route add 172.17.0.0/16 dev docker0
10、验证互通
11、工作原理