詳解Docker中VLAN網(wǎng)絡(luò)模式的配置
前言
Docker作為目前最火的輕量級(jí)容器技術(shù),有很多令人稱道的功能,如Docker的鏡像管理。然而,Docker同樣有著很多不完善的地方,網(wǎng)絡(luò) 方面就是Docker比較薄弱的部分。因此,我們有必要深入了解Docker的網(wǎng)絡(luò)知識(shí),以滿足更高的網(wǎng)絡(luò)需求。
Docker網(wǎng)絡(luò)模式選擇
目前已有不少文章介紹了Docker的網(wǎng)絡(luò)模型,但是在實(shí)際應(yīng)用中還是有不少坑和需要注意的點(diǎn)
在Docker應(yīng)用到生產(chǎn)環(huán)境的時(shí)候,網(wǎng)絡(luò)模型的選擇主要有以下幾種
1、原生Bridge NAT模式
2、Linux Bridge VLAN模式
3、利用第三方的網(wǎng)絡(luò)方案
原生的Bridge NAT模式
這是Docker原生的網(wǎng)絡(luò)模式,每臺(tái)主機(jī)的容器都在一個(gè)獨(dú)立的子網(wǎng)中,外部訪問必須通過主機(jī)端口映射的方式。同時(shí)不同主機(jī)間的容器間訪問也必須通過這種主機(jī)端口映射的方式。換句話說,一臺(tái)主機(jī)上的容器其實(shí)是不知道另外一臺(tái)主機(jī)的容器的。這種方式是否可以用于生產(chǎn),一開始我是憂郁的,同時(shí)之前有寫文章寫NAT的性能損耗比較大,在沒有資源做完整測(cè)試的情況下,我們最初的方案就沒敢用這個(gè)網(wǎng)絡(luò)方案。但是最近測(cè)試自己測(cè)試的結(jié)果看,NAT的性能是可以接受的(QPS和Latency和VLAN的模式都比較接近),只要有合適的方案將不同主機(jī)的容器聯(lián)通就可。如用Mesos+Marathon+Bamboo+HAProxy的方式就可以的。
Linux Bridge VLAN模式
這是我考慮Docker網(wǎng)絡(luò)模型一開始就想決定好的,主要有幾方面的原因:
1、NAT的方式一開始不敢用
2、其它第三飯的工具還不太成熟
3、一開始容器的數(shù)量不可能太多(因?yàn)閂LAN的模式受限于VLAN的整體數(shù)量,只能4096個(gè)容器),如果按照一個(gè)主機(jī)10-16個(gè)容器算,可以支持到256臺(tái)主機(jī),這個(gè)還是可以接受的
4、每個(gè)主機(jī)需要一個(gè)獨(dú)立IP,并且可以互聯(lián)互通
5、運(yùn)維管理要簡單,畢竟我們的運(yùn)維體系還是物理機(jī)體系的
6、可以做到主機(jī)網(wǎng)絡(luò)和VLAN網(wǎng)絡(luò)的隔離
我們用的主機(jī)是CentosOS 7.X系列, 主機(jī)的網(wǎng)絡(luò)配置如下:兩個(gè)1G的網(wǎng)卡,通過Bond的方式綁在一起,然后配置主機(jī)一個(gè)虛擬網(wǎng)卡在VALN 1上,容器的Docker0的Bridge在另外一個(gè)VLAN 1上
網(wǎng)卡配置:
這里需要注意的是必須安裝了bridge-utils, NetworkManager包
步驟
配置兩個(gè)網(wǎng)卡,不要配置IP/GATEWAY等網(wǎng)絡(luò)參數(shù),增加MASTER=bond0
以及SLAVE=yes
完整例子如:
TYPE=Ethernet BOOTPROTO=none DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=no IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=enp2s0f0 UUID=7f6fa8e9-0177-46a8-b8ea-55c2187bea11 DEVICE=enp2s0f0 ONBOOT=yes MASTER=bond0 SLAVE=yes
增加bond0網(wǎng)絡(luò)配置/etc/sysconfig/network-scripts/ifcfg-bond0
,并根據(jù)使用情況選擇 mode
值,內(nèi)容如下。因?yàn)橐赽ond0上再配置VLAN所以沒有配置IP等相關(guān)參數(shù)。如果配置了IP等參數(shù)則可以認(rèn)為bond0就是一個(gè)普通網(wǎng)卡了。
DEVICE=bond0 NAME=bond0 TYPE=Bond BONDING_MASTER=yes ONBOOT=yes BOOTPROTO=none BONDING_OPTS="miimon=100 mode=0"
可以通過cat /proc/net/bonding/bond0
看配置的情況
在bond0上配置vlan,這里的vlan號(hào)為136,所以文件名為/etc/sysconfig/network-scripts/ifcfg-bond0.136
,內(nèi)容為:
VLAN=yes TYPE=Ethernet DEVICE=bond0.136 NAME=bond0.136 PHYSDEV=bond0 ONBOOT=yes BOOTPROTO=static BRIDGE=docker0
因?yàn)楹罄m(xù)需要將docker的bridge(docker0)掛在這個(gè)vlan上,所以TYPE必須是Ethernet,而且多了項(xiàng)配置BRIDGE=docker0
配置docker的bridge( /etc/sysconfig/network-scripts/ifcfg-docker0
),名字也可以用別的,為了減少docker engine需要增加-b啟動(dòng)參數(shù),所以用了默認(rèn)的名字。同時(shí)沒有給docker0配置IP,因?yàn)橛辛硗庖粋€(gè)vlan的ip來管理主機(jī)
TYPE=bridge VLAN=yes DEVICE=docker0 SLAVE=bond0.136 NAME=docker0 ONBOOT=yes BOOTPROTO=none
Docker的配置
按機(jī)器用途類型,修改 Docker 啟動(dòng)文件 /usr/lib/systemd/system/docker.service
,內(nèi)容如下:
在 ExecStart=/usr/bin/docker daemon -H fd:// 這行后面加上:
--fixed-cidr=172.20.56.16/28 --default-gateway=172.20.56.1 --registry-mirror=http://registry.xxxx.com:5000 --insecure-registry=docker.xxx.com:5000 --storage-driver=overlay --ip-forward=false --iptables=false --log-driver=journald (注釋:"--fixed-cidr="后面填寫的是該機(jī)器容器IP子網(wǎng)段;"--default-gateway="后面填寫的是容器IP子網(wǎng)網(wǎng)關(guān);"--registry-mirror="后面填寫的是生產(chǎn)環(huán)境的docker registry域名。)
這里有幾個(gè)坑:
1、對(duì)于Docker的存儲(chǔ),不要使用默認(rèn)的方式,而是要使用overlay,同時(shí)是配合CentOS 7.X
2、因?yàn)殚_始安裝機(jī)器的時(shí)候網(wǎng)絡(luò)配置不是Bond的模式,需要配置好bond后需要清理下原有的配置
修改 /etc/sysctl.conf 文件,把 “net.ipv4.ip_forward
” 的值修改為1
不需要在/etc/sysconfig/network文件上配置gateway
創(chuàng)建文件 /etc/modules-load.d/bonding.conf,內(nèi)容如下:bonding
3、默認(rèn)情況,安裝好docker后,并沒有docker用戶組和docker用戶,必須使用root之行,如果不用root則需要:
創(chuàng)建docker用戶組:sudo groupadd docker
把當(dāng)前用戶加入docker用戶組,例如當(dāng)前使用的是apps用戶:sudo usermod -aG docker apps
創(chuàng)建docker用戶并加入docker用戶組:sudo useradd docker -g docker
修改“/var/lib/docker”目錄及其子目錄的owner和group:sudo chown -R docker:docker
退出并重新登錄,刷新當(dāng)前用戶的權(quán)限。
最大的坑是我們?cè)谀承┲鳈C(jī)上安裝一些平臺(tái)服務(wù)如Zookeeper,如果容器想訪問這些配置為容器的主機(jī)上的服務(wù)是訪問不通,,這個(gè)弄好了好久都沒有辦法,找網(wǎng)絡(luò)的同事,從交換機(jī)配置等來看都沒有問題,然后在老羅的指導(dǎo)下做以下嘗試:
- 在主機(jī)上啟動(dòng)tcpdump,然后在主機(jī)上抓取來自于容器的ping包,可以發(fā)現(xiàn)主機(jī)收到了容器發(fā)來的ICMP包,但是容器沒有收到任何響應(yīng),ping總是超時(shí),難道是主機(jī)拋棄了ICMP包?
a、打開火星文檢測(cè)看看是否有包進(jìn)來: sudo sysctl net.ipv4.conf.bond0/51.log_martians=1
(bond0/51為對(duì)應(yīng)bond0.51的網(wǎng)卡)可以看到有包進(jìn)來說明有來源不明的數(shù)據(jù)包。
b、從以上兩點(diǎn)可以想到網(wǎng)絡(luò)上我們配置了兩個(gè)不同的網(wǎng)卡,不同的網(wǎng)斷,原理上他們應(yīng)該是各自隔離的,及訪問網(wǎng)段1的數(shù)據(jù)要從網(wǎng)段1的網(wǎng)卡進(jìn)來,如果從網(wǎng)段2進(jìn)來,Linux認(rèn)為是非法包
d、據(jù)其原因,是因?yàn)長inux的RP(Reverse Path)過濾的問題,在這種情況下,需要將這臺(tái)主機(jī)的RP關(guān)閉就可
sudo sysctl net.ipv4.conf.bond0/51.rp_filter=0 sudo sysctl net.ipv4.conf.bond0/52.rp_filter=0 sudo sysctl net.ipv4.conf.all.rp_filter=0 sudo sysctl net.ipv4.conf.bond0.rp_filter=0
第三方網(wǎng)絡(luò)Plugin
目前比較好的選擇是以下幾種,不過還在摸索中
Calico, http://projectcalico.org/
Contiv, http://docs.contiv.io
總結(jié)
以上就是Docker中VLAN網(wǎng)絡(luò)模式配置的詳細(xì)介紹,希望這篇文章的全部內(nèi)容對(duì)大家學(xué)習(xí)或者使用Docker能有所幫助,如果有疑問大家可以留言交流。
相關(guān)文章
docker-maven-plugin打包鏡像并上傳到私有倉庫
本文主要介紹了docker-maven-plugin打包鏡像并上傳到私有倉庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09docker 在容器外執(zhí)行某個(gè)容器內(nèi)的某個(gè)命令操作
這篇文章主要介紹了docker 在容器外執(zhí)行某個(gè)容器內(nèi)的某個(gè)命令操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11Docker開啟遠(yuǎn)程訪問的實(shí)現(xiàn)方式
這篇文章主要介紹了Docker開啟遠(yuǎn)程訪問的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01使用Docker Compose搭建 Confluence的教程
本文將介紹如何使用 Docker Compose 快速搭建 Confluence 、以及如何和 Traefik 一同使用,如果你看過之前的內(nèi)容,跟隨本文應(yīng)該能在十分鐘內(nèi)解決戰(zhàn)斗,感興趣的朋友快來看看吧2021-06-06Docker?compose啟動(dòng)服務(wù)遇到的問題小結(jié)
這篇文章主要介紹了Docker?compose啟動(dòng)服務(wù)遇到的問題小結(jié),這個(gè)是檢驗(yàn)我們的docker?compose掌握程度,因此里面的鏡像沒有提前拉取,掛載數(shù)據(jù)卷的目錄也沒有提前創(chuàng)建,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11docker中運(yùn)行PostgreSQL容器的簡單步驟
這篇文章主要給大家介紹了關(guān)于docker中運(yùn)行PostgreSQL容器的簡單步驟,隨著docker的廣泛應(yīng)用,為了提供便利的管理,PostgreSQL數(shù)據(jù)庫也支持docker的安裝方式,需要的朋友可以參考下2023-08-08