Docker 新網絡 overlay 網絡

Overlay網絡是指在不改變現有網絡基礎設施的前提下,經過某種約定通訊協議,把二層報文封裝在IP報文之上的新的數據格式。java

 

這樣不但可以充分利用成熟的IP路由協議進程數據分發,並且在Overlay技術中採用擴展的隔離標識位數,可以突破VLAN的4000數量限制,node

 

支持高達16M的用戶,並在必要時可將廣播流量轉化爲組播流量,避免廣播數據氾濫。linux

 

所以,Overlay網絡其實是目前最主流的容器跨節點數據傳輸和路由方案。nginx

 

Overlay網絡的實現方式能夠有許多種,其中IETF(國際互聯網工程任務組)制定了三種Overlay的實現標準web

 

1. 虛擬可擴展LAN(VXLAN)docker

 

2. 採用通用路由封裝的網絡虛擬化(NVGRE)apache

 

3. 無狀態傳輸協議(SST)centos

 

Docker內置的Overlay網絡是採用IETF標準的VXLAN方式,而且是VXLAN中廣泛認爲最適合大規模的雲計算虛擬化環境的SDN Controller模式。bash

 

 

Docker的Overlay網絡功能與其Swarm集羣是緊密整合的,所以爲了使用Docker的內置跨節點通訊功能,最簡單的方式就是採納Swarm做爲集羣的解決方案。服務器

 

在 docker 1.9 中,要使用 Swarm + overlay 網絡架構,還須要如下幾個條件:

 

1. 全部Swarm節點的Linux系統內核版本不低於3.16  (在 docker 1.10 後面版本中,已經支持內核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 jicki@qq.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/zookeeper/zookeeper-3.4.6/zookeeper-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 jicki@qq.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網絡上成功的進行了跨節點的數據通訊。

 

 

 

測試兩個 ssh 的服務,建立兩個 容器,查看容器所屬 IP 。

 

 

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 run --name ssh-1 --net ovr0 --env="constraint:node==swarm-node-1" -d -p 8001:22 ssh

 

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 run --name ssh-2 --net ovr0 --env="constraint:node==swarm-node-2" -d -p 8001:22 ssh

 

 

建立容器 IP 爲  DHCP 分配, 按照從下向上分配, 重啓不會改變overlay 的IP 。

 

首先建立 ssh-1 分配IP爲 10.0.0.4    建立 ssh-2 分配IP爲 10.0.0.5

 

銷燬 ssh-1 再次建立 分配IP 爲 10.0.0.4 

 

銷燬 ssh-1  ssh-2  先建立 ssh-2 分配 IP 爲 10.0.0.4  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在 docker 1.10 後面的版本中 --net-alias=[]  的使用!!

 

在docker run 的時候 可指定相同的 alias ,能夠實現 故障切換的效果。。

 

具體命令如:

 

[10.6.17.12]# docker -H tcp://10.6.17.12:8888 run --name nginx_web_1 --net ovr0 --net-alias="nginx" --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 --net-alias="nginx" --env="constraint:node==swarm-node-2" -d -v /opt/data/nginx/logs:/opt/local/nginx/logs nginx

 

當咱們進入 機器裏面的時候 使用 dig 查看 nginx A記錄 看到的是一個,可是 一個容器 掛掉之後

A記錄會自動綁定到另一臺機器中。

 

 

在 docker 1.11 後面的版本中 --net-alias=[] 已經支持 負載均衡。

 

當咱們使用 dig 查看 A記錄 時能夠看到多個 A記錄

 

 

 

 

docker network disconnect  與  docker network connect 命令的使用! 使用這兩個命令可達到 A B 測試 以及 快速 回滾 的效果。

 

docker network connect      ---->  加入 指定網絡

 

docker network disconnect   ---->  退出 指定網絡

 

 

具體命令使用:

 

docker network disconnect ovr0 nginx_web_2       nginx_web_2 這個容器退出 ovr0 這個網絡。

 

docker network connect ovr0 nginx_web_2          nginx_web_2 這個容器從新加入 ovr0 這個網絡。

相關文章
相關標籤/搜索