什麼是 Docker Compose?
說明
如果您一直跟著指南操作,您目前接觸的都是單容器應用程式。但是,現在您想要執行更複雜的操作——例如執行資料庫、訊息佇列、快取或其他各種服務。您應該將所有東西安裝在一個容器中嗎?還是執行多個容器?如果您執行多個容器,又該如何將它們連接在一起呢?
容器的最佳實踐是每個容器應該只做一件事,並把它做好。雖然此規則有例外情況,但請避免讓單一容器執行多項任務的傾向。
您可以使用多個 docker run 指令來啟動多個容器。但您很快就會發現,您還需要管理網路、連接容器至這些網路所需的所有旗標 (flags) 等等。而且完成後,清理工作會變得更加複雜。
透過 Docker Compose,您可以在單一 YAML 檔案中定義所有容器及其設定。如果您將此檔案包含在程式碼儲存庫中,任何複製 (clone) 您儲存庫的人只需執行一個指令即可開始執行。
理解 Compose 是一個宣告式工具非常重要——您只需進行定義並執行即可。您不必每次都從零開始重新建立所有東西。如果您進行了變更,請再次執行 docker compose up,Compose 將會協調檔案中的變更並聰明地套用它們。
Dockerfile 與 Compose 檔案的區別
Dockerfile 提供建置容器映像檔的指令,而 Compose 檔案則定義您正在執行的容器。通常,Compose 檔案會參照 Dockerfile 來建置特定服務所使用的映像檔。
試試看
在本實作練習中,您將學習如何使用 Docker Compose 來執行多容器應用程式。您將使用一個以 Node.js 建置的簡單待辦事項 (To-do) 清單應用程式,並搭配 MySQL 作為資料庫伺服器。
啟動應用程式
請按照說明在您的系統上執行此待辦事項應用程式。
下載並安裝 Docker Desktop。
開啟終端機並 複製此範例應用程式。
git clone https://github.com/dockersamples/todo-list-app進入
todo-list-app目錄。cd todo-list-app在此目錄中,您會找到一個名為
compose.yaml的檔案。這個 YAML 檔案就是實現魔法的地方!它定義了組成您應用程式的所有服務及其設定。每個服務都指定了其映像檔、連接埠、掛載卷 (volumes)、網路以及運作所需的任何其他設定。請花點時間瀏覽該 YAML 檔案並熟悉其結構。使用
docker compose up指令來啟動應用程式。docker compose up -d --build執行此指令時,您應該會看到類似以下的輸出。
[+] Running 5/5 ✔ app 3 layers [⣿⣿⣿] 0B/0B Pulled 7.1s ✔ e6f4e57cc59e Download complete 0.9s ✔ df998480d81d Download complete 1.0s ✔ 31e174fedd23 Download complete 2.5s ✔ 43c47a581c29 Download complete 2.0s [+] Running 4/4 ⠸ Network todo-list-app_default Created 0.3s ⠸ Volume "todo-list-app_todo-mysql-data" Created 0.3s ✔ Container todo-list-app-app-1 Started 0.3s ✔ Container todo-list-app-mysql-1 Started 0.3s這裡發生了很多事!有幾點需要注意:
- 從 Docker Hub 下載了兩個容器映像檔 - node 和 MySQL。
- 為您的應用程式建立了一個網路。
- 建立了一個掛載卷以在容器重新啟動時保留資料庫檔案。
- 啟動了兩個容器,並配置了所有必要的設定。
如果您覺得這資訊量很大,別擔心!您會慢慢上手的!
現在一切都已啟動並執行,您可以在瀏覽器中開啟 https://:3000 查看該網站。請隨意在清單中新增項目、勾選完成或將其移除。

如果您查看 Docker Desktop 圖形介面,您可以看到容器並深入了解它們的設定。

關閉並清理應用程式
由於此應用程式是使用 Docker Compose 啟動的,因此在完成後輕鬆將其關閉並清理非常容易。
在 CLI 中,使用
docker compose down指令來移除所有內容。docker compose down您會看到類似以下的輸出。
[+] Running 3/3 ✔ Container todo-list-app-mysql-1 Removed 2.9s ✔ Container todo-list-app-app-1 Removed 0.1s ✔ Network todo-list-app_default Removed 0.1s掛載卷 (Volume) 的持久性
預設情況下,當您關閉 Compose 堆疊 (stack) 時,掛載卷不會自動移除。這是為了讓您在再次啟動堆疊時仍能找回資料。
如果您確實想要移除掛載卷,請在執行
docker compose down指令時加上--volumes旗標。docker compose down --volumes [+] Running 1/0 ✔ Volume todo-list-app_todo-mysql-data Removed或者,您可以使用 Docker Desktop 圖形介面,選擇該應用程式堆疊並點擊 刪除 (Delete) 按鈕來移除容器。

使用 GUI 管理 Compose 堆疊
請注意,如果您在圖形介面中移除 Compose 應用程式的容器,這只會移除容器。如果您想要移除網路和掛載卷,則必須手動進行。
在本教學中,您學習了如何使用 Docker Compose 來啟動和停止多容器應用程式。
其他資源
此頁面是對 Compose 的簡短介紹。在以下資源中,您可以更深入地了解 Compose 以及如何編寫 Compose 檔案。