簡介
在接觸docker的第一天起,大家應該就知道:docker容器使用沙箱機制,相互之間沒有介面,一般情況下內部訪問通過IP+埠。本地容器預設分配的IP極易發生變化,所以靠IP+埠訪問的方式缺失穩定性。單機模式暫且不講,叢集模式下容器間的通訊僅通過內部IP是無法訪問的。docker給出解決方案是link和network,本文介紹一下network(link操作會複雜化容器之間的關係,本文既不推薦,也不予詳解)。
如果對docker基礎不清楚的,這裡(強行安利一波)送一波傳送門:映象倉庫、docker部署netcore、docker安裝——centos、docker資料卷——nginx、docker資料卷——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
再說點沒用的
容器通訊這個問題就像冰山,看起來很簡單,實際上水面以下還藏著很多未知。當應用的規模脫離單機,向叢集、微服務演變時,才發覺單機下的通訊只是冰山一角,很多問題在解決以後才發現,原來都是因為原理不夠清晰。
現在我覺得,並不是所有東西我們都要學(即便它真的很酷),如果因為學了就要去用,那就像孔雀的羽毛一樣華而不實。適合的才是最好。