用Docker实现 overlay网络的

第一步在maste主机上安装docker

wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

软件仓库地址替换为:

sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

3、更新索引文件并安装

sudo yum makecache fast
sudo yum install docker-ce

相关网址

Docker官网:https://www.docker.com/

Docker官方文档:https://docs.docker.com/install/linux/docker-ce/centos/

然后修改主机名

 hostnamectl set-hostname master 其他那个也修改主机名随便起名

然后

1、安装 docker-machineMatser 上操作)

base=https://github.com/docker/machine/releases/download/v0.16.0 &&

curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&

install /tmp/docker-machine /usr/local/bin/docker-machine

执行文件被放到/usr/local/bin 中,执行 docker-mahine version 验证是否可用:

[root@localhost ~]# docker-machine version

出现下面这个说明成功了

docker-machine version 0.16.0, build 702c267f

2、自动补齐

为了得到更好的体验,可以安装 bash_completion_script,之后能够通过 tab 键补全

docker-mahine 子命令和参数。

先修改/etc/hosts,写入:

199.232.68.133 raw.githubusercontent.com

复制以下脚本在命令行终端执行:

base=https://raw.githubusercontent.com/docker/machine/v0.16.0

for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash

do

wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d

done

输入如下:

docker-machine-prompt.bash

docker-machine-wrapper.bash

docker-machine.bash

三个脚本文件放置到/etc/bash_completion.d 目录下。

将如下代码添加到~/.bashrc

PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

作用是设置 docker-machine 的命令行提示符,不过要等到部署完其他 host 才能看出效

果。

执行以下命令生效:

[root@localhost ~]# source /etc/bash_completion.d/docker-machine-prompt.bash

注意:Machine,就是运行 docker 的主机。创建 Machine” 指的就是把某一台宿主机连

接到 Master 上,以方便管理。

先执行 docker-machine ls 查看一下当前的 machine

[root@localhost ~]# docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS

当前还没有连接到 master docker 主机。创建两个 machine

10.10.84.254  10.10.84.69

3hosts 解析(所有主机上)

# cat /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

10.10.84.254 wc1

10.10.84.69 wc2

10.10.84.175 master

在创建 machine 要求能够无密码登录远程主机,以使 master 能免密码登录所有主机。

master 上操作

# ssh-keygen

#ssh-copy-id 10.10.84.254

# ssh-copy-id 10.10.84.69 

执行 docker-machine create 命令创建 wc1,因为是在普通的 Linux 操作系统中部署

docker,所以使用 generic 类型的 driver,其他 driver 可以参考文

https://docs.docker.com/machine/drivers/

--generic-ip-address 指定目标主机的 IP,并命名为 vm1

master 上操作)命令执行过程如下:

# docker-machine create --driver generic --generic-ip-address=10.10.84.254 wc1

总体的过程包括以下几个步骤:

通过 ssh 登录到远程主机。

安装 docker

拷贝证书。

配置 docker daemon

启动 docker

通过相同命令可以创建 vm2

# docker-machine create --driver generic --generic-ip-address=10.10.84.69 wc2

Docker Machine 也提供了一些子命令方便对各个主机节点进行管理。其中最常用的就

是无需登录到各个主机节点就能执行 docker 相关操作。

#docker-machine env vm1 显示访问 vm1 需要的所有环境变量:

在wc1进入这个目录可以到 查看 docker 的具体配置

/etc/systemd/system/docker.service.d/10-machine.conf 

 将如下代码添加到~/.bashrc

这个加到最后面 完成之后用source命令执行一下

PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '

作用是设置 docker-machine 的命令行提示符,不过要等到部署完其他 host 才能看出效

从环境变量中

根据提示,执行 eval $(docker-machine env wc1)

可以看到命令行提示符已经改变,因为之前在$HOME/.bashrc 中配置了 PS1='[\u@\h

\W$(__docker_machine_ps1)]\$ ',用于显示当前 docker 主机节点。

在此状态下执行的所docker 命令其效果都是在 vm1 上执行,例如启动一个

busybox 容器:

 #docker run -itd busybox

然后用docker ps 查看容器状态

在wc1上查看容器就可以看到容器也已经启动了

执行 eval $(docker-machine env wc2) 切换到 wc2

退出 wc1 或者 wc2 环境使用命令格式:eval $(docker-machine env -u)

执行 docker-machine upgrade 更新 docker 到最新版本,可以批量执行:

docker-machine upgrade wc1 wc2 即可批量更新

 执行 docker-machine config 查看 docker daemon 配置:

1.2 使用 overlay 实现跨主机网络通信

跨主机网络方案包括以下两种方式:

1docker 原生的 overlay macvlan

2)第三方方案:常用的包括 flannelweave calico.....

为支持容器跨主机通信,可以创建基于 VxLAN overlay 网络。VxLAN 可将二层数

据封装到 UDP 进行传输,提供与 VLAN 相同的以太网二层服务,但是拥有更强的扩展性

和灵活性。

Docerk overlay 需要一个 key-value 数据库用于保存网络状态信息,包括 Network

EndpointIP 等。ConsulEtcd ZooKeeper 都是 Docker 支持的 key-vlaue 数据库,此处

实验环境我们已经搭建好了

10.10.84.175 master  (安装conusul服务)

10.10.84.254 wc1

10.10.84.69 wc2

使用 Consul

docker 主机 wc1wc2上配置跨主机网络

方案,在 10.10.84.175master)上部署支持的组件,比如 Consul

最简单的方式是以容器方式运行 Consulmaster 104 上操作)

# docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -

server -bootstrap

先启动docker 然后在执行上面的命令

容器启动后,可通过 http://10.10.84.175:8500 访问 Consul

修改 wc1 wc2 docker daemon 的配置文件,如是手动安装 Docker 的则修改

/usr/lib/systemd/system/docker.service 文件。

不是手动修改就执行下面的

[root@host2 ~]# vi /etc/systemd/system/docker.service.d/10-machine.conf

--cluster-store=consul://10.10.84.175:8500 --cluster-advertise=ens33:2376

--cluster-store 指定 consul 的地址。

--cluster-advertise 告知 consul 服务器连接容器的地址或者网卡以及端口。

重启 docker daemon

systemctl daemon-reload

systemctl restart docker.service

Wc1 wc2 将自动注册到 Consul 数据库中 在浏览器上可以看到

创建 overlay 网络

wc1 中创建 overlay 网络 ov_net1

[root@vm1 ~]# docker network create -d overlay ov_net1

-d overlay 指定 driver overaly

docker network ls 查看当前网络:

注意到 ov_net1 SCOPE global,其他网络为 local

wc2 上查看存在的网络:

Wc2 上也能看到 ov_net1。因为创建 ov_net1 wc1 overlay 网络信息存入了

consulwc2 consul 读取到了新网络的数据。之后 ov_net1 的任何变化都会同步到 wc1

wc2

vm1 vm2 主机上查看 ov_net1 的详细信息:

#docker network inspect ov_net1

IPAM 是指 IP Address Managementdocker 自动为 ov_net1 分配的 IP 空间为

10.0.0.0/24

3、在 overlay 中运行容器

wc1 中运行一个 busybox 容器并连接到 ov_net1

[root@vm1 ~]# docker run -itd --name bbox1 -h bbox1 --network ov_net1 busybox

然后用进入这个容器查看IP

 docker exec -it 5360b819fdffc /bin/sh ip a 

bbox1 有两个网络接口 eth0 eth1eth0 IP 10.0.0.2,连接的是 overlay 网络

ov_net1eth1 IP 172.18.0.2,容器的默认路由是走 eth1eth1 是哪儿来的呢?

其实,docker 会创建一个 bridge 网络 “docker_gwbridge”,为所有连接到 overlay 网络的

容器提供访问外网的能力。

docker network inspect docker_gwbridge 输出可确认 docker_gwbridge IP 地址范围

172.18.0.0/16,当前连接的容器就是 bbox1172.18.0.2)。

容器 bbox1 可以通过 docker_gwbridge 访问外网。

 Ping百度可以ping通

docker exec bbox1 ping -c 2 www.baidu.com

如果外网要访问容器,可通过端口映射:

docker run -p 80:80 -d --network ov_net1 --name web1 httpd

然后用浏览器访问10.10.84.254:80

验证完外网的连通性,下边验证 overlay 网络跨主机通信

overlay 实现跨主机通信

wc2 中运行容器  busybox

[root@vm2 ~]# docker run -itd --name bbox2 -h bbox2 --network ov_net1 busybox

然后进入容器ping bbox1 查看容器于容器的联通性。可见 overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务

5overlay 网络的工作原理

docker 会为每个 overlay 网络创建一个独立的 network namespace(因此,不同的

overlay 网络是相互隔离的),其中有一个 linux 桥接网络 br0,以及一对 veth pair,一端连

接到容器中(即 eth0),另一端连接到的 br0 上。同时,br0 除了连接所有的 veth pair,还

连接一个 vxlan 设备,用于建立 vxlan tunnel,以实现容器之间的数据通信的

docker 默认为 overlay 网络分配 24 位掩码的子网(10.0.X.0/24),所有主机共享该

subnet,容器启动时会分配到 IP。当然也可以通过 --subnet 指定子网。

docker network create -d overlay --subnet 10.22.1.0/24 ov_net3

除了 overlaydocker 还开发了另一个支持跨主机容器网络的 drivermacvlan

macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址

分配给各个容器,即多个 interface,每个 interface 可以配置自己的 IP

macvlan 的最大优点是性能极好,相比其他实现,macvlan 不需要创建 Linux bridge

而是直接通过以太 interface 连接到物理网络

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博学咪AIGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值