跨主机网络

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

 

posted @ 2018-04-17 16:02  AaronCnblogs  阅读(219)  评论(0)    收藏  举报