在以前的文章中介紹的內容都是容器鏡像和容器運行,沒有涉及到多個容器以前通訊,若是是多個容器之間須要互相調用,如何通訊呢?
docker維護着每一個容器的元信息,能夠經過IP通訊,可是在docker環境中每一個容器重啓以後,容器的虛擬IP都會變更,這樣的狀況下咱們該如何處理? 咱們帶着這兩個疑問看一下今天的內容mysql
若是咱們部署了一個tomcat應用,這個應用須要鏈接mysql數據庫,這種場景下,咱們須要讓tomcat能夠訪問mysql數據庫,這就須要使兩個容器之間能夠通訊web
tomcat容器sql
數據庫容器(只是爲了測試,咱們使用一個centos容器模擬mysql )docker
建立目錄/usr/local/docker/communication
數據庫
目標:tomcat容器能夠訪問database容器
mywebapp
tomcat容器docker run -d --name mywebapp tomcat
database
docker run -d --name database -it centos7 /bin/bash
docker ps
docker inspect bf7b05ce9a06
在NetworkSettings中的屬性IPAddress能夠看到容器的虛擬IP地址 172.17.0.3
centos
docker exec -it 7e631f5cf4b3 /bin/bash
在 mywebapp
容器中執行ping 172.17.0.3
能夠正常訪問database
容器,說明IP訪問自然互通的tomcat
可是
ping database
是不通的,由於咱們沒有進行網絡方面的配置
mywebapp
docker rm 7e631f5cf4b3 -f
bash
docker run -d --name mywebapp --link database tomcat
網絡
docker ps
docker exec -it 0c435a5112c4 /bin/bash
app
> 執行ping database 是能夠訪問通的,這樣就經過link 實現了容器間的單向通訊,在mywebapp中鏈接數據庫時,使用database這個容器名便可,只要容器名稱不變,就能夠訪問到
經過link能夠實現單向經過,固然 也能夠實現雙向經過,可是配置會比較麻煩,當應用集羣過大的時候,工做量太大,其實咱們可使用網橋實現,容器間的互相通訊
網橋是虛擬的網絡橋接,做用是從網絡層面對容器進行分組,將指定的容器都綁定到同一個網橋上,這些被綁定的容器就能夠實現互相通訊
docker rm -f 0c435a5112c4
docker rm -f bf7b05ce9a06
docker run -d --name mywebapp tomcat
docker run -d -it --name database centos /bin/bash
docker ps
查看docker的謹慎網絡服務明細docker network ls
默認每個docker底層都會提供一個默認的網橋,承擔容器與外部的通訊的職責
docker network create -d bridge my-bridge
docker network ls
這樣全部綁定到my-bridge上的容器,均可以互相通訊
docker network connect my-bridge mywebapp
docker network connect my-bridge database
docker ps
docker exec -it 16fbe8f31ce5 /bin/bash
ping database
[x] 進入database,執行ping命令docker exec -it 15e732e718c2 /bin/bash
ping mywebapp
![此處輸入圖片的描述][15]
到這裏咱們已經實現了兩個容器的互連互通了
做爲容器的互通,最核心的點就是建立一個新的網橋,而後將容器與這個網橋綁定是便可
每當建立一個網橋,會在宿主機上就建立一個虛擬網卡,承擔了一個網關的做用,實現兩個容器的互通
- 虛擬網卡和宿主機的物理網卡進行通訊,將數據 包轉成物理網卡的數據包發出去
相關文章會首發公衆號,能夠關注公號albk,關注後能夠獲取大量學習視頻
指望熱愛技術的你一塊兒來交流,獲取最新資料和學習資源,能夠關注公衆號albk, 我的博客 !