Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

#Docker Compose for MySQL Cluster & WordPress 建立 MySQL Galera 叢集,用 Docker Compose 快速建立 Master/Master DB 架構

示範如何將書中 MySQL Galera 叢集,改寫 Compose YAML檔案及參數,建置出 DB Mater/Master 架構,再配合 WordPress,以及上一個練習,Compose & Service Discovery 所學習到的 DNS-based 負載平衡機制,架設 WP 的 HA (高可用性)架構。 ##Galera Cluster 原出處:

#準備環境 ##Install Docker Machine 0.8.0 為快速建立雲端虛擬機,請安裝 Docekr Machine ,執行 wget https://github.com/docker/machine/releases/download/v0.8.0/docker-machine-`uname -s`-`uname -m` && \ sudo mv docker-machine-`uname -s`-`uname -m` /usr/local/bin/docker-machine && \ sudo chmod +x /usr/local/bin/docker-machine{{execute}}, 確認版本 docker-machine -v{{execute}} 。

##Install Docker 1.12 執行 sudo apt-get -y update{{execute}} 更新套件,接著安裝新版 Docker, sudo apt-get install -y docker-engine{{execute}} ,選擇保留原本設定,按 N{{execute}} ,完成後,執行 docker -v 確認版本。 ##Install Docker Compose 1.8.0 Docker Composer V2 需要配合 Docker 1.10 之後版本, 依照 Compose 文件,執行 curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > ./docker-compose{{execute}} 和 chmod +x ./docker-compose && sudo mv ./docker-compose /usr/local/bin/docker-compose{{execute}} ,完成 docker-compose 安裝,一樣確認版本 docker-compose -v{{execute}} 。

##建立 Azure 虛擬機 為真實模擬實際營運環境,使用 Docker Machine 快速建立 VM ,執行 docker-machine create -d azure --azure-subscription-id="XXXXX" --azure-location="westeurope" --azure-image canonical:ubuntuserver:16.04.0-LTS:16.04.201608150 --azure-size Standard_A1 --engine-install-url https://get.docker.com docker-00-node01{{execute}}, 建立完成,利用 docker-machine env 指令將 Docker Engine Server 指定到遠端 Azure 主機, eval $(docker-machine env docker-00-node01){{execute}}, 輸入 docker info{{execute}} 確認電腦資訊。

#解說 Galera 定義檔 ##Docker Network Docker Network 是從 Docker 1.9 所新增的功能,可用來建立一個跨多台 Docker 伺服器的層疊網路,其利用 VXLAN 通訊協定。層疊技術的好處在於它提供每個容器具有相同子網路的 IP 位址,並且也能透過變更每個容器的 /etc/hosts 來管理名稱解析,因此每個容器都啟動在相同層疊網路,用各自的容器名稱,就可連線到其他任何一個容器。

執行 docker network -h{{execute}} ,來查看有哪些指令。

##複製範例庫 請執行 git clone https://github.com/philipz/compose_galera_wordpress{{execute}}, 切換到此範例目錄,cd compose_galera_wordpress{{execute}}, 首先,來看 galera.yml 定義檔內容:

version: "2"

services:
  master:
    image: erkules/galera:basic
    container_name: master
    volumes:
      - /data:/var/lib/mysql
    networks:
      - mysql
    command: --wsrep-cluster-name=local-test --wsrep-cluster-address=gcomm://

  slave:
    depends_on:
      - master
    image: erkules/galera:basic
    networks:
      - mysql
    command: --wsrep-cluster-name=local-test --wsrep-cluster-address=gcomm://master

networks:
  mysql:

主要是由兩個服務所組成,分別是 Master 和 Slave ,但此 Galera Cluster 是 Master-Master 資料庫架構,此命名只是方便識別。 Master 服務先啟動,方便 Slave 利用那 Command: --wsrep-cluster-name=local-test --wsrep-cluster-address=gcomm://master 來連線到 Master,並且加上 depends_on: 設定,確保 Master 服務啟動好,才執行 Slave 服務,相關啟動順序細節,請參閱 Controlling startup order in Compose

最下面 networks: 則是建立 Docker Network ,與 docker network create mysql 指令相同。而 Master 和 Slave 服務都設定在 mysql 層疊網路上。

#建立 Galera Cluster ##啟動 Galera Cluster 瞭解了 Compose 定義檔內容,接著就是啟動這服務。執行 docker-compose -f galera.yml up -d{{execute}}, 等待 pull 那 Galera 映像檔後,就建置完成。

顯示服務的標準輸出結果,可執行 docker-compose -f galera.yml logs slave{{execute}}, 確認服務是否有錯誤訊息。

若其中有服務未完成啟動,可執行 docker-compose -f galera.yml up -d slave{{execute}}, 嘗試再一次啟動容器服務。

查看其服務的狀態, docker-compose -f galera.yml ps{{execute}}, 為何不直接執行 docker-compose ps{{execute}}, 反而加上 -f galera.yml 是因為,docker-compose 預設使用檔案名稱為 docker-compose.yml ,若不用此名稱,就需要透過 -f 指定。

確認啟動完成,再登入到容器中,確認資料庫叢集狀態,docker exec -ti master bash{{execute}}, 進入容器後,執行 mysql -e 'show status like "wsrep_cluster_size"'{{execute}}, 即顯示目前叢集數量。

#解說 Wordpress 定義檔 ##準備資料庫 再來設定 Wordpress 所需的資料庫和帳號權限。 執行 mysql{{execute}}, 資料庫:CREATE DATABASE wordpress;{{execute}}, 帳號:CREATE USER 'wordpress'@'%' IDENTIFIED BY 'PASSWORD';{{execute}}, 權限:GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%' WITH GRANT OPTION;{{execute}}, 最後跳出 mysql 程式 exit{{execute}}, 並登出容器 exit{{execute}}。

##Wordpress 定義檔 接著,看一下 wordpress.yml 內容:

version: "2"

services:
  wordpress:
    image: wordpress
    networks:
      - mysql
    environment:
      - WORDPRESS_DB_HOST=slave:3306
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=PASSWORD
    ports:
      - "80:80"

networks:
  mysql:

與之前 galera.yml 定義檔相同,都是使用 mysql 的層疊網路,直接利用官方 wordpress 映像檔,故需定義相關環境變數,請注意那 WORDPRESS_DB_HOST=slave:3306 是連線到 slave 服務容器。

#建立 Wordpress ##啟動 Wordpress 執行 docker-compose -f wordpress.yml up -d{{execute}}, 等待 pull 那 Wordpress 映像檔後,便建置完成。

啟動後,執行 docker-machine ls{{execute}}, 用瀏覽器開啟此 IP 就可看到 Wordpress 安裝畫面,並依指示完整安裝。

##停止所有服務 都操作完成後,便先停止 Wordpress 服務,docker-compose -f wordpress.yml down{{execute}}, 再來停止全部 Galera 服務,docker-compose -f galera.yml down{{execute}}。 完成後,確認目前容器狀況,docker ps{{execute}}。

##合併 Galera 和 Wordpress 最後,將兩個定義檔合併成一個,請見 galera_wordpress.yml 內容,接著一次啟動所有服務, docker-compose -f galera_wordpress.yml up -d{{execute}}, 確認所有服務的狀態, docker-compose -f galera_wordpress.yml ps{{execute}}, 用瀏覽器開啟此虛擬機 IP ,就可看到 Wordpress 已安裝好畫面。

##動態擴展 之前查看過資料庫叢集數量,此時動態增加 Slave 的數量,執行 docker-compose -f galera_wordpress.yml scale wordpress=2{{execute}}, 擴展完成,可登入到 wordpress 容器中,加上 test.html 來驗證負載平衡功能。

#SUMMARY 此操作,示範如何使用 Docker Compose 和 Docker Network 整合之功能,善用這 overlay 層疊網路,很輕鬆就可配置出可動態擴展的架構,並且無須額外設定,即可達到動態配置和負載平衡,不過此範例只適用於開發測試環境,若要應用到營運環境,則須配合 Docker Swarm 容器協同運作管理工具,部署到多台虛擬主機上。