Docker 新网络 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 后面版本中,已經支持內核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 這個網絡。
轉載于:https://www.cnblogs.com/jicki/p/5548610.html
總結
以上是生活随笔為你收集整理的Docker 新网络 overlay 网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 中类的内存布局
- 下一篇: 关于模板页调用js的问题