docker生產——容器通訊

小白鏟屎官發表於2020-11-19

簡介

在接觸docker的第一天起,大家應該就知道:docker容器使用沙箱機制,相互之間沒有介面,一般情況下內部訪問通過IP+埠。本地容器預設分配的IP極易發生變化,所以靠IP+埠訪問的方式缺失穩定性。單機模式暫且不講,叢集模式下容器間的通訊僅通過內部IP是無法訪問的。docker給出解決方案是link和network,本文介紹一下network(link操作會複雜化容器之間的關係,本文既不推薦,也不予詳解)。

如果對docker基礎不清楚的,這裡(強行安利一波)送一波傳送門:映象倉庫docker部署netcoredocker安裝——centosdocker資料卷——nginxdocker資料卷——mysql

network

network可以稱之為網橋,如果給不同容器指定了相同網橋,那麼它們之間是可以相互訪問的。

使用以下命令檢視docker的網橋:

docker network ls

這三個是預設的。在預設情況下,所有容器建立時都會被指派到bridge(這裡說的是name而非driver)網橋下,使用以下命令檢視bridge資訊:

docker inspect bridge

資訊會有很多,在海量的資訊中找到Containers節點,這個節點記憶體儲了包含在本網橋下的所有容器。因為同在一個網橋下,所以訪問是沒問題的(容器asp_net_core是web應用,mysql01是資料庫,nginx001是web伺服器,彼此關聯):

網橋的型別

如上圖所示,預設的網橋型別有三種:bridge、host、none。

bridge類似於虛擬機器內網模式,host代表直接使用宿主機網路,none表示容器不使用任何網路。

假設你的伺服器IP為 127.0.0.1 ,內有容器A和B,其中A在host模式網橋下,B在bridge模式網橋下,那麼你訪問A可以直接使用 127.0.0.1:對應埠,訪問B則需要先使用-p指令將伺服器IP對映到B中。

常用命令

新增
docker network create [-d 網橋型別] 網橋別名
ps:可以使用-d更改型別,如果不使用-d命令,則預設bridge。

刪除
docker network rm 網橋別名

檢視列表
docker network ls

檢視詳情
docker inspect 網橋別名

新容器指定網橋
docker run --name 容器別名 --network 網橋別名 映象名:版本/映象ID
PS:此命令不影響-v、-p等命令的使用

已有容器加入網橋
docker network connect 網橋別名 容器別名/容器ID

再說點沒用的

容器通訊這個問題就像冰山,看起來很簡單,實際上水面以下還藏著很多未知。當應用的規模脫離單機,向叢集、微服務演變時,才發覺單機下的通訊只是冰山一角,很多問題在解決以後才發現,原來都是因為原理不夠清晰。

現在我覺得,並不是所有東西我們都要學(即便它真的很酷),如果因為學了就要去用,那就像孔雀的羽毛一樣華而不實。適合的才是最好。

相關文章