docker 提供給咱們多種(4種)網絡模式,咱們能夠根據本身的需求來使用。例如咱們在一臺主機(host)或者同一個docker engine上面運行continer的時候,咱們就能夠選擇bridge網絡模式;而當咱們須要在多臺host上來運行多個container來協同工做的時候,overlay模式就是咱們的首選。html
當咱們完成docker engine的安裝之後,docker會在每個engine上面生成一個3種網絡,他們是:bridge, none 還有host。node
首先來侃一侃docker0. 之因此說它是默認的網絡,是因爲當咱們運行container的時候沒有「顯示」的指定網絡時,咱們的運行起來的container都會加入到這個「默認」 docker0 網絡。他的模式是bridge。docker
顧名思義,全部加入到這個網絡模式中的container,都"不能」進行網絡通訊。貌似有點雞肋。。。網絡
這種網絡模式將container與宿主機的網絡相連通,雖然很直接,可是卻破獲了container的隔離性,所以也比較雞肋。。。ide
因爲以前介紹的3種自帶的網絡模式有各自的侷限性,所以,docker推薦你們自定義網絡。經過自定義網絡,咱們能夠實現「服務發現」與「DNS解析」。工具
docker 容許咱們建立3種類型的自定義網絡,bridge,overlay,MACVLAN (目前我尚未用到)。post
與docker0相似,咱們能夠自定義bridge網絡,經過使用自定義bridge網絡,咱們就能夠實如今一臺host上的多個container之間的通訊。他的網絡模型以下(圖片來自docker官網):ui
docker_gwbridge
他在本質上仍是一個local的bridge網絡,可是他是咱們實現多個host之間的container通訊的基礎。一般狀況下,當咱們在連接swarm nodes的時候,docker_gwbridge網絡就會被在每個swarm節點上自動建立出來。url
docker提供給咱們兩種方式來定義overlay網絡,在docker1.12以前,咱們須要依靠第三方的工具( Consul, Etcd, and ZooKeeper (Distributed store))來經過註冊於寄存統一的「key-value」來實現「服務發現」和「DNS解析」,從而達到多個container不一樣host上的的通訊。 可是在docker1.12以後,咱們能夠直接用「原生態」的swarm來實現「服務發現」和「DNS解析」。spa
swarm在設計之初是爲了service(一組container)而服務的,所以經過swarm建立的overlay網絡在一開始並不支持單獨的container加入其中。可是在docker1.13, 咱們能夠經過「--attach」 參數聲明當前建立的overlay網絡能夠被container直接加入。
# docker network create --driver=overlay --attachable name=myOverlayNet
在建立overlay網絡以前,咱們須要先搭建swarm集羣,詳細內容能夠參考我以前的隨筆:
在這裏,咱們會很好奇爲何docker可以作到container之間的通訊呢? 答案就是 docker 內置的 DNS server. 關於他的詳細介紹,請參考官網連接。
https://docs.docker.com/engine/userguide/networking/configure-dns/