docker实战--跨虚拟机实现容器互联(网桥+ovs+weave)

Docker 从入门到实践(极客学院) 学习笔记

主机规划

主机名称IP网关
虚拟机(vm1)192.168.1.111/24192.168.1.1**(路由器)**
虚拟机(vm2)192.168.1.222/24192.168.1.1

网桥实现

物理网卡docker服务绑定到同一网桥。
在这里插入图片描述

  1. 新建一个网桥br0
  2. 将物理绑卡绑定到br0
  3. docker服务启动时 也指定网桥为 br0
  4. 为docker服务器 进行地址划分(防止ip冲突)

这样所有的容器的ip与docker服务器所在主机都在同一个网段,从而实现互联。

自定义网桥

# vm1上创建网桥 --- 1
### 此种方式在重启机器时,会丢失
[root@localhost jhs]# brctl addbr br0
[root@localhost jhs]# ifconfig br0 192.168.1.111 netmask 255.255.255.0


# vim1上创建网桥 ---- 永久有效
### a.复制ifcfg-en333文件 ---> ifcfg-br0
[root@vm1 network-scripts]# cd /etc/sysconfig/network-scripts
[root@vm1 network-scripts]# cp ifcfg-ens33 ifcfg-br0
#### b.修改ifcfg-br0
[root@vm1 network-scripts]# vim ifcfg-br0 
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes

IPADDR=192.168.1.111
NETMASK=255.255.255.0
GATEWAY=192.168.1.1

### c.将网桥绑定到物理网卡上
[jhs@vm1 ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
DEVICE=ens33
ONBOOT=yes

BRIDGE=br0

### d.查看网桥创建成功
[jhs@vm1 ~]$ ip addr
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:ba:4d:b9 brd ff:ff:ff:ff:ff:ff
8: br0:
 inet 192.168.1.111/24 brd 192.168.1.255 scope global noprefixroute br0
[jhs@vm1 ~]$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29ba4db9       no              ens33

地址划分

将本地的物理网卡绑定到新建的网桥之上。

为了防止docker创建的容器IP冲突,对ip地址进行划分:

vm1上的docker服务使用网桥配置:  -dr0 
	IP: 192.168.1.128/27 
	地址范围2: 即192.168.128.129~159

vm1上的docker服务使用网桥配置:  
	IP: 192.168.1.224/27 
	地址范围2: 即192.168.128.225~254

修改docker服务配置

[jhs@vm1 ~]$ vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://nfyf8ozp.mirror.aliyuncs.com"],
  "bridge":"br0",
   "fixed-cidr":"192.168.1.128/27"
}
[jhs@vm1 ~]$ systemctl restart docker

## 启动docker容器
[jhs@vm1 ~]$ docker restart cct1 cct2

### 查看网桥状态
[jhs@vm1 ~]$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29ba4db9       no              ens33
                                                        veth0bd151a
                                                        veth1972d74
                                                        
                                                       
### 进入容器cct2,查看ip地址
[jhs@vm1 ~]$ docker attach cct2
[root@32e9b264bb56 /]# ip addr
 29: eth0@if30: 192.168.1.129/24

这里有一些问题:就是ip的子网掩码是/24 待研究。


Open vSwitch实现

在这里插入图片描述
将vos网桥obr1 注册为docker容器的网桥br1 的接口。 再通过通用隧道技术连接,直接发起访问。

  1. 建立ovs网桥
  2. 添加gre连接
  3. 配置docker容器虚拟网桥
  4. 为虚拟网桥添加ovs接口
  5. 添加不同docker容器网段路由

配置虚拟网桥br1

#1. 新建虚拟网桥
[root@vm1 openvswitch]# brctl addbr br1

#2. 配置虚拟网桥地址
[root@vm1 openvswitch]# ifconfig br1 172.17.1.0 netmask 255.255.255.0

#3. 配置docker容器网桥信息
[root@vm1 openvswitch]# vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://nfyf8ozp.mirror.aliyuncs.com"],
   "bridge": "br1"
}

#4. 重启docker服务,并重启docker容器
[root@vm1 openvswitch]# systemctl restart docker
[root@vm1 openvswitch]# docker restart cct1

#5. 查看容器新分配的ip地址
[root@vm1 openvswitch]# docker exec cct1 ip addr
 172.17.1.2/24
 
#6. 接下来同理,为vm2创建虚拟网桥br2,配置网段为172.17.2.0/24,
### 配置docker容器默认网桥为br2,然后创建容器vm2_cct1,
### 此时vm2中,查看新建容器的ip地址
[root@vm2 docker]# docker run -it --name vm2_cct1 jhs/cct
[root@93e702ef918d /]# ip addr
 172.17.2.2/24
 
#在vm1的容器 cct1内,
[root@c3b34f281e52 /]# ping 192.168.1.222  #ping vm2 成功
[root@c3b34f281e52 /]# ping 172.17.2.2   #ping vm2上vm2_cct1 不通

#7. 在vm1主机上添加路由信息:
### 访问 172.17.2.0/16网段的请求,通过vm2 192.168.1.222路由转发
[root@vm1 docker]# ip route add 172.17.2.0/24  via 192.168.1.222

#8. 重新ping vm2上vm2_cct1 ---成功
[root@vm1 docker]# docker attach cct1 
[root@c3b34f281e52 /]# ping 172.17.2.2

删除网桥前,往往需要使网桥下线:

ip link set dev docker0 down

brctl delbr docker0

疑惑: 上述步骤已经可以实现容器间互联了,仿佛不需要ovs

配置ovs网桥

#1.vm1创建ovs网桥 ---obr1
[jhs@vm1 ~]$ sudo ovs-vsctl add-br obr1

#2. obr1 上创建接口
### 定义虚拟接口名称 
### 指定接口类型为gre
[root@vm1 openvswitch]# ovs-vsctl add-port obr1 gre1 -- set interface gre1 type=gre option:remote_ip=192.168.1.222

[root@vm1 openvswitch]# ovs-vsctl show
5a41ab52-168b-4d79-8077-6a9ec545bec9
    Bridge "obr1"
        Port "gre1"
            Interface "gre1"
                type: gre
                options: {remote_ip="192.168.1.222"}
        Port "obr1"
            Interface "obr1"
                type: internal
    ovs_version: "2.12.0"
    
    
   
#3. 为虚拟网桥添加ovs接口
[root@vm1 docker]# brctl addif br1 obr1
[root@vm1 docker]# brctl show
bridge name     bridge id               STP enabled     interfaces
br1             8000.06cdb02dff1b       no              obr1
                                                        veth6f945c2
  

Weave实现

weave

weave通过在docker集群的每个主机上启动虚拟路由器,将主机作为路由器,形成互联互通的网络拓扑,在此基础上,实现容器的跨主机通信。其主机网络拓扑参见下图:

在这里插入图片描述

####################### vm1 上安装
#1.下载,并将它存放在/usr/local/bin/weave 
[root@vm1 docker]# sudo wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave 

#2. 修改weve权限,使它可以执行
[root@vm1 bin]# chmod a+x weave 

#3. 启动weave
#### 类似docker拉取镜像, 
[root@vm1 bin]# weave launch


#4. docker ps 可以查看到weave已经启动容器
[root@vm1 bin]# docker ps -l
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS               NAMES
a2dac48c39e8        weaveworks/weave:latest   "/home/weave/weaver …"   2 minutes ago       Up 2 minutes                            weave


####################### vm2 上安装(略...)
#5. vm2上启动weave,
### 制定远程机器vm1的:ip
[root@vm2 bin]# weave launch 192.168.1.111
fc37b4a9e618544c8116fd6f141965f3bfeb2270f64e43292e5d2a3c1ad13f55

#6. vm2上启动容器。
[root@vm2 bin]# docker run -it jhs/cct
[root@1149714622be /]#

#7. weave为上述的容器配置网络
[root@vm2 bin]# weave attach 10.2.0.22/24 1149714622be
10.2.0.22

#8. 查看容器的网络配置
[root@vm2 bin]# docker exec 1149714622be ip addr
18: ethwe@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state 
    inet 10.2.0.22/24 brd 10.2.0.255 scope global ethwe
### 多了一个 ethwe网卡: 地址就是刚刚命令配置的地址

###################### vm1 上启动容器
#9. vm1 启动容器
[root@vm1 bin]# docker run -it --name cct111 jhs/cct

#10 vm1 为容器配置weave地址
[root@vm1 bin]# weave attach 10.2.0.33/24 cct111
10.2.0.33

################ 查看两容器是否互通
#11. 进入 vm1, cct111(10.2.0.33) 访问 vm2容器1149714622be(10.2.0.22)
[root@vm1 bin]# docker attach cct111
[root@86db6808a37b /]# ping 10.2.0.22
PING 10.2.0.22 (10.2.0.22) 56(84) bytes of data.
64 bytes from 10.2.0.22: icmp_seq=1 ttl=64 time=2.35 ms

#11. 进入 vm2容器1149714622be(10.2.0.22), 访问 vm1的容器cct111(10.2.0.33) 
[root@vm2 bin]# docker exec 1149714622be ping 10.2.0.22
PING 10.2.0.22 (10.2.0.22) 56(84) bytes of data.
64 bytes from 10.2.0.22: icmp_seq=1 ttl=64 time=0.047 ms

注意:

如下命令启动容器,在weave 2.0 之后不再支持:[root@vm2 bin]# c2=$(weave run 10.0.1.2/24 -it jhs/cct)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值