docker network
前言:前面的部分一直都是單機(jī)跑docker,但實(shí)際生產(chǎn)環(huán)境不可能只用一臺(tái)來(lái)跑。肯定會(huì)用到多臺(tái),因?yàn)樗麄兌际莾?nèi)部私有ip,那么多臺(tái)主機(jī)之間的容器如何通信?這個(gè)是個(gè)很頭疼的問(wèn)題!目前主流幾種方法如下:
1、使用路由機(jī)制打通網(wǎng)絡(luò)
2、使用Open vSwitch(OVS)打通網(wǎng)絡(luò)
3、使用flannel來(lái)打通網(wǎng)絡(luò)
4、使用Quagga來(lái)實(shí)現(xiàn)自動(dòng)學(xué)習(xí)路由
第一種:使用路由機(jī)制打通網(wǎng)絡(luò)
使用linux的路由來(lái)打通網(wǎng)絡(luò)
優(yōu)點(diǎn):
- 常規(guī)路由技術(shù)
- 使用傳統(tǒng)網(wǎng)絡(luò)技術(shù)
- 簡(jiǎn)單
- 高性能
缺點(diǎn):
- 與現(xiàn)有網(wǎng)絡(luò)融為一體
- 靈活性低
現(xiàn)在有兩臺(tái)Docker實(shí)例:
?
?
具體如圖,因?yàn)镈ocker默認(rèn)的內(nèi)部ip為172.17.42網(wǎng)段,所以必須要修改其中一臺(tái)的默認(rèn)網(wǎng)段以免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
?
?
ok。現(xiàn)在就可以開(kāi)始操作了。
其實(shí)就是執(zhí)行兩臺(tái)route add命令
docker 130上執(zhí)行 route add -net 172.18.0.0/16 gw 192.168.18.128
docker 128上執(zhí)行 route add -net 172.17.0.0/16 gw 192.168.18.130
ok,現(xiàn)在兩臺(tái)宿主機(jī)里的容器就可以通信了。
第二種:使用Open vSwitch(OVS)打通網(wǎng)絡(luò)
是一種主流的虛擬化大二層技術(shù)
優(yōu)點(diǎn):
- 靈活
- 對(duì)現(xiàn)有物理網(wǎng)絡(luò)沒(méi)要求
- 業(yè)界主流
缺點(diǎn):
- 軟件封裝導(dǎo)致性能下降
- 復(fù)雜度相對(duì)較高
- 排錯(cuò)難度高
流程圖如下:
?
?
?
?
首先安裝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? ?? ?? ?? ?? ?#重啟服務(wù)
# /etc/init.d/openvswitch status? ?? ?? ?? ?? ? #查看狀態(tài)
安裝網(wǎng)橋管理工具
#yum -y install bridge-utils
配置網(wǎng)絡(luò)
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,使得容器流量通過(guò)ovs流經(jīng)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
其余節(jié)點(diǎn)同樣的配置,注意ip地址即可。
第三種:使用flannel來(lái)打通網(wǎng)絡(luò)
新設(shè)計(jì)的Flannel,一種結(jié)合了路由機(jī)制與隧道技術(shù)
原理:每個(gè)主機(jī)配置一個(gè)ip段和子網(wǎng)個(gè)數(shù)。例如,可以配置一個(gè)覆蓋網(wǎng)絡(luò)使用 10.100.0.0/16段,每個(gè)主機(jī)/24個(gè)子網(wǎng)。因此主機(jī)a可以接受10.100.5.0/24,主機(jī)B可以接受10.100.18.0/24的包。flannel使用etcd來(lái)維護(hù)分配的子網(wǎng)到實(shí)際的ip地址之間的映射。對(duì)于數(shù)據(jù)路徑,flannel 使用udp來(lái)封裝ip數(shù)據(jù)報(bào),轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī)。選擇UDP作為轉(zhuǎn)發(fā)協(xié)議是因?yàn)樗艽┩阜阑饓Α@?#xff0c;AWS Classic無(wú)法轉(zhuǎn)發(fā)IPoIP or GRE 網(wǎng)絡(luò)包,是因?yàn)樗陌踩M僅僅支持TCP/UDP/ICMP。
下圖解釋了數(shù)據(jù)報(bào)通過(guò)覆蓋網(wǎng)絡(luò)轉(zhuǎn)發(fā)的路線:
?
?
部署也不是很復(fù)雜,僅需要etcd和flannel兩項(xiàng)支持即可。
etcd一般部署在單獨(dú)機(jī)器上,那么flannel就部署在docker節(jié)點(diǎn)上,每個(gè)docker節(jié)點(diǎn)上都需部署。
1、部署etcd,假設(shè)地址為192.168.1.121
yum -y install etcd? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#安裝軟件包
vim /etc/etcd/etcd.conf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#修改配置文件
修改為如下:(默認(rèn)只監(jiān)聽(tīng)本地回環(huán)地址)
? ??ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
? ??ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
systemctl restart etcd? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#重啟服務(wù)
etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'? ?? ?? ? #添加一條網(wǎng)絡(luò)配置記錄,這個(gè)配置將用于flannel分配給每個(gè)Docker的虛擬IP地址段
2、部署flannel
從https://github.com/coreos/flannel/releases?下載最新穩(wěn)定版本,這里以0.5.5版本為例。
tar zxf flannel-0.5.5-linux-amd64.tar.gz? ?? ?#解壓文件
cp flannel-0.5.5/*?/usr/bin/? ?? ?? ?? ?? ?? ?#拷貝可執(zhí)行文件至系統(tǒng)變量path
使用systemd來(lái)管理flannel服務(wù)
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
設(shè)置etcd地址
vim?/etc/sysconfig/flanneld
FLANNEL_ETCD= "http://192.168.1.121:2379"
由于flannel將覆蓋docker0網(wǎng)橋,所以如果Docker服務(wù)已啟動(dòng),則停止Docker服務(wù)
編寫(xiě)flannel啟動(dòng)腳本,并加入自啟動(dòng)
vim /etc/init.d/start_flannel.sh
#!/bin/bash
systemctl stop docker? ?? ?? ?? ?? ?? ?? ?#停止docker服務(wù)
systemctl restart flanneld? ?? ?? ?? ?? ? #啟動(dòng)flannel服務(wù)
mk-docker-opts.sh -i? ?? ?? ?? ?? ?? ?? ? #生成環(huán)境變量
source /run/flannel/subnet.env? ?? ?? ?? ?#將環(huán)境變量生效
ifconfig docker0 ${FLANNEL_SUBNET}? ?? ???#設(shè)置docker0的網(wǎng)卡ip
systemctl start docker? ?? ?? ?? ?? ?? ???#啟動(dòng)docker服務(wù)
ok,現(xiàn)在跨主機(jī)容器間已經(jīng)可以通信。
第四種:使用Quagga來(lái)實(shí)現(xiàn)自動(dòng)學(xué)習(xí)路由
其實(shí)這種方式是基于第一種方式的路由技術(shù),只不過(guò)路由信息不需要自己手動(dòng)添加,而是自動(dòng)學(xué)習(xí)。試想一下,如果有10臺(tái)docker,那么每臺(tái)docker就需要手動(dòng)寫(xiě)9條路由信息,是不是很慘?
Linux上安裝路由器的軟件名為Quagga,它可以配置很多種企業(yè)級(jí)的動(dòng)態(tài)路由協(xié)議。我使用的是RIPV2和OSPF同時(shí)開(kāi)啟,但安裝Quagga的方法和配置命令,太過(guò)于繁瑣。所以網(wǎng)上有大神將其Docker化了。
下載Quagga鏡像:
docker pull index.alauda.cn/georce/router
備用地址:http://pan.baidu.com/s/1sj26X8T
特別需要注意的是:docker0的網(wǎng)段不能一樣,所以需要修改docker的子網(wǎng)地址,參考第一種的設(shè)置辦法
運(yùn)行鏡像:
docker run?-itd?--name=router?--privileged?--net=host index.alauda.cn/georce/router
執(zhí)行 ip route 查看下路由表,已有別的docker0的網(wǎng)段信息。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/bethal/p/5973522.html
總結(jié)
以上是生活随笔為你收集整理的docker network的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2-5:C++快速入门之引用,引用和指针
- 下一篇: 栈溢出笔记1.1 函数调用过程