在使用docker run指令建立Docker容器,可以用-net選項指定容器的網絡模式,Docker的網絡模式分為以下四種:
1.bridge模式:使用-net=bridege指定,預設模式,此模式會為每個容器配置設定一個name space和ip。
2.host模式:使用-net=host指定,使用主控端的IP和端口,共用namespace。
3. none模式:使用-net=none指定,有獨立namespace,但需要手動加入ip和配置網卡。
4.container模式:使用-net=container:NAMEor ID指定,和指定容器共享namespace,ip
一:bridge模式
bridge模式是docker的預設網絡模式。此模式會為每個容器配置設定一個name space和ip。并将一個主機上的容器連接配接到一個虛拟網橋上,當dacker server啟動時,會在主機上建立一個docker0的虛拟網橋,
此主機上啟動的容器都會連接配接到這個虛拟網橋,虛拟網橋的工作方式和實體交換機類似,這樣主機上的所有容器就通過交換機連接配接在一個二層網絡中,接下來就為容器配置設定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的一端,另一端(veth 491226e)連接配接在docker0網橋上:
列出目前主機網橋:
二: host模式
如果啟動容器的時候使用host模式,那麼這個容器将不會獲得一個獨立的Network Namespace,而是和主控端共用一個Network Namespace。容器将不會虛拟出自己的網卡,配置自己的IP等,而是使用主控端的IP和端口。
使用host模式啟動容器:
使用host模式啟動容器後可以發現,使用ip addr檢視網絡環境時,看到的都是主控端上的資訊。這種方式建立出來的容器,可以看到host上的所有網絡裝置。
容器中,對這些裝置有全部的通路權限。是以docker提示我們,這種方式是不安全的。如果在隔離良好的環境中(比如租戶的虛拟機中)使用這種方式,問題不大。
三: none模式
在none模式下,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等資訊。需要我們自己為Docker容器添加網卡、配置IP等。
使用–net =none模式啟動容器:
四: container模式
這個模式指定新建立的容器和已經存在的一個容器共享一個Network Namespace,而不是和主控端共享。新建立的容器不會建立自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如檔案系統、程序清單等還是隔離的。兩個容器的程序可以通過lo網卡裝置通信。
使用–net =container模式啟動容器:
通過該例子可以看出來,兩者的網絡完全相同。