docker 提供給我們多種(4種)網絡模式,我們可以根據自己的需求來使用。例如我們在一台主機(host)或者同一個docker engine上面運行continer的時候,我們就可以選擇bridge網絡模式;而當我們需要在多台host上來運行多個container來協同工作的時候,overlay模式就是我們的首選。
當我們完成docker engine的安裝以后,docker會在每一個engine上面生成一個3種網絡,他們是:bridge, none 還有host。
默認網絡模式 - bridge
首先來侃一侃docker0. 之所以說它是默認的網絡,是由於當我們運行container的時候沒有“顯示”的指定網絡時,我們的運行起來的container都會加入到這個“默認” docker0 網絡。他的模式是bridge。
無網絡模式 - none
顧名思義,所有加入到這個網絡模式中的container,都"不能”進行網絡通信。貌似有點雞肋。。。
宿主網絡模式 - host
這種網絡模式將container與宿主機的網絡相連通,雖然很直接,但是卻破獲了container的隔離性,因此也比較雞肋。。。
自定義網絡
由於之前介紹的3種自帶的網絡模式有各自的局限性,因此,docker推薦大家自定義網絡。通過自定義網絡,我們可以實現“服務發現”與“DNS解析”。
docker 允許我們創建3種類型的自定義網絡,bridge,overlay,MACVLAN (目前我還沒有用到)。
自定義bridge網絡
與docker0類似,我們可以自定義bridge網絡,通過使用自定義bridge網絡,我們就可以實現在一台host上的多個container之間的通信。他的網絡模型如下(圖片來自docker官網):

docker_gwbridge
他在本質上還是一個local的bridge網絡,但是他是我們實現多個host之間的container通信的基礎。通常情況下,當我們在鏈接swarm nodes的時候,docker_gwbridge網絡就會被在每一個swarm節點上自動創建出來。
自定義Overlay網絡
docker提供給我們兩種方式來定義overlay網絡,在docker1.12之前,我們需要依靠第三方的工具( Consul, Etcd, and ZooKeeper (Distributed store))來通過注冊於寄存統一的“key-value”來實現“服務發現”和“DNS解析”,從而達到多個container不同host上的的通信。 但是在docker1.12之后,我們可以直接用“原生態”的swarm來實現“服務發現”和“DNS解析”。
swarm在設計之初是為了service(一組container)而服務的,因此通過swarm創建的overlay網絡在一開始並不支持單獨的container加入其中。但是在docker1.13, 我們可以通過“--attach” 參數聲明當前創建的overlay網絡可以被container直接加入。
# docker network create --driver=overlay --attachable name=myOverlayNet
在創建overlay網絡之前,我們需要先搭建swarm集群,詳細內容可以參考我之前的隨筆:
Docker - 運行 containers 使用在 swarm 模式下創建的 overlay 模式的 network
Docker 內置的DNS server
在這里,我們會很好奇為什么docker能夠做到container之間的通信呢? 答案就是 docker 內置的 DNS server. 關於他的詳細介紹,請參考官網鏈接。
https://docs.docker.com/engine/userguide/networking/configure-dns/
