docker network

前言:前面的部分一直都是單機跑docker,但實際生產環境不可能只用一臺來跑。確定會用到多臺,由於他們都是內部私有ip,那麼多臺主機之間的容器如何通訊?這個是個很頭疼的問題!目前主流幾種方法以下:
一、使用路由機制打通網絡
二、使用Open vSwitch(OVS)打通網絡
三、使用flannel來打通網絡
四、使用Quagga來實現自動學習路由

第一種:使用路由機制打通網絡
使用linux的路由來打通網絡
優勢:

linux

  • 常規路由技術
  • 使用傳統網絡技術
  • 簡單
  • 高性能


缺點:

git

  • 與現有網絡融爲一體
  • 靈活性低


如今有兩臺Docker實例:
 github

 




具體如圖,由於Docker默認的內部ip爲172.17.42網段,因此必需要修改其中一臺的默認網段以避免ip衝突。
#vim /etc/sysconfig/docker-network

DOCKER_NETWORK_OPTIONS= --bip=172.18.42.1/16 -H fd:// -H=unix:///var/run/docker.sock

#systemctl daemon-reload
#reboot
 docker

 



ok。如今就能夠開始操做了。
其實就是執行兩臺route add命令
docker 130上執行 route add -net 172.18.0.0/16 gw 192.168.18.128
docker 128上執行 route add -net 172.17.0.0/16 gw 192.168.18.130
ok,如今兩臺宿主機裏的容器就能夠通訊了。


第二種:使用Open vSwitch(OVS)打通網絡
是一種主流的虛擬化大二層技術
優勢:

vim

  • 靈活
  • 對現有物理網絡沒要求
  • 業界主流


缺點:

安全

  • 軟件封裝致使性能降低
  • 複雜度相對較高
  • 排錯難度高


流程圖以下:
 
 bash

 

 




首先安裝ovs的rpm包

file:///C:/Users/Don/Documents/My%20Knowledge/temp/d12921d0-891e-4a7f-9f37-4addd92a86fc_128_files/267978203.png

# yum install openvswitch-2.4.0-1.x86_64.rpm    #安裝軟件包
# /etc/init.d/openvswitch restart               #重啓服務
# /etc/init.d/openvswitch status                #查看狀態


安裝網橋管理工具

#yum -y install bridge-utils

配置網絡
ovs-vsctl add-br br0
ovs-vsctl add-port br0 gre1 -- set interface gre1 type=gre option:remote_ip=192.168.18.128
#添加br0到本地docker0,使得容器流量經過ovs流經tunnel
brctl addif docker0 br0

ip link set dev br0 up
ip link set dev docker0 up
iptables -t nat -F; iptables -F
ip route add 172.17.0.0/16 dev docker0


其他節點一樣的配置,注意ip地址便可。


第三種:使用flannel來打通網絡
新設計的Flannel,一種結合了路由機制與隧道技術
原理:每一個主機配置一個ip段和子網個數。例如,能夠配置一個覆蓋網絡使用 10.100.0.0/16段,每一個主機/24個子網。所以主機a能夠接受10.100.5.0/24,主機B能夠接受10.100.18.0/24的包。flannel使用etcd來維護分配的子網到實際的ip地址之間的映射。對於數據路徑,flannel 使用udp來封裝ip數據報,轉發到遠程主機。選擇UDP做爲轉發協議是由於他能穿透防火牆。例如,AWS Classic沒法轉發IPoIP or GRE 網絡包,是由於它的安全組僅僅支持TCP/UDP/ICMP。
下圖解釋了數據報經過覆蓋網絡轉發的路線:
 
網絡

 

部署也不是很複雜,僅須要etcd和flannel兩項支持便可。
etcd通常部署在單獨機器上,那麼flannel就部署在docker節點上,每一個docker節點上都需部署。
一、部署etcd,假設地址爲192.168.1.121
yum -y install etcd                                                            #安裝軟件包
vim /etc/etcd/etcd.conf                                                        #修改配置文件
修改成以下:(默認只監聽本地迴環地址)
    ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
    ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
systemctl restart etcd                                                         #重啓服務
etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'          #添加一條網絡配置記錄,這個配置將用於flannel分配給每一個Docker的虛擬IP地址段


二、部署flannel

https://github.com/coreos/flannel/releases 下載最新穩定版本,這裏以0.5.5版本爲例。
tar zxf flannel-0.5.5-linux-amd64.tar.gz      #解壓文件
cp flannel-0.5.5/* /usr/bin/                  #拷貝可執行文件至系統變量path


使用systemd來管理flannel服務

vim /usr/lib/systemd/system/flanneld.service

[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/flanneld
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=/usr/bin/flanneld -etcd-endpoints=${FLANNEL_ETCD} $FLANNEL_OPTIONS
[Install]
RequiredBy=docker.service
WantedBy=multi-user.target


設置etcd地址

vim /etc/sysconfig/flanneld
FLANNEL_ETCD= "http://192.168.1.121:2379"


因爲flannel將覆蓋docker0網橋,因此若是Docker服務已啓動,則中止Docker服務

編寫flannel啓動腳本,並加入自啓動
vim /etc/init.d/start_flannel.sh
#!/bin/bash
systemctl stop docker                     #中止docker服務
systemctl restart flanneld                #啓動flannel服務
mk-docker-opts.sh -i                      #生成環境變量
source /run/flannel/subnet.env            #將環境變量生效
ifconfig docker0 ${FLANNEL_SUBNET}        #設置docker0的網卡ip
systemctl start docker                    #啓動docker服務



ok,如今跨主機容器間已經能夠通訊。


第四種:使用Quagga來實現自動學習路由

其實這種方式是基於第一種方式的路由技術,只不過路由信息不須要本身手動添加,而是自動學習。試想一下,若是有10臺docker,那麼每臺docker就須要手動寫9條路由信息,是否是很慘?
Linux上安裝路由器的軟件名爲Quagga,它能夠配置不少種企業級的動態路由協議。我使用的是RIPV2和OSPF同時開啓,但安裝Quagga的方法和配置命令,太過於繁瑣。因此網上有大神將其Docker化了。

下載Quagga鏡像:
docker pull index.alauda.cn/georce/router



備用地址:http://pan.baidu.com/s/1sj26X8T
特別須要注意的是:docker0的網段不能同樣,因此須要修改docker的子網地址,參考第一種的設置辦法
運行鏡像:
docker run -itd --name=router --privileged --net=host index.alauda.cn/georce/router


執行 ip route 查看下路由表,已有別的docker0的網段信息。
 
工具

 

相關文章
相關標籤/搜索