1. 程式人生 > >docker 之網絡配置

docker 之網絡配置

其他 5.1 ack net new ubunt comm scree 刪除

Docker 網絡實現

首先,要實現網絡通信,機器需要至少一個網絡接口(物理接口或虛擬接口)來收發數據包;此外,如果不同子網之間要進行通信,需要路由機制。

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


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

veth pair)。

創建網絡參數

Docker 創建一個容器的時候,會執行如下操作:

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

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

  • 容器一端放到新容器中,並修改名字作為 eth0,這個接口只在容器的名字空間可見;

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

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


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

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

  • --net=host 告訴 Docker 不要將容器網絡放到隔離的名字空間中,即不要容器化容器內的網絡。此時容器使用本地主機的網絡,它擁有完全的本地主機接口訪問權限。容器進程可以跟主機其 它 root 進程一樣可以打開低範圍的端口,可以訪問本地網絡服務比如 D-bus,還可以讓容器做一些影響整個主機系統的事情,比如重啟主機。因此使用這個選項的時候要非常小心。如果進一步的使用 --privileged=true,容器會被允許直接配置主機的網絡堆棧。

  • --net=container:NAME_or_ID 讓 Docker 將新建容器的進程放到一個已存在容器的網絡棧中,新容器進程有自己的文件系統、進程列表和資源限制,但會和已存在的容器共享 IP 地址和端口等網絡資源,兩者進程可以直接通過 lo

    環回接口通信。

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

四種單節點網絡模式

1、bridge 模式

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

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

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

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

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

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

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

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

技術分享圖片

2、Host 模式


定義:

Host 模式並沒有為容器創建一個隔離的網絡環境。而之所以稱之為host模式,是因為該模式下的 Docker 容器會和 host 宿主機共享同一個網絡 namespace,故 Docker Container可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信。換言之,Docker Container的 IP 地址即為宿主機 eth0 的 IP 地址。其特點包括:


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

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

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

  • host 模式能夠和其它模式共存

技術分享圖片


3、container 模式

定義:

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

技術分享圖片

4、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

技術分享圖片


查看物理機

技術分享圖片

物理機橋接情況

技術分享圖片


設定為none 模式


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


技術分享圖片

技術分享圖片


查看PID:

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

技術分享圖片



虛擬化網絡都是基於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:

技術分享圖片



技術分享圖片


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

在當前namespace可以看到veth0和veth1

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

技術分享圖片



技術分享圖片


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


技術分享圖片


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

[root@foundation12 netns]# ip addr

技術分享圖片

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

技術分享圖片


技術分享圖片


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

查看net namespace

技術分享圖片

技術分享圖片

修改名字,添加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網絡變得可以通信

技術分享圖片




docker 之網絡配置