1. 程式人生 > >centos7下安裝docker(15.3跨主機網路-macvlan)

centos7下安裝docker(15.3跨主機網路-macvlan)

除了ovrlay,docker還開發了另一個支援跨主機容器的driver:macvlan

macvlan本身是linu kernel模組,其功能是允許在同一物理網絡卡上配置多了MAC地址,即:多個interface,每個interface可以配置自己的ip。macvlan本身是一種網絡卡虛擬化技術,Docker用macvlan實現容器網路就不奇怪了

macvlan最大的優點是效能極好,相比其他方案,macvlan不需要建立Linux bridge,而是直接通過以太interface連線到物理網路

準備實驗環境:

我們會使用docker1和docker2上單獨的網絡卡ens192和ens160建立macvlan。為保證多個MAC地址網路包都可以從ens190或者ens160通過,我們需要開啟網絡卡的混雜模式

因為docker1號docker2是虛擬機器,所以在網絡卡配置選項中設定混雜模式(注:我使用的是esxi的虛擬機器,沒有做這一步也可以)

當前試驗環境如下:盜圖

建立macvlan網路

docker network create -d macvlan --subnet 192.168.2.1/24 --gateway 192.168.2.1 -o parent=ens160 macnet1

注:macvlan網路是local網路,為了保證跨主機能夠通訊,使用者需要自己管理IP subnet

      與其他網路不同,docker 不會為macvlan網路建立閘道器,這裡的閘道器應該是真實存在的,否則路由無法通

     -o parent指定使用的網路interface

在docker2中也要執行相同的命令:docker network create -d macvlan --subnet 192.168.2.1/24 --gateway 192.168.2.1 -o parent=ens160 macnet1

在docker1中執行容器

docker network create -d macvlan --subnet 192.168.2.1/24 --gateway 192.168.2.1 -o parent=ens160 macnet1

在docker2中執行同樣的操作:

驗證docker1上的mac1與docker2上的mac2的連通性

兩個不同主機之間的容器可以相互ping通,但是不能解析容器的主機名,可見docker沒有為macvlan提供dns服務,這點與overlay是不同的

注:macvlan是物理中實實在在存在的網路,macvlan實際就是我們常用的網絡卡的子介面,類似於:eth0:1

macvlan網路結構分析:

macvlan不依賴linux bridge,brctl show可以確認macvlan沒有建立新的bridge

檢視一下容器mac1的網路裝置:

除了lo,容器只有一個eth0,請注意:eth0後面還有@if2,表明該網絡卡有一個對應的interface,全域性編號為2,。根據macvlan的原理,我們猜測這個interface就是ens192,

確認如下:

可見,容器的eth0就是ens192通過macvlan虛擬出來的interface。容器的interface直接與主機的網絡卡連線,這種方案是的容器無需通過NAT和埠對映就能與外網直接通訊(只要有閘道器)在網路上與其他獨立的主機沒有區別

當前網路如圖所示:

用sub-interface實現多macvlan網路

macvlan會獨佔主機的網絡卡,也就是說一個網絡卡只能建立一個macvlan網路,否則會報錯:

但是主機host的網絡卡是有限的,如何支援更多的macvlan呢?

好在macvlan不僅可以連線到interface(如ens192)還可以連線到sub-interface(如:ens192.xxx)

VLAN是現代網路常用的網路虛擬化技術,它可以將物理的二層網路劃分成多達4094個邏輯網路,這些網路在二層上是隔離的,每個邏輯網路(即VLAN)由VLAN ID區分,VLAN ID的取值唯1-4094

linux的網絡卡也能支援VLAN,同一個interface可以收發多個VLAN資料包,不過前提是要建立VLAN的sub-interface

比如:希望ens192同時支援VLAN10和VLAN20,則需要建立sub-interface ens192.10和ens192.20

在交換機上,如果某個port只能收發單個VLAN資料,該port為Access模式,如果支援多VLAN,則為trunk模式,因為我們在虛擬機器上,所以無需配置

下面演示如何在ens192.10和ens192.20上建立macvlan網路

1.首先在docker1和docker2上建立vlan

2.建立網路

3.執行容器,分別使用macnet1和macnet2網路

4.驗證網路的連通性

在mac1去ping mac2無法ping通,畢竟他們不在同一個網段 ,下面我們在docker1上做同樣的操作

1.配置vlan

2.建立macvlan網路

3.執行容器,分別使用macnet3和macney4

4.驗證容器的連通性

macnet3ping不通macnet4

我們再來試試docker1上的macnet3能不能ping通docker2上的macnet1,因為他們是在同一個網段

按正常來說他們是能夠正常進行通訊的,但是由於我的是在esxi的虛擬機器上面做的實驗,需要在esxi中設定ens192為trunk口,允許所有vlan通過後試驗才會生效

即:同一個macvlan下的網路能ping通,不同的macvlan網路之間不能通訊。但是更準確的說法是:不同的macvlan網路不能在二層上通訊。在三層可以通過閘道器進行通訊

現在的拓撲如下:盜圖

下面測試通過啟用閘道器的形式,使不同網段的macvlan打通

1.先將192。168.7.222配置成一個虛擬記得路由,設定閘道器並轉發VLAN10和VLAN20的流量。當然使用物理路由也可以達到這種效果

確保192.168.7.222的IP Forwarding已經啟用

sysctl net.ipv4.ip_forward檢視是否開啟轉發,1表示開啟,0表示沒有開啟

sysctl -w net.ipv4.ip_forward=1設定開啟

2.在/etc/sysconfig/network-scripts/下設定192.168.7.222的sub-interface

3.將閘道器的IP配置到sub-interface:

ifconfig ens192.10 192.168.10.1 netmask 255.255.255.0 up

ifconfig ens192.10 192.168.20.1 netmask 255.255.255.0 up

4.設定防火牆規則;

iptables -t nat -A POSTROUTING -o eth2.10 -j MASQUERADE

iptables -t nat -A POSTROUTING -o eth2.20 -j MASQUERADE

iptables -A FORWARD -i eth2.10 -o eth2.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i eth2.10 -o eth2.20 -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -j ACCEPT

5.當前的網路拓撲:盜圖

現在不同的macvlan之間也可以進行通訊

下面的圖是容器之間的通訊過程:盜圖

1.因為容器在不同的網段,所以使用路由進行轉發

macvlan網路的連通性和隔離性完全依賴VLAN,IP subnet和路由,docker 本身不做任何限制,使用者可以像管理傳統VLAN網路那樣管理macvlan

相關推薦

centos7安裝docker15.3主機網路-macvlan

除了ovrlay,docker還開發了另一個支援跨主機容器的driver:macvlan macvlan本身是linu kernel模組,其功能是允許在同一物理網絡卡上配置多了MAC地址,即:多個interface,每個interface可以配置自己的ip。macvlan本身是一種網絡卡虛擬化技術,Dock

centos7安裝docker15.2主機網路-overlay

為支援容器跨主機通訊,Docker提供了overlay driver,使使用者可以建立基於VxLAN的overlay網路。VxLAN可將二層資料封裝到UDP進行傳輸,VxLAN提供與VLAN相同的乙太網二層服務,但是擁有更強的擴充套件性和靈活性。 Docker overlay網路需要一個key-value

centos7安裝docker15.4主機網絡-flannel

url eos 配置 實現 國外 ken 由於 con pin flannel是CoreOS開發的容器網絡解決方案,flannel為每一個host分配一個subnet,容器從這些subnet中分配IP,這些IP可以在host之間路由,容器無需NAT和port mapping

centos7安裝docker14.2主機網絡-overlay

活性 用戶 driver 試驗 mach 實踐 point ogr drive 為支持容器跨主機通信,Docker提供了overlay driver,使用戶可以創建基於VxLAN的overlay網絡。VxLAN可將二層數據封裝到UDP進行傳輸,VxLAN提供與VLAN相同的

centos7安裝docker15.7容器主機網絡---calico

信息 https 用戶 client /usr ctc onf pan 映射 Calico是一個純三層的虛擬網絡方案,Calico為每個容器分配一個IP,每個host都是router,把不同host的容器連接起來。與vxlan不同的是:calico不對數據包進行封裝,不需要

centos7安裝docker15.5容器主機網路--flanneld

flannel是由CoreOS研究的一種覆蓋網路(overlay network)網路工具,目的是幫助每一個host主機有一個完整的子網; 功能是:讓叢集中不同節點的主機建立的容器都有一個唯一的虛擬IP 工作原理:將TCP資料包裝在另一種網路包裡進行路由轉發和通訊,目前已經支援UDP,Vxlan,AWS,AP

centos7安裝docker9.3容器對資源的使用限制-Block IO

緩存 centos 文件 機制 font nbsp 有效 之間 找到 Block IO:指的是磁盤的讀寫,docker 可以通過設置權重,限制bps和iops的方式控制容器讀寫磁盤的帶寬 註:目前block IO限額只對direct IO(不使用文件緩存)有效。 1.Blo

centos7安裝docker12.3容器之間的連通性

daemon 2.3 es2017 命令 selinux bridge 之前 -- 9.png 我們接著盜圖,如下: 在這張圖上,可以看到,如果兩個容器使用同一個bridge,那麽兩個容器之間是互相能通的 可以看到兩個容器在同一個bridge下是可以互相ping通的

centos7安裝docker10容器底層--cgroup和namespace

sys bsp 內存 更改 ont sha 進入 logs 一個 cgroup和namespace是實現容器底層的重要技術 cgroup:實現資源限制 namespace:實現資源隔離 1.cgroup:control group Linux操作系統通過cgroup可以設置

centos7安裝docker13.1docker存儲--data volume

ron 鏡像 .cn 空間 ges bind 存在 src 設置 我們現在知道docker 有兩種存儲方式:storage driver和data volume stroage driver這種存儲方式主要是存儲那些無狀態的數據,是鏡像層和容器層組成的,而data volu

centos7安裝docker17.5docker監控的總結對比

單獨使用 收集 host font 容易 scope pan 建議 數據模型 到現在為止,我已經學習了docker自帶的監控方案:ps/ls/top/stats,以及sysdig,weave scope,cadvisor,prometheus多種監控工具,現在做個總結和比較

centos7安裝docker18.3docker日誌---logging driver---fluentd

發送 dcoker 一個 tag 連接 選擇 路徑 logging logs 前面我們學的ELK中用filebeat收集docker容器日誌,利用的是dcoker默認的logging driver json-file,下面我們用fluentd來收集容器日誌 Flue

centos7安裝docker2鏡像

world 組成 啟動 ges src img es2017 base .com docker最小的鏡像——hello-world 下載鏡像 docker pull docker pull hello-world 查看鏡像 docker images docker im

centos7安裝docker9容器對資源的使用限制-內存

span 解決辦法 9.png doc etc pac out 內核 count 一個docker Host上面會運行若幹容器,每個容器都需要CPU,內存和IO資源。容器提供了控制分配多少CPU,內存給每個容器的機制,避免摸個容器因占用太多資源而

centos7安裝docker11容器操作總結

創建 centos 安裝 pause 共享內存 打印 volume -a bytes 這段時間主要是學習了對容器的操作,包括:容器的狀態:start,stop,restart,rename,pause,unpause,rm,attach,exec,kill,logs;還學習

centos7安裝docker12.4容器如何與外部進行通信

tro net ont 安裝docker 數據包 pin pdu 網卡 asq 1.容器如何訪問外部 前面我們做了很多試驗:只要host能連外網,使用默認bridge(docker0)創建得容器就能訪問外網,那麽容器是怎樣訪問外網的呢? 註:這裏的外網不僅是inte

centos7安裝docker12.5容器在單個host上的網絡總結

centos 查看 轉換成 跨主機 地址 -s 外部 spec 創建 單個host上的容器的網絡:通過本章的學習,我們知道docker默認有三種網絡,可以通過docker network ls查看; none:封閉的網絡,通過--network=none來指定; host:

centos7安裝docker17docker監控---docker自帶監控命令

img 數據 spa 查看 監控 pan top 可用 mage Docker自帶的監控子命令 1.docker ps;docker ps -a這是我們常用的查看容器狀態的命令 docker container ls和docker ps的功能一樣 2.docker to

centos7安裝docker17.3docker監控---cAdvisor

web iso 定位 var com 收集器 tps 網絡流 container cAdvisor是google開發的容器監控工具 1。在host上運行cadvisor容器 docker run -d -p 8080:8080 --name cadvisor -v /:/

centos7安裝docker18docker日誌---docker logs

生產環境 參數 錯誤 out 日誌 圖片 打印 沒有 httpd 在微服務架構中,由於容器的數量眾多以及快速變化的特性使得記錄日誌和監控變得越來越重要,考慮到容器的短暫和不固定周期,當我們需要排查問題的時候容器可能不在了。因此,一套集中式的日誌管理系統是生產環境中不可或缺的