目錄
1,概述
docker run創建Docker容器時,可以用–net選項指定容器的網絡模式,Docker有以下4種網絡模式:
bridge模式:使--net =bridge指定,默認設置;
host模式:使--net =host指定;
none模式:使--net =none指定;
container模式:使--net =container:NAMEorID指定。
可以使用docker network ls來查看
下面我們分別來講解docker的四種網絡模式:
2,bridge模式
bridge模式是Docker默認的網絡設置,此模式會爲每一個容器分配Network Namespace、設置IP等,並將並將一個主機上的Docker容器連接到一個虛擬網橋上。當Docker server啓動時,會在主機上創建一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。接下來就要爲容器分配IP了,Docker會從RFC1918所定義的私有IP網段中,選擇一個和宿主機不同的IP地址和子網分配給docker0,連接到docker0的容器就從這個子網中選擇一個未佔用的IP使用。如一般Docker會使用172.17.0.0/16這個網段,並將172.17.42.1/16分配給docker0網橋(在主機上使用ifconfig命令是可以看到docker0的,可以認爲它是網橋的管理端口,在宿主機上作爲一塊虛擬網卡使用)。
具體操作:
啓動容器:(由於是默認設置,這裏沒指定網絡–net =bridge,可以看到容器內創建了eth0)
使用ping命令連接Host網絡發現,容器與Host網絡是連通的:
eth0實際上是veth pair的一端,另一端(veth945c)連接在docker0網橋上:
3,host模式
如果啓動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。
使用host模式啓動容器:
使用host模式啓動容器後可以發現,使用ip addr查看網絡環境時,看到的都是宿主機上的信息。這種方式創建出來的容器,可以看到host上的所有網絡設備。
容器中,對這些設備有全部的訪問權限。因此docker提示我們,這種方式是不安全的。如果在隔離良好的環境中(比如租戶的虛擬機中)使用這種方式,問題不大。
4,none模式
在none模式下,Docker容器擁有自己的Network Namespace,但是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己爲Docker容器添加網卡、配置IP等。
使用--net =none模式啓動容器:
5,container模式
這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
使用--net =container模式啓動容器:
通過該例子可以看出來,兩者的網絡完全相同。