设为首页 收藏本站
查看: 1671|回复: 0

[经验分享] Docker 1.10 RC 新网络 overlay 网络

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-1-26 09:03:11 | 显示全部楼层 |阅读模式
Overlay 网络

Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。

这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制,

支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。

因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。

Overlay网络的实现方式可以有许多种,其中IETF(国际互联网工程任务组)制定了三种Overlay的实现标准

1. 虚拟可扩展LAN(VXLAN)

2. 采用通用路由封装的网络虚拟化(NVGRE)

3. 无状态传输协议(SST)

Docker内置的Overlay网络是采用IETF标准的VXLAN方式,并且是VXLAN中普遍认为最适合大规模的云计算虚拟化环境的SDN Controller模式。


Docker的Overlay网络功能与其Swarm集群是紧密整合的,因此为了使用Docker的内置跨节点通信功能,最简单的方式就是采纳Swarm作为集群的解决方案。

在 docker 1.9 中,要使用 Swarm + overlay 网络架构,还需要以下几个条件:

1. 所有Swarm节点的Linux系统内核版本不低于3.16  (在 docker 1.10 RC 版本中,已经支持内核3.10,升级内核实在是一个麻烦事情)

2. 需要一个额外的配置存储服务,例如Consul、Etcd或ZooKeeper

3. 所有的节点都能够正常连接到配置存储服务的IP和端口

4. 所有节点运行的Docker后台进程需要使用『–cluster-store』和『-–cluster-advertise』参数指定所使用的配置存储服务地址


-------------------------------------------------------------------------------------------
服务器3台 如下:

10.6.17.12

10.6.17.13

10.6.17.14


------------------------------------------------------------------------------------------
docker version
Client:
Version:      1.10.0-rc1
API version:  1.22
Go version:   go1.5.3
Git commit:   677c593
Built:        Fri Jan 15 20:50:15 2016
OS/Arch:      linux/amd64

------------------------------------------------------------------------------------------
首先要做的是 修改主机名

10.6.17.12 管理节点可不修改


10.6.17.13  = hostnamectl --static set-hostname swarm-node-1

10.6.17.14  = hostnamectl --static set-hostname swarm-node-2


------------------------------------------------------------------------------------------



上面的4个条件中,第一个条件在docker 1.10 RC 版本中已经默认就满足了。

下面我们来创建第二个条件中的 配置存储服务,配置存储服务按照大家的使用习惯,自己选择一个配置存储。

由于我们java 项目一直在使用 ZooKeeper ,所以这边选择 ZooKeeper 作为存储服务,为了方便测试,这边只配置 单机的 ZooKeeper 服务


-------------------------------------------------------------------------------------------

pull 一个 centos 的镜像下来

[10.6.17.12]# docker pull centos


以下是 zookeeper 的 Dockerfile

-------------------------------------------------------------------------------------------
FROM centos

MAINTAINER ict@moxiangroup.com
USER root

# 添加erepo 源   
RUN rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org && rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

RUN yum -y install --enablerepo base wget java tar.x86_64 && mkdir -p /opt/local && wget -q -O - http://apache.fayea.com/zookeepe ... keeper-3.4.6.tar.gz | tar -xzf - -C /opt/local/ && mv /opt/local/zookeeper-3.4.6 /opt/local/zookeeper && cp /opt/local/zookeeper/conf/zoo_sample.cfg /opt/local/zookeeper/conf/zoo.cfg && mkdir -p /opt/local/zookeeper/data && mkdir -p /opt/local/zookeeper/log

ENV JAVA_HOME /usr/

ADD start.sh /start.sh

WORKDIR /opt/local/zookeeper

#修改配置文件
RUN sed -i 's/dataDir=\/tmp\/zookeeper/dataDir=\/opt\/local\/zookeeper\/data/g' /opt/local/zookeeper/conf/zoo.cfg

ENTRYPOINT ["/start.sh"]

# 保证前台运行  
CMD ["start-foreground"]
-------------------------------------------------------------------------------------------


[10.6.17.12]# docker build -t="zookeeper" .

[10.6.17.12]# docker run --restart=always -d -v /opt/data/zookeeper/data:/opt/local/zookeeper/data -v /opt/data/zookeeper/log:/opt/local/zookeeper/log -p 2181:2181 zookeeper


zookeeper 创建完以后,需要修改每个主机Docker后台进程启动脚本里的变量内容,并配置swarm节点.

[10.6.17.12]# sed -i 's/-H fd:\/\//-H tcp:\/\/10.6.17.12:2375 --cluster-store=zk:\/\/10.6.17.12:2181/store --cluster-advertise=10.6.17.12:2376/g' /lib/systemd/system/docker.service

[10.6.17.13]# sed -i 's/-H fd:\/\//-H tcp:\/\/10.6.17.13:2375 --cluster-store=zk:\/\/10.6.17.12:2181/store --cluster-advertise=10.6.17.13:2376/g' /lib/systemd/system/docker.service

[10.6.17.14]# sed -i 's/-H fd:\/\//-H tcp:\/\/10.6.17.14:2375 --cluster-store=zk:\/\/10.6.17.12:2181/store --cluster-advertise=10.6.17.14:2376/g' /lib/systemd/system/docker.service


修改完 变量内容,执行

systemctl daemon-reload   


并 重启 docker   

systemctl restart docker.service


由于修改和重启Docker后台进程本身是比较麻烦的事情,如果用户业务可能会使用到跨节点网络通信,建议在架设Docker集群的时候就事先准备配置存储服务,然后直接在添加主机节点时就可以将相应参数加入到Docker的启动配置中了。


接下来创建Overlay网络,我们要建的这个网络是横跨所有节点的,也就是说在每个节点都应该有一个名称、ID和属性完全一致的网络,它们之间还要相互认可对方为自己在不同节点的副本。如何实现这种效果呢?目前的Docker network命令还无法做到,因此只能借助于Swarm,下面我们创建Swarm 群集


首先我们选择 10.6.17.12 这台机器做为 master 节点 创建 swarm:

[10.6.17.12]# docker -H tcp://10.6.17.12:2375 run --name master --restart=always -d -p 8888:2375 swarm manage zk://10.6.17.12:2181/swarm


在其他两台Docker业务容器运行的节点上运行Swarm Agent服务:

[10.6.17.13]# docker -H tcp://10.6.17.13:2375 run --name node_1 --restart=always -d swarm join --addr=10.6.17.13:2375 zk://10.6.17.12:2181/swarm

[10.6.17.14]# docker -H tcp://10.6.17.14:2375 run --name node_2 --restart=always -d swarm join --addr=10.6.17.14:2375 zk://10.6.17.12:2181/swarm


查看所有节点上的信息:

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED                  STATUS                  PORTS               NAMES
5fc7753caa2c        swarm               "/swarm join --addr=1"   Less than a second ago   Up Less than a second   2375/tcp            swarm-node-1/node_1
330b964ba732        swarm               "/swarm join --addr=1"   Less than a second ago   Up Less than a second   2375/tcp            swarm-node-2/node_2


至此 swarm 集群已经搭建完成了。

Swarm提供与Docker服务完全兼容的API,因此可以直接使用docker命令进行操作。

注意上面命令中创建Master服务时指定的外部端口号8888,它就是用来连接Swarm服务的地址。


现在我们就可以创建一个Overlay类型的网络了:

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 network create --driver=overlay ovr0

这个命令被发送给了Swarm服务,Swarm会在所有Agent节点上添加一个属性完全相同的Overlay类型网络。

在每个节点上面 使用 docker network ls  可以查看 到已经有一个  ovr0  的 overlay 网络


在Swarm的网络里面,每个网络的名字都会加上节点名称作为前缀,
如: swarm-node-1/node_1   
   swarm-node-2/node_2

但Overlay类型的网络是没有这个前缀的,这也说明了这类网络是被所有节点共有的。


下面我们在Swarm中创建两个连接到Overlay网络的容器,并用Swarm的过滤器限制这两个容器分别运行在不同的节点上。

-------------------------------------------------------------------------------------------

FROM centos

MAINTAINER ict@moxiangroup.com

RUN yum -y update; yum clean all
RUN yum -y install epel-release; yum clean all
RUN yum -y install wget; yum clean all
ADD ./nginx.sh /root/
RUN /bin/bash /root/nginx.sh
RUN rm -rf /root/nginx.sh
RUN rm -rf /opt/local/nginx/conf/nginx.conf
ADD ./nginx.conf /opt/local/nginx/conf/
RUN mkdir -p /opt/local/nginx/conf/vhost
ADD ./docker.conf /opt/local/nginx/conf/vhost
RUN chown -R upload:upload /opt/htdocs/web
EXPOSE 80 443
CMD ["/opt/local/nginx/sbin/nginx", "-g", "daemon off;"]

-------------------------------------------------------------------------------------------


[10.6.17.12]# docker -H tcp://10.6.17.12:8888 run --name nginx_web_1 --net ovr0 --env="constraint:node==swarm-node-1" -d -v /opt/data/nginx/logs:/opt/local/nginx/logs nginx

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 run --name nginx_web_2 --net ovr0 --env="constraint:node==swarm-node-2" -d -v /opt/data/nginx/logs:/opt/local/nginx/logs nginx



创建完两个容器以后,下面来来测试一下 ovr0 这个网络的连通性

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 exec -it nginx_web_1 ping nginx_web_2

PING nginx_web_2 (10.0.0.3) 56(84) bytes of data.
64 bytes from nginx_web_2.ovr0 (10.0.0.3): icmp_seq=1 ttl=64 time=0.360 ms
64 bytes from nginx_web_2.ovr0 (10.0.0.3): icmp_seq=2 ttl=64 time=0.247 ms
64 bytes from nginx_web_2.ovr0 (10.0.0.3): icmp_seq=3 ttl=64 time=0.234 ms
64 bytes from nginx_web_2.ovr0 (10.0.0.3): icmp_seq=4 ttl=64 time=0.241 ms
64 bytes from nginx_web_2.ovr0 (10.0.0.3): icmp_seq=5 ttl=64 time=0.212 ms


如上所示 我们已经在Docker的Overlay网络上成功的进行了跨节点的数据通信。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-169599-1-1.html 上篇帖子: Docker系列一之Docker快速入门 下篇帖子: windows10/2016上使用docker 网络
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表