Docker學習(八)容器間單向通訊
Docker學習(八)容器間單向通訊
前言
在之前的文章中介紹的內容都是容器映象和容器執行,沒有涉及到多個容器之前通訊,如果是多個容器之間需要互相呼叫,如何通訊呢?
docker維護著每個容器的元資訊,可以通過IP通訊,但是在docker環境中每個容器重啟之後,容器的虛擬IP都會變動,這樣的情況下我們該如何處理? 我們帶著這兩個疑問看一下今天的內容
場景
如果我們部署了一個tomcat應用,這個應用需要連線mysql資料庫,這種場景下,我們需要讓tomcat可以訪問mysql資料庫,這就需要使兩個容器之間可以通訊
實現通訊的方法
- [x] 在容器啟動的時候,為每個容器指定一個名字,兩者通訊使用容器名稱來識別對方容器
- [x] 基於bridge實現容器間雙向通訊
環境準備
- tomcat容器
- 應用名稱 mywebapp
- 資料庫容器(只是為了測試,我們使用一個centos容器模擬mysql )
- 應用名 database
建立目錄/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
- 進入mywebapp容器
docker exec -it 7e631f5cf4b3 /bin/bash
在mywebapp
容器中執行ping 172.17.0.3
可以正常訪問database
容器,說明IP訪問天然互通的
但是
ping database
是不通的,因為我們沒有進行網路方面的配置
- 退出容器,移除
mywebapp
docker rm 7e631f5cf4b3 -f
- 重新啟動容器mywebapp時增加一個引數 -link 啟動容器
docker run -d --name mywebapp --link database tomcat
- 進入容器內部
docker ps
docker exec -it 0c435a5112c4 /bin/bash
> 執行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
- 我們驗證一下
[x]
docker ps
[x] 進入mywebapp執行ping命令
docker exec -it 16fbe8f31ce5 /bin/bash
ping database
[x] 進入database,執行ping命令
docker exec -it 15e732e718c2 /bin/bash
ping mywebapp
到這裡我們已經實現了兩個容器的互連互通了
總結
作為容器的互通,最核心的點就是建立一個新的網橋,然後將容器與這個網橋繫結是即可
網橋為什麼可以實現互聯互通
每當建立一個網橋,會在宿主機上就建立一個虛擬網絡卡,承擔了一個閘道器的作用,實現兩個容器的互通
- 虛擬網絡卡和宿主機的物理網絡卡進行通訊,將資料 包轉成物理網絡卡的資料包發出去
- 反之物理網絡卡收到的資料包,也會轉換成虛擬網絡卡的資料 包,轉發給虛擬網絡卡,虛擬網絡卡然後再轉給容器
寫在最後
相關文章會首發公眾號,可以關注公號albk,關注後可以獲取大量學習視訊
期望熱愛技術的你一起來交流,獲取最新資料和學習資源,可以關注公眾號albk, 個人部落格 !