Docker學習(八)容器間單向通訊

前言

在以前的文章中介紹的內容都是容器鏡像和容器運行,沒有涉及到多個容器以前通訊,若是是多個容器之間須要互相調用,如何通訊呢?

docker維護着每一個容器的元信息,能夠經過IP通訊,可是在docker環境中每一個容器重啓以後,容器的虛擬IP都會變更,這樣的狀況下咱們該如何處理? 咱們帶着這兩個疑問看一下今天的內容mysql

場景

若是咱們部署了一個tomcat應用,這個應用須要鏈接mysql數據庫,這種場景下,咱們須要讓tomcat能夠訪問mysql數據庫,這就須要使兩個容器之間能夠通訊web

實現通訊的方法

  • [x] 在容器啓動的時候,爲每一個容器指定一個名字,二者通訊使用容器名稱來識別對方容器
  • [x] 基於bridge實現容器間雙向通訊

環境準備

  • tomcat容器sql

    • 應用名稱 mywebapp
  • 數據庫容器(只是爲了測試,咱們使用一個centos容器模擬mysql )docker

    • 應用名 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.3centos

  • 進入mywebapp容器

docker exec -it 7e631f5cf4b3 /bin/bash
mywebapp 容器中執行ping 172.17.0.3 能夠正常訪問database容器,說明IP訪問自然互通的tomcat

此處輸入圖片的描述

可是 ping database 是不通的,由於咱們沒有進行網絡方面的配置

此處輸入圖片的描述

  • 退出容器,移除mywebapp

docker rm 7e631f5cf4b3 -f bash

此處輸入圖片的描述

  • 從新啓動容器mywebapp時增長一個參數 -link 啓動容器

docker run -d --name mywebapp --link database tomcat網絡

此處輸入圖片的描述

  • 進入容器內部

docker ps
docker exec -it 0c435a5112c4 /bin/bashapp

此處輸入圖片的描述

> 執行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

    ![此處輸入圖片的描述][15]

    到這裏咱們已經實現了兩個容器的互連互通了

總結

做爲容器的互通,最核心的點就是建立一個新的網橋,而後將容器與這個網橋綁定是便可

網橋爲何能夠實現互聯互通

每當建立一個網橋,會在宿主機上就建立一個虛擬網卡,承擔了一個網關的做用,實現兩個容器的互通
此處輸入圖片的描述

  • 虛擬網卡和宿主機的物理網卡進行通訊,將數據 包轉成物理網卡的數據包發出去
  • 反之物理網卡收到的數據包,也會轉換成虛擬網卡的數據 包,轉發給虛擬網卡,虛擬網卡而後再轉給容器

寫在最後

相關文章會首發公衆號,能夠關注公號albk,關注後能夠獲取大量學習視頻

指望熱愛技術的你一塊兒來交流,獲取最新資料和學習資源,能夠關注公衆號albk, 我的博客 !
相關文章
相關標籤/搜索