# 虎年行大運 - Docker Compose ## 【前言】 前面已經學過了如何自己建立一個 Docker File,並透過 Docker File 建立 Docker Image,最後利用 Image 建立多個 Container 的流程。 但每一個服務都要輸入指令一個一個啟動的話,對於負責應用程式布署的人來說也太勞心勞力了,對此 Docker 提供了一個可以一次執行大量 Docker Container 啟用的工具 -- Docker Compose 來幫助開發人員進行多服務的布署。 ## 【Docker Compose】 Docker Compose 是 Docker 推出的一項服務套件,意在於幫助開發者們去整頓需要操作的 Container 指令,並將其檔案化,使其如同 shell 檔一樣的方式存在。 屆時開發者們可以僅透過執行該檔案,便可輕鬆完成多應用的布署,且文檔化的好處是更容易編輯、可以進入 GIT 的版控,攜帶性提升等等。 ## 【安裝】 若你是 Windows 的朋友們,在安裝了 Windows 版本的 Docker 後理當來說不需要再去安裝 Docker Compose 的部分。 但是其他環境的朋友們就需要額外去安裝這個套件了~ [Docker Official Install Page](https://docs.docker.com/compose/install/) ## 【docker-compose.yml】 這是基本 Docker Compose 執行的當下會去呼叫的檔案,不需要再執行時候特別告知檔名,若有改名稱的話則會需要多一些指令幫助 Docker Compose 知道要執行的是哪一支檔案。 Kai 這邊就把在之前啟動過的 TOMCAT 和 MYSQL 指令都寫在 docker-compose.yml 檔案中,讓他一次性幫我啟動兩個服務。 ![](https://i.imgur.com/oTscERQ.png) 由於啟動時忘記設定背景執行... 因此只好再開一個 Terminal 檢視成果,可以看到目前有兩個 Containers 已經執行了!! ![](https://i.imgur.com/9UhTtGA.png) 確認目前運行的 Docker Compose 狀況 ![](https://i.imgur.com/scaISGK.png) ## 【指令】 終於來到這個套件的指令部份了~ 在下方 Kai 會列出常用的指令與其執行動作意義 | Command | 動作 | 附註 | | ---- | ---- | ---- | | docker-compose up | 執行 Docker Compose 套件 | 預設讀取 docker-compose.yml | | docker-compose down | 停止正在運行的 Docker Compose 啟動的 Containers 和 Networks || | docker-compose [Commands] -d | 背景執行命令 || | docker-compose ps | 檢視運行中的 Docker Compose 啟動的 Containers 和 Networks || | docker-compose start | 類同 up 指令 | 差別在於 up 會建立 container 但 start 若無找到該 container 的話不會自動建立 container| | docker-compose stop | 類同 down 指令 | 差別在於 down 會刪除 container 但 stop 不會執行刪除動作| | docker-compose rm | 執行刪除沒有運行的 containers | 必須是經由 docker-compose.yml 建立的才會刪去 | | docker-compose pull | 會將需要的 images 下載至本地端 | | | docker-compose push | 會將建立的 images 上傳至 Remote Repository | | | docker-compose restart | 重新啟動該 docker-compose.yml 的所有 containers | | 其餘還有很多可執行的命令,詳見[Docker Compose 官網](https://docs.docker.com/engine/reference/commandline/compose/) ## 【.env 檔案支援】 docker-compose.yml 作為一支整理預備執行的多個 services 的檔案而言應該偏向於整體架構的檔案,因此必要的我們會把一些特殊需要放入的參數提出。 畢竟同樣的環境建置,開發者可能需要一個開發環境的參數和 product 環境的參數的調控,如果一直都在 docker-compose.yml 上處理的話會改動得十分頻繁且容易出錯。 因此最好的方式便是把這些參數抽出,而 Docker Compose 本身就支援呼叫一種稱作 **.env** 的檔案,使用者可以把參數提出後統一放置在這種檔案內,分門別類的。 後續在使用上,我們就可以針對開發環境或 product 環境直接作選擇即可,就不用將參數改來改去了~ 使用的方式非常類似 **JSTL** **.env** ``` ## for Dev TAG_DB_URL=192.168.0.1 ``` **docker-compose.yml** ``` ... environments: DB_URL:${TAG_DB_URL} ``` 若要在執行時選擇不同的環境檔案注入的話,只需要在啟動時告知 Docker Compose 使用的環境檔案即可。 ``` docker-compose --env-file [File Location] up ``` ## 【結語】 到了這邊終於差不多把 Docker 的部分學齊了~ 可喜可賀~ 首頁 [Kai 個人技術 Hackmd](/2G-RoB0QTrKzkftH2uLueA) ###### tags: `Docker`