1. 程式人生 > >Docker學習(八)容器間單向通訊

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, 個人部落格 !