docker網路有四種模式,bridge是docker預設的配置。下面是docker官網對於bridge模式的解釋:`
對於docker來說,網橋模式使用乙個網橋來允許連線在同乙個網橋上的容器進行通訊,同時它使得沒有連線在同乙個網橋上的容器隔離開。bridge模式在主機上自動配置規則從而使得連線不同網橋的容器不能直接的和彼此通訊由此可知,當我們的容器是處於同乙個daemon(即是同一臺主機)下的時候,預設的網路模式是bridge。當我們建立乙個容器的時候,docker會自動的建立乙個叫docker0的網橋,然後你之後再不特意指定網路模式的情況下都會自動連線到docker0網橋上。網橋適用於執行在相同的docker daemon上的容器。對於執行在不同的docker daemon上的容器,你能通過配置機器上的路由或者使用overlay network來進行通訊<
`
要了解docker中的bridge模式,我們首先了解下linux下的bridge。linux bridge模組是linux kernel網路模組的乙個重要組成部分,主要是用來保障不同虛擬機器之間的通訊或者是虛擬機器與主機之間的通訊,詳情如下(圖來自於
如圖可知,linux bridge主要有兩個作用。第乙個是連線虛擬機器和主機,圖中的etho為主機網絡卡,bro為網橋,虛擬機器和網橋之間通過br0進行通訊。第二個作用是連線兩台虛擬機器,如圖兩台虛擬機器都連線在同乙個網橋上,因為它們可以和彼此進行通訊。
看了liunx bridge,我們因此可知docker bridge的作用就是連線我們的容器和主機或者多個容器。下面我們來看一下docker bridge實現的技術:veth pair、network namespace和nat。
首先,veth pair是專門為liunx container所建的裝置,它的作用很簡單,就是把從乙個network namespace發出的資料報**到另乙個namespace,veth裝置總是成對出現的,乙個在container裡面,乙個在container外面(注意這裡的container是liunx container,不過你要理解成docker container也行,因為docker本來就是基於liunx container技術的)。在docker中,veth pair建立了veth0和veth1,然後將veth0放在我們的網橋docker0上,veth1則是在我們容器上。veth pair的作用就是無論veth0還是veth1接收到網路報文,都會無條件的傳輸給另一方,這樣網橋docker 0接受到報文後就會傳遞給相應的容器。
linux中的namespace內容太多,建議有興趣的小夥伴自己去google一下。這裡我就簡單的說一下它的作用:將容器與主機以及容器和容器之間的網路隔離開,每個容器都有自己的network namespace,這樣看起來他們每個都是處於不同的網路空間中,從而實現了docker的網路隔離。
nat全稱為網路位址轉換,即是將收到的資料報進行位址的修改,比如snat就是修改資料報的源位址,dnat就是修改資料報的目的地的位址。
基礎的知識我們知道了,接下來我們來看具體的通訊過程:
資料報的流向如下圖所示:
我們來看具體過程,首先我們的容器傳送資料報到veth1,然後通過veth我們知道veth0接受到相同的資料報,然後veth0傳遞到docker0網橋,在這裡我們進行sdat轉換,因為我們原本的資料報是從容器發出的,所以資料報的源位址肯定是像172.**.0.*的位址,然後sdat後將源位址修改為你主機的位址,這樣外面訪問的**受到的資料報就像是從主機發出的一樣。
同理我們的外部訪問容器也差不多,只是進行的是dnat。
在官方文件中(位址為官方建議在生產環境中不要使用預設的docker bridge模式,建議開發者建立自己的網橋。這樣有幾個好處:
自己建立的網橋可以設定自己的dns
容器可以很方便的從乙個自己的網橋轉移到另乙個網橋
自己建立的網橋可以自己定製網橋的配置
連線在預設網橋上的容器有相同的環境變數,而自己建立的網橋可以自己配置環境變數
關於如何建立自己的網橋大家可以去官方文件詳細檢視。
docker的bridge模式適用於一台主機上的容器間的通訊,對於不同的主機來說docker採用的是overlay模式,overlay網路我會在接下來提到。
Docker網路詳解之Overlay
我們在上篇文章說了docker在單個docker daemon 即是單主機 模式下面的時候網路預設為bridge,既然提到了單個docker daemon,那麼多主機即是集群的模式的情況下呢?在這種模式下docker預設使用overlay網路來進行容器間的通訊。接下來我們看看我們在加入乙個集群或者初...
Docker網路詳解
先關閉docker sudo service docker stop 關閉網橋docker0 新增自己的網橋bridge0 sudo ifconfig docker0 down sudo brctl addbr bridge0 sudo ifconfig bridge0 192.168.227.1 ...
Docker網路詳解
docker使用linux橋接,在主機虛擬乙個docker0網路介面,在主機中執行命令檢視 list host bridges sudo brctl show bridge name bridge idstp enabled inte ces docker0 8000.000000000000 no...