簡介
在接觸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
再說點沒用的
容器通信這個問題就像冰山,看起來很簡單,實際上水面以下還藏着很多未知。當應用的規模脫離單機,向集群、微服務演變時,才發覺單機下的通信只是冰山一角,很多問題在解決以后才發現,原來都是因為原理不夠清晰。
現在我覺得,並不是所有東西我們都要學(即便它真的很酷),如果因為學了就要去用,那就像孔雀的羽毛一樣華而不實。適合的才是最好。