docker 之網絡配置

                                                                Docker 網絡實現

首先,要實現網絡通訊,機器須要至少一個網絡接口(物理接口或虛擬接口)來收發數據包;此外,若是不一樣子網之間要進行通訊,須要路由機制。linux

Docker 中的網絡接口默認都是虛擬的接口。虛擬接口的優點之一是轉發效率較高。 Linux 經過在內核中進行數據複製來實現虛擬接口之間的數據轉發,發送接口的發送緩存中的數據包被直接複製到接收接口的接收緩存中。對於本地系統和容器內系統看來就像是一個正常的以太網卡,只是它不須要真正同外部網絡設備通訊,速度要快不少。web


Docker 容器網絡就利用了這項技術。它在本地主機和容器內分別建立一個虛擬接口,並讓它們彼此連通(這樣的一對接口叫作 veth pair)。docker

建立網絡參數

Docker 建立一個容器的時候,會執行以下操做:ubuntu

  • 建立一對虛擬接口,分別放到本地主機和新容器中;緩存

  • 本地主機一端橋接到默認的 docker0 或指定網橋上,並具備一個惟一的名字,如 veth65f9;網絡

  • 容器一端放到新容器中,並修更名字做爲 eth0,這個接口只在容器的名字空間可見;ide

  • 從網橋可用地址段中獲取一個空閒地址分配給容器的 eth0,並配置默認路由到橋接網卡 veth65f9。oop

完成這些以後,容器就可使用 eth0 虛擬網卡來鏈接其餘容器和其餘網絡。spa


能夠在 docker run 的時候經過 --net 參數來指定容器的網絡配置,有4個可選值:code

  • --net=bridge 這個是默認值,鏈接到默認的網橋。

  • --net=host 告訴 Docker 不要將容器網絡放到隔離的名字空間中,即不要容器化容器內的網絡。此時容器使用本地主機的網絡,它擁有徹底的本地主機接口訪問權限。容器進程能夠跟主機其 它 root 進程同樣能夠打開低範圍的端口,能夠訪問本地網絡服務好比 D-bus,還可讓容器作一些影響整個主機系統的事情,好比重啓主機。所以使用這個選項的時候要很是當心。若是進一步的使用 --privileged=true,容器會被容許直接配置主機的網絡堆棧。

  • --net=container:NAME_or_ID 讓 Docker 將新建容器的進程放到一個已存在容器的網絡棧中,新容器進程有本身的文件系統、進程列表和資源限制,但會和已存在的容器共享 IP 地址和端口等網絡資源,二者進程能夠直接經過 lo 環回接口通訊。

  • --net=none 讓 Docker 將新容器放到隔離的網絡棧中,可是不進行網絡配置。以後,用戶能夠本身進行配置。

四種單節點網絡模式

一、bridge 模式

Docker 容器默認使用 bridge 模式的網絡。其特色以下:

  • 使用一個 linux bridge,默認爲 docker0

  • 使用 veth 對,一頭在容器的網絡 namespace 中,一頭在 docker0 上

  • 該模式下Docker Container不具備一個公有IP,由於宿主機的IP地址與veth pair的 IP地址不在同一個網段內

  • Docker採用 NAT 方式,將容器內部的服務監聽的端口與宿主機的某一個端口port 進行「綁定」,使得宿主機之外的世界能夠主動將網絡報文發送至容器內部

  • 外界訪問容器內的服務時,須要訪問宿主機的 IP 以及宿主機的端口 port

  • NAT 模式因爲是在三層網絡上的實現手段,故確定會影響網絡的傳輸效率。

  • 容器擁有獨立、隔離的網絡棧;讓容器和宿主機之外的世界經過NAT創建通訊

Screenshot from 2018-06-18 21-23-01.png

二、Host 模式


定義:

Host 模式並無爲容器建立一個隔離的網絡環境。而之因此稱之爲host模式,是由於該模式下的 Docker 容器會和 host 宿主機共享同一個網絡 namespace,故 Docker Container能夠和宿主機同樣,使用宿主機的eth0,實現和外界的通訊。換言之,Docker Container的 IP 地址即爲宿主機 eth0 的 IP 地址。其特色包括:


  • 這種模式下的容器沒有隔離的 network namespace

  • 容器的 IP 地址同 Docker host 的 IP 地址

  • 須要注意容器中服務的端口號不能與 Docker host 上已經使用的端口號相沖突

  • host 模式可以和其它模式共存

Screenshot from 2018-06-18 21-25-54.png


三、container 模式

定義:

 Container 網絡模式是 Docker 中一種較爲特別的網絡的模式。處於這個模式下的 Docker 容器會共享其餘容器的網絡環境,所以,至少這兩個容器之間不存在網絡隔離,而這兩個容器又與宿主機以及除此以外其餘的容器存在網絡隔離。 

Screenshot from 2018-06-18 21-26-38.png

四、none 模式

定義:

 網絡模式爲 none,即不爲 Docker 容器構造任何網絡環境。一旦Docker 容器採用了none 網絡模式,那麼容器內部就只能使用loopback網絡設備,不會再有其餘的網絡資源。Docker Container的none網絡模式意味着不給該容器建立任何網絡環境,容器只能使用127.0.0.1的本機網絡。


實驗:

rhel7.3  172.25.12.250(物理機)



啓動一個容器,不指定時,容器默認使用 bridge 模式

[root@foundation12 ~]# docker run -it --name web ubuntu

Screenshot from 2018-06-18 21-32-35.png


查看物理機

Screenshot from 2018-06-18 21-33-59.png

物理機橋接狀況

Screenshot from 2018-06-18 21-34-31.png


設定爲none 模式


[root@foundation12 ~]# docker run -it --name vm1 --net none ubuntu


Screenshot from 2018-06-18 22-13-30.png

Screenshot from 2018-06-18 22-12-55.png


查看PID:

[root@foundation12 ~]# docker inspect -f '{{.State.Pid}}' vm1

Screenshot from 2018-06-18 22-15-52.png



虛擬化網絡都是基於netns 實現,netns 能夠建立一個徹底隔離的新網絡環境,這個環境包括一個獨立的網卡空間,路由表,ARP表,ip地址表,iptables等。總之,與網絡有關的組件都是獨立的。

ip [ OPTIONS ] netns  { COMMAND | help }

ip netns list - show all of the named network namespaces     列出全部名稱空間
ip netns add NETNSNAME - create a new named network namespace     建立一個新的名稱空間
ip netns delete NETNSNAME - delete the name of a network namespace     刪除一個名稱空間
ip netns exec NETNSNAME cmd ... - Run cmd in the named network namespace     在網絡名稱空間中執行系統命令


eg:

Screenshot from 2018-06-18 22-36-12.png



Screenshot from 2018-06-18 22-39-13.png


[root@foundation12 netns]# ip link add name veth0 type veth peer name veth1  添加網口到namespace(建立端口對)

在當前namespace能夠看到veth0和veth1  

[root@foundation12 ~]# ip link list  查看端口對

Screenshot from 2018-06-18 23-31-48.png



Screenshot from 2018-06-18 23-01-35.png


[root@foundation12 netns]# brctl addif docker0 veth0   將veth0加入docker0這個網橋


Screenshot from 2018-06-18 23-02-35.png


默認網橋都是down的,置爲up狀態

[root@foundation12 netns]# ip addr

Screenshot from 2018-06-18 23-05-17.png

[root@foundation12 netns]#  ip link set up veth0
[root@foundation12 netns]#  ip link set up veth1

Screenshot from 2018-06-18 23-07-15.png


Screenshot from 2018-06-18 23-08-07.png


[root@foundation12 netns]# ip link set veth1 netns 4943  增長端口到namespace

查看net namespace

Screenshot from 2018-06-18 23-37-18.png

Screenshot from 2018-06-18 23-09-05.png

修更名字,添加IP和網關

[root@foundation12 netns]# ip netns exec 4943 ip link set veth1 name eth0
[root@foundation12 netns]# ip netns exec 4943 ip link set up eth0
[root@foundation12 netns]# ip netns exec 4943 ip addr add 172.17.0.100/24 dev eth0
[root@foundation12 netns]# ip netns exec 4943 ip route add default via 172.17.0.1


以下效果,none網絡變得能夠通訊

Screenshot from 2018-06-18 23-10-04.png

相關文章
相關標籤/搜索