前言:前面的部分一直都是單機跑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的網段信息。
工具