Docker單機網絡下
前言
Docker系列文章:
此篇是Docker系列的第七篇,大家一定要按照我做的Demo都手敲一遍,印象會更加深刻的,加油!
Docker網絡初探
-
後台方式啟動一個最新版本的centos鏡像;
docker run -d -it --name centosworktest centos:latest
-
進入容器內部,查看容器的網絡信息,我們可以看到一個eth0的網卡信息,該網卡上掛載的一個Veth-Pair,通過Veth-Pair與內部的網橋通訊;
#查看容器信息
docker ps
#進入容器內部
docker exec -it ad9342449b86 /bin/bash
#查看網絡信息(yum install net-tools)
ifconfig

-
使用route -n查看容器內部的路由表信息,可以證實eth0是這個容器默認的通信的設備;

-
接下來我們退出容器,看下宿主機的網絡情況,我們可以看到宿主機網絡上掛載了一個Veth-Pair,猜測是掛載到docker0上的,這裡我們推斷docker0可能是一個bridge;

-
驗證docker0是否是bridge,我們可以通過brctl show(yum install -y bridge-utils)命令來查看,通過查看我們發現docker0果然是一個bridge;

-
通過上面的實驗我們可以猜測docker的網絡模型結構應該是類似於網絡篇上的結構,如下圖:

-
為了驗證結論的正確性,我們再次啟動一個centosworktest02的容器,檢查docker0是否掛載了新的Veth-Pair;
#後台方式啟動一個名字為centosworktest02的centos鏡像
docker run -d -it --name centosworktest02 centos:latest
#查看docker0是否掛掛載信息的Veth-Pair
brctl show
#查看網絡情況
ifconfig

-
通過驗證我們發現我們猜測基本正確,接下來我們驗證一下容器之間網絡的連通性,我們從centosworktest02 ping(yum install -y iputils) centosworktest,發現容器間的網絡也是通的;



經過一系列驗證,我們發現整體的猜測是正確的docker默認的在宿主機內部的網絡模型就是通過bridge和Veth-Pair進行通信的。
Docker網絡模型
實現原理
Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,同時Docker網橋是每個容器的默認網關。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的IP直接通信。
Docker網橋是宿主機虛擬出來的,並不是真實存在的網絡設備,外部網絡是無法尋址到的,這也意味着外部網絡無法通過直接容器IP訪問到容器。如果容器希望外部訪問能夠訪問到,可以通過映射容器端口到宿主主機端口,即docker run創建容器時候通過 -p 或 -P 參數來啟用,訪問容器的時候就通過[宿主機IP]:[容器端口]訪問容器。
網絡模型
bridge
bridge模式是Docker的默認網絡模式,也就是我們在網絡初探上探索的模式,這裡對其容器與宿主機的通信進行一個總結,當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,在此宿主機上啟動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。
容器啟動的時候會從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新創建的容器中,並命名為eth0的網卡,另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網絡設備加入到docker0網橋中,到這裡我們只是完成了宿主機與容器,同一主機上容器間的通信,此時容器還不能與外部網絡進行通信。
為了使外界可以訪問容器中的進程,docker採用了端口綁定的方式,也就是通過iptables的NAT,將宿主機上的端口流量轉發到容器內的端口上。當使用使用docker run -p時,就是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。

bridge模式中的容器與外界通信時,必定會佔用宿主機上的端口,從而與宿主機競爭端口資源,此外由於容器與外界通信是基於三層iptables NAT,性能和效率上的損耗肯定是不可避免的。


host
如果啟動容器的時候使用host模式,容器直接與宿主機使用同一網絡命令空間,採用此模式的容器,可以直接使用宿主機的IP地址與外面進行通信,如果宿主機具有公網的IP地址時,那容器也會擁有這個公有的IP地址,與此同時,容器內服務的端口地址也能直接使用宿主機的端口,無需再進行額外的NAT轉換。因此host最大的優勢就是網絡性能比較好,但是容器將不再擁有隔離、獨立的網絡棧。容器會與宿主機競爭網絡棧使用,容器內部將不再擁有所有的端口資源。

none
如果啟動容器的時候使用none模式,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網絡配置。容器中只有lo迴環地址,沒有其他網卡。這種類型的網絡沒有辦法聯網,封閉的網絡能很好的保證容器的安全性。

container
如果使用該模式新創建的容器和已經存在的容器會共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享IP、端口範圍等信息。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網卡設備通信。

結束
歡迎大家點點關注,點點贊!