跨主机网络
libnetwork & CNM容器网络模型
Sandbox相当于eth0
Endpoint相当于veth pair
Network相当于docker0
Overlay
部署key-value数据库:docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
修改daemon配置文件:/etc/systemd/system/docker.service
--cluster-store=consul://192.168.56.101:8500 //指定consul的地址
--cluster-advertise=enp0s8:2376 //告知consul自己的连接地址
重启docker daemon:
systemctl daemon-reload
systemctl restart docker.service
创建overlay网络:docker network create -d overlay ov_net1 //SCOPE为global,创建时存储到consul,host2也能读取到
运行容器:docker run -itd --name bbox1 --network ov_net1 busybox //docker自动创建bridge网络docker_gwbridge,为所有连接到overlay网络的容器提供外网访问的能力。
查看容器网络配置:docker exec bbox1 ip r
在host2中运行bbox2:docker run -itd --name bbox2 --network ov_net1 busybox
直接ping bbox1:docker exec bbox2 ping -c 2 bbox1
在host1或host2上查看overlay的namespace:
ln -s /var/run/docker/netns /var/run/netns
ip netns
查看namespace中overlay网桥上的设备:ip netns exec 1-f4af9b33c0 brctl show
查看VXLAN配置:ip netns exec 1-f4af9b33c0 ip -d l show vxlan1 //VNI为256
macvlan
在host1和host2上打开网卡的混杂模式:
ip link set enp0s9 promisc on
ip link show enp0s9
创建macvlan网络:docker network create -d macvlan --subnet 172.16.86.0/24 --gateway 172.16.86.1 -o parent=enp0s9 mac_net1 //子网是实际规划的,网关是真实存在的
运行容器:
docker run -itd --name bbox1 --ip 172.16.86.10 --network mac_net1 busybox
docker run -itd --name bbox2 --ip 172.16.86.11 --network mac_net1 busybox //由于host1和host2中的mac_net1本质上是相互独立的,最好指定静态IP,防止自动分配冲突
macvlan无DNS服务。容器无需NAT和端口映射就能与外界通信。
查看容器的网络设备:docker exec bbox1 ip link //eth0@if4,eth0对应一个interface,即enp0s9
在host上查看网卡:ip link show enp0s9 //全局编号为4
Linux网卡支持VLAN:apt-get install vlan
enp0s9接在交换机的Trunk口,创建sub-interface,编辑/etc/network/interface:
auto enp0s9
iface enp0s9 inet manual
auto enp0s9.10
iface enp0s9.10 inet manual
vlan-raw-device enp0s9
auto enp0s9.20
iface enp0s9.20 inet manual
vlan-raw-device enp0s9
ifup enp0s9.10 //启用sub-interface
ifup enp0s9.20
创建macvlan网络:
docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=enp0s9.10 mac_net10
docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=enp0s9.20 mac_net20
在host1中运行容器:
docker run -itd --name bbox1 --ip 172.16.10.10 --network mac_net10 busybox
docker run -itd --name bbox2 --ip 172.16.20.10 --network mac_net20 busybox
在host2中运行容器:
docker run -itd --name bbox3 --ip 172.16.10.11 --network mac_net10 busybox
docker run -itd --name bbox4 --ip 172.16.20.11 --network mac_net20 busybox
将Host 192.168.56.101配置成虚拟路由器
启用IP Forwarding:
sysctl -w net.ipv4.ip_forward=1
sysctl net.ipv4.ip_forward
编辑/etc/network/interfaces配置并启用sub-interface:
auto eth2
iface eth2 inet manual
auto eth2.10
iface eth2.10 inet manual
vlan-raw-device eth2
auto eth2.20
iface eth2.20 inet manual
vlan-raw-device eth2
ifup eth2.10
ifup eth2.20
配置网关IP到sub-interface:
ifconfig eth2.10 172.16.10.1 netmask 255.255.255.0 up
ifconfig eth2.20 172.16.20.1 netmask 255.255.255.0 up
添加iptables:
iptables -t nat -A POSTSOURCING -o eth2.10 -j MASQUERADE
iptables -t nat -A POSTSOURCING -o eth2.20 -j MASQUERADE
iptables -A FORWARD -i eth2.10 -o eth2.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2.10 -o eth2.20 -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -j ACCEPT

浙公网安备 33010602011771号