當前位置:首頁 » 幣種行情 » dockereth0配置

dockereth0配置

發布時間: 2023-04-25 05:15:56

㈠ 單host下Docker的默認網路配置

本文用到的環境如下:
host: centos7
docker: 通過 yum install -y docker 安裝,版本號為1.10.3
docker鏡像:
# Version: 0.0.1 FROM ubuntu:latest MAINTAINER paul liu "[email protected]" RUN apt-get update RUN apt-get install -y net-tools RUN apt-get install -y iputils-ping CMD /bin/bash

場景圖:

我的host主機接有無線路由器,通過ADSL撥號上網,網卡eth0固定IP為192.168.0.200,網關為路由器的IP 192.168.0.1。
在host上安裝docker,並運行容器。

通過以下命令安裝docker,
yum install -y docker
啟用docker,
systemctl start docker
然後在host主機運行 ifconfig 或 ip a 命令,可以看到除去host原有的網卡eth0和回環lo外,多了個docker0。

docker0 IP為172.17.0.1,所在的網段默認為B類私網地址172.17.0.0/16。可以將docker0看做是host主機的一塊虛擬網卡。這樣host主機就等同於配置了雙網卡,兩塊網卡之間可以通信,但前提是啟用ip_forward。
這是docker0的第一個身份。

運行兩個容器docker1,docker2,然後在host主機上運行 brctl show 查看,

這里可以看出docker0的第二個身份,一個虛擬交換機。每運行一個容器,就會產生一對veth,其中一端連接到docker0上,另一端連接到容器的eth0上。這樣,所有連接到docker0的容器組成了一個區域網。如下圖:

在host主機上運行 ifconfig ,也會發現多了兩個veth這樣的網路介面。

在host主機上運行 ip addr show veth6d9a691 ,可以查看到該veth具有mac地址,這也正說明了docker0的虛擬交換機的身份,交換機是通過mac地址通信的,連接到交換機的設備必須具有mac地址。

由於docker0自身也具有mac地址,這個與純二層交換機是不同的,並且綁定了IP 172.17.0.1,容器默認把docker0作為了網關。也就是docker0還兼具路由的功能,因此可以把docker0看做是一個三層交換機,可以做二層數據包轉發,也可以做三層路由轉發。

在容器中運行 route -n 查看路由如下:

在host主機上運行 route -n 查看路由如下:

在host中,訪問本網段192.168.0.0是通過eth0轉發數據包的,訪問172.17.0.0網段是通過docker0轉發數據包的,而對於其他如公網是通過eth0將數據包轉發給網關192.168.0.1,再由該網關進行數據包轉發的,比如上網。

在容器中運行 ping sohu.com 或 ping 192.168.0.200 都可以ping通。

默認情況下,不需要再額外做任何配置,在一台host主機上,通過docker0,各容器之間可以互通,並且可以通過host的eth0連接外網。
通俗的講,通過docker0組成了一個網段為172.17.0.0/16的乙太網,docker容器發起請求時,如果是相同網段則經由docker0轉發到目標機器,如果是不同網段,則經由docker0,轉發到host的另一塊網卡eth0上,由eth0負責下一步的數據包轉發,比如公網地址。

下面進一步分析一下報文是怎麼發送到外面的。

容器內部發送一條公網請求報文,通過eth0,在veth被接收。此時報文已經來到了主機上,通過查詢主機的路由表( route -n ),如果發現報文應該通過主機的eth0,從默認網關發送出去,那麼報文就被從docker0轉發給主機的eth0,但前提是首先啟用ip_forward功能,才能在host主機的docker0和eth0兩個網卡間傳遞數據包。

由於目標地址並不屬於host主機所在網段,那麼會匹配機器上的 iptables中的nat表POSTROUTING鏈中的規則。
在host主機運行命令 iptables -L -n -t nat --line-numbers ,查看nat表,這里只看POSTROUTING鏈:

第一行中說明,對於源地址為172.17.0.0/16網段的數據包,發出去之前通過MQSQUERADE偽裝。linux內核會修改數據包源地址為host主機eth0的地址(也就是192.168.0.200),然後把報文轉發出去。對於外部來說,報文是從主機eth0發送出去的。

區域網內的機器由於都是私有IP,是無法直接訪問互聯網的(數據包可以發出去,但回不來。)如果要上網,除了可以通過硬體路由器,也可以通過軟體路由,在iptables的nat表中的POSTROUTING鏈中添加SNAT規則。

測試一下,在host主機運行命令 iptables -t nat -D POSTROUTING 1 將第一條規則刪掉,那麼在容器中就運行命令 ping sohu.com 就ping不通了。但仍然可以ping通host主機。

在host主機運行命令以下命令恢復:
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -o eth0 -j SNAT --to-source 192.168.0.200
或者
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE

關於SNAT和MASQUERADE,這篇文章已經有過描述,可以參考: Docker前傳之linux iptables

新建一Dockerfile,用以運行nginx容器:
# Version: 0.0.1 FROM paulliu/ubuntu_ip RUN apt-get install -y nginx EXPOSE 80

在host主機運行構建命令構建鏡像 docker build -t paulliu/nginx .
在host主機運行容器啟動命令 docker run -d -p 80 --name nginx1 paulliu/nginx nginx -g "daemon off;"
在host主機查看容器的埠映射 docker port nginx1 80

在host主機運行命令 iptables -nat -L -n 可以看到在PREROUTING鏈中多了以下DNAT規則:

也就是在容器啟動時通過 -p 80 將host主機192.168.0.200:32773映射為容器172.17.0.4:80。
注意:docker容器每次啟動時獲取的IP地址未必是一樣的,而且 -p 80 是在host主機上隨機選擇一個埠號進行映射,每次啟動的埠號也未必是一樣的。但iptables中相關的規則是自動變更的。

在host主機運行 curl localhost:32773 或者在其他主機運行 curl 192.168.0.200:32773 結果如下:

㈡ Docker容器網路-實現篇

前面介紹了: Docker容器網路-基礎篇

前文說到容器網路對Linux虛擬化技術的依賴,這一篇章我們將一探究竟,看看Docker究竟是怎麼做的。通常,Linux容器的網路是被隔離在它自己的Network Namespace中,其中就包括:網卡(Network Interface)、回環設備(Loopback Device)、路由表(Routing Table)和iptables規則。對於一個進程來說,這些要素,就構成了它發起和響應網路請求的基本環境。

我們在執行 docker run -d --name xxx 之後,進入容器內部:

並執行 ifconfig:

我們看到一張叫eth0的網卡,它正是一個Veth Pair設備在容器的這一端。

我們再通過 route 查看該容器的路由表:

我們可以看到這個eth0是這個容器的默認路由設備。我們也可以通過第二條路由規則,看到所有對 169.254.1.1/16 網段的請求都會交由eth0來處理。

而Veth Pair 設備的另一端,則在宿主機上,我們同樣也可以通過查看宿主機的網路設備來查看它:

在宿主機上,容器對應的Veth Pair設備是一張虛擬網卡,我們再用 brctl show 命令查看網橋:

可以清楚的看到Veth Pair的一端 vethd08be47 就插在 docker0 上。

我現在執行docker run 啟動兩個容器,就會發現docker0上插入兩個容器的 Veth Pair的一端。如果我們在一個容器內部互相ping另外一個容器的IP地址,是不是也能ping通?

容器1:

容器2:

從一個容器ping另外一個容器:

我們看到,在一個容器內部ping另外一個容器的ip,是可以ping通的。也就意味著,這兩個容器是可以互相通信的。

我們不妨結合前文時所說的,理解下為什麼一個容器能訪問另一個容器?先簡單看如一幅圖:

當在容器1里訪問容器2的地址,這個時候目的IP地址會匹配到容器1的第二條路由規則,這條路由規則的Gateway是0.0.0.0,意味著這是一條直連規則,也就是說凡是匹配到這個路由規則的請求,會直接通過eth0網卡,通過二層網路發往目的主機。而要通過二層網路到達容器2,就需要127.17.0.3對應的MAC地址。所以,容器1的網路協議棧就需要通過eth0網卡來發送一個ARP廣播,通過IP找到MAC地址。

所謂ARP(Address Resolution Protocol),就是通過三層IP地址找到二層的MAC地址的協議。這里說到的eth0,就是Veth Pair的一端,另一端則插在了宿主機的docker0網橋上。eth0這樣的虛擬網卡插在docker0上,也就意味著eth0變成docker0網橋的「從設備」。從設備會降級成docker0設備的埠,而調用網路協議棧處理數據包的資格全部交給docker0網橋。

所以,在收到ARP請求之後,docker0就會扮演二層交換機的角色,把ARP廣播發給其它插在docker0網橋的虛擬網卡上,這樣,127.17.0.3就會收到這個廣播,並把其MAC地址返回給容器1。有了這個MAC地址,容器1的eth0的網卡就可以把數據包發送出去。這個數據包會經過Veth Pair在宿主機的另一端veth26cf2cc,直接交給docker0。

docker0轉發的過程,就是繼續扮演二層交換機,docker0根據數據包的目標MAC地址,在CAM表查到對應的埠為veth8762ad2,然後把數據包發往這個埠。而這個埠,就是容器2的Veth Pair在宿主機的另一端,這樣,數據包就進入了容器2的Network Namespace,最終容器2將響應(Ping)返回給容器1。在真實的數據傳遞中,Linux內核Netfilter/Iptables也會參與其中,這里不再贅述。

CAM就是交換機通過MAC地址學習維護埠和MAC地址的對應表

這里介紹的容器間的通信方式就是docker中最常見的bridge模式,當然此外還有host模式、container模式、none模式等,對其它模式有興趣的可以去閱讀相關資料。

好了,這里不禁問個問題,到目前為止只是單主機內部的容器間通信,那跨主機網路呢?在Docker默認配置下,一台宿主機的docker0網橋是無法和其它宿主機連通的,它們之間沒有任何關聯,所以這些網橋上的容器,自然就沒辦法多主機之間互相通信。但是無論怎麼變化,道理都是一樣的,如果我們創建一個公共的網橋,是不是集群中所有容器都可以通過這個公共網橋去連接?

當然在正常的情況下,節點與節點的通信往往可以通過NAT的方式,但是,這個在互聯網發展的今天,在容器化環境下未必適用。例如在向注冊中心注冊實例的時候,肯定會攜帶IP,在正常物理機內的應用當然沒有問題,但是容器化環境卻未必,容器內的IP很可能就是上文所說的172.17.0.2,多個節點都會存在這個IP,大概率這個IP是沖突的。

如果我們想避免這個問題,就會攜帶宿主機的IP和映射的埠去注冊。但是這又帶來一個問題,即容器內的應用去意識到這是一個容器,而非物理機,當在容器內,應用需要去拿容器所在的物理機的IP,當在容器外,應用需要去拿當前物理機的IP。顯然,這並不是一個很好的設計,這需要應用去配合配置。所以,基於此,我們肯定要尋找其他的容器網路解決方案。

在上圖這種容器網路中,我們需要在我們已有的主機網路上,通過軟體構建一個覆蓋在多個主機之上,且能把所有容器連通的虛擬網路。這種就是Overlay Network(覆蓋網路)。

關於這些具體的網路解決方案,例如Flannel、Calico等,我會在後續篇幅繼續陳述。

㈢ Docker網路

Docker網路

使用docker0網橋,docker0的默認網段是172.17.0.0,網關地址為172.17.0.1,通過bridge模式啟動的容器,進入容器日內部並使用ip route show指令可以看到其使用的網關就是docker0的網關地址。

在宿主機上通過brctl show docker0可以看到docker0橋接的網卡與啟動的容器的veth一致。

容器之間的通訊:
從a容器ping b容器
1、數據包從a容器對應的veth流到docker0
2、docker0廣播arp尋找b容器對應的地址
3、b容器的veth收到廣播並回復docker0自己就是目標
4、a容器與b容器建立連接並實現通信

容器與外網通訊
1、veth數據流到docker0網橋
2、docker0網橋流量流向eth0
3、eth0流量流向對應的目標
只要是eth0可以訪問到的,容器就可以訪問到

直接使用宿主機的網路,無法指定出入的流量以及暴露的埠,默認暴露出去的地址是0.0.0.0:xxxx,可以直接訪問(TODO())。

通過docker指令創建自定義的網橋,由於默認的bridge模式無法為container指定ip,所以需要通過自定義網橋的方式來實現,且自定義網橋可以限制容器之間的相互訪問,跨網橋無法互相訪問。

使用指定網橋的時候只要通過network指定網橋名稱即可,且使用自定義的網橋可以指定容器的IP。並且由於是固定IP,就可以通過iptable來做各種的規則。

這個模式就是指定一個已有的容器,共享該容器的IP和埠。除了網路方面兩個容器共享,其他的如文件系統,進程等還是隔離開的。

這個模式下,dokcer不為容器進行任何網路配置。需要我們自己為容器添加網卡,配置IP。

Docker是通過iptable的方式實現流量的控制的

通過添加iptable規則實現

該指令添加了一條nat規則,把所有來自 172.17.0.0/16 網段且即將流出本主機的數據包的源 IP 地址都修改為 10.0.0.100(建議通過添加自定義網橋的方式來做)。

直接通過-p的方式暴露一個埠出去,默認使用的是0.0.0.0,所有網卡均可訪問,也可以在參數中指定特定的網卡,例如:-p 192.168.1.1:80:80來指定只能通過該網卡來訪問。

查看nat表
iptables -L -n -t nat --line-numbers
查看路由規則
route -n

㈣ docker網路怎麼配置/

在你的宿主機啟動docker的時候會多出一個 docker0 的虛擬網卡,然後容器都通過這個和外面通信。容器和docker宿主機之間是NAT的方式共享網路的,也就是說宿主機可以訪問的資源,容器也是可以直接訪問,你要使用apt-get,你就要保證你的宿主機可以上外網,否則免談。

熱點內容
區塊鏈幣圈今天的話題 發布:2025-07-05 15:22:06 瀏覽:796
玩區塊鏈的人群 發布:2025-07-05 15:06:06 瀏覽:123
VP幣是傳銷還是真正區塊鏈 發布:2025-07-05 15:01:21 瀏覽:453
個人還能挖比特幣嗎 發布:2025-07-05 14:46:43 瀏覽:680
幣圈財富自由論壇 發布:2025-07-05 14:12:52 瀏覽:844
挖比特幣有沒有風險 發布:2025-07-05 14:02:51 瀏覽:82
BE區塊鏈生態算網路傳銷嗎 發布:2025-07-05 13:34:31 瀏覽:657
幣圈是什麼控制漲跌 發布:2025-07-05 12:51:01 瀏覽:385
以太坊的運作過程 發布:2025-07-05 12:34:09 瀏覽:207
如何銷售區塊鏈會議 發布:2025-07-05 11:34:12 瀏覽:219