新手發文

使用 Docker Compose 部屬 Services

Kevin Lin 2019/10/04 12:29:00
116

一、前言

Docker Compose 是一個工具,用來定義與執行多個 container 組成的 Docker Applications。

你可以使用 Docker Compose 檔案來組態設定你的應用服務,然後使用單一命令,透過你的組態設定來建立與啟動你的服務可以讓你可以透過一個指令就可以控制所有專案中所需要的 services簡單來說就是用來管理 Container 的組態設定文件。適合用來開發、測試、與建立 staging 環境

 

二、主題

Docker Compose 與 Dockerfile 不同之處在於:

Dockerfile 是用來描述映像檔(image)的文件,而 Docker Compose 主要是用來描述 Service 之間的相依性和調度方式

Docker Compose 是用 YAML 檔案格式來描述和定義專案中 services 運作關係(YAML 檔案格式,需注意的是它的縮排規定要空白鍵,副檔名可為 .yaml 或  .yml官方在2006年推薦使用 .yaml 作為副檔名

首先依自身作業系統至官方網站下載Docker,安裝時就會一併安裝 docker-compose 工具。

需注意安裝 Docker 時需要 Hyper-V若作業系統較舊(如:Win10 專業版以下),則要下載 Docker Toolbox可以到 github - docker/compose 查看最新版本的 docker-compose 與如何下載安裝。

以下文章範例為使用 Win10 專業版

使用 Docker Compose 有基本的三個處理步驟:

    1.使用 Dockerfile 定義你的 app 環境,讓它可以在任何地方都能複製。

    2.使用 docker-compose.yaml 定義你的服務,讓他們可以在獨立環境內一起執行。

    3.執行 docker-compose up,Compose 將會開始與執行你所有的 app。

 

以下將簡單介紹使用 Docker Compose 來設定啟動一個 Mysql 服務

首先docker-compose.yaml 檔案內容大致上如下:

version:compose file 版本,目前最新的 Compose file 為版本 3。這是一定要加的,不然在執行 docker-compose up 時會一直出現無法理解的錯誤。

Compose file 會分為三大組態設定,分別為 services、networks 以及 volumes:

    1.services:

    services 主要讓你定義你應用服務啟動時,用來執行的 container 相關資訊,比如說 image 是用哪個、是不是要透過 Dockerfile 先進行編譯、要        不要覆寫預設 command 或是 entrypoint、環境變數為何、port 導出與對應等等的,這些參數多半在 docker run 指令有相對應的參數。

    .image

        指定 container 要從哪個 image 啟動。本文範例使用 Docker Hub 上的 Mysql image ,可於分號後選擇版本號,

        若省略則預設為 latest 版本。

    .networks

        container 要加入哪個網路,這邊的項目會參考到最外層 networks 的設定。

    .container_name

        指定容器名稱,相當於 docker run 的 --name

    .command

       container 啟動後立刻執行的指令

    .restart

        always:當container crash 時,會自動重啟

   .environment

       定義環境變數,相當於 docker run 的 -e。如果值是布林,要用單引號包起來,如 ' true '、' false '。

       否則 yaml 解析器會把它變成 True 或是 False。

    .ports

        讓你指定要導出的 port,相當於 docker run 的 -p可以是 host:container,或是只指定 container,這時會隨機挑一個 host port 來用。

        port 指定最好都用字串,因為 yaml 解析器在 port 小於 60 時會出問題。

    .volumes

        設定 container 要使用的 volume,相當於 docker run 的 --v可以是一個路徑或是參考到最外層 volume 的設定,格式為 host:container

        你也可以只寫 container,讓 Docker 自動幫你建立一個。

 

    以上設定若使用 docker run 的話,會是以下指令:

 

    docker run

    -p 6666:3306

    --name tp-mysql

    -e MYSQL_ROOT_PASSWORD=1234

    -v .data/account.sql:/docker-entrypoint-initdb.d/account.sql

    -d 62a9f311b99c --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

 

    2.networks 

       設定網路。可以讓同設定的 container 運行於同一網段,類似 docker network 指令。可以和 servcies 區塊內的 network 搭配使用。

    3.volumes

      處理資料共享與資料持久(persist)。類似 docker volume 指令。可以和 servcies 區塊內的 volume 搭配使用。

 

設定好 yaml 檔後,只需於 yaml 檔所在目錄下執行 docker-compose up -d 指令 (-d 為背景執行),便可執行你所定義好的 service

.mysql-init/account.sql 檔案內容如下: 

container 部屬完成後會自動掛載此 sql 並執行

目前 Docker 上無任何 image 及 container

執行 docker-compose up -d 指令

執行成功,執行 docker ps 指令查看 container 

連線至 db 確認 table

若要移除 container ,則可執行 docker-compose down

如此便達成使用 Docker Compose 部屬控管 Services 的功能

 

三、結語

使用 Docker Compose 可以透過組態設定幫你處理好自己下 docker run 時要下的多個參數,而且能將多個 container 組織成一個應用服務,並管理 container 的相依性。

另外透過閱讀 docker-compose.yaml 檔案,也可以很容易的了解到整個應用服務的組成與架構。

是個軟體開發與測試時能好好運用的工具。

Kevin Lin