什麼是 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 作為資料庫伺服器。

啟動應用程式

請按照說明在您的系統上執行此待辦事項應用程式。

  1. 下載並安裝 Docker Desktop。

  2. 開啟終端機並 複製此範例應用程式

    git clone https://github.com/dockersamples/todo-list-app 
    
  3. 進入 todo-list-app 目錄。

    cd todo-list-app
    

    在此目錄中,您會找到一個名為 compose.yaml 的檔案。這個 YAML 檔案就是實現魔法的地方!它定義了組成您應用程式的所有服務及其設定。每個服務都指定了其映像檔、連接埠、掛載卷 (volumes)、網路以及運作所需的任何其他設定。請花點時間瀏覽該 YAML 檔案並熟悉其結構。

  4. 使用 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。
    • 為您的應用程式建立了一個網路。
    • 建立了一個掛載卷以在容器重新啟動時保留資料庫檔案。
    • 啟動了兩個容器,並配置了所有必要的設定。

    如果您覺得這資訊量很大,別擔心!您會慢慢上手的!

  5. 現在一切都已啟動並執行,您可以在瀏覽器中開啟 https://:3000 查看該網站。請隨意在清單中新增項目、勾選完成或將其移除。

    A screenshot of a webpage showing the todo-list application running on port 3000
  6. 如果您查看 Docker Desktop 圖形介面,您可以看到容器並深入了解它們的設定。

    A screenshot of Docker Desktop dashboard showing the list of containers running todo-list app

關閉並清理應用程式

由於此應用程式是使用 Docker Compose 啟動的,因此在完成後輕鬆將其關閉並清理非常容易。

  1. 在 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
    
  2. 或者,您可以使用 Docker Desktop 圖形介面,選擇該應用程式堆疊並點擊 刪除 (Delete) 按鈕來移除容器。

    A screenshot of the Docker Desktop GUI showing the containers view with an arrow pointing to the "Delete" button

    使用 GUI 管理 Compose 堆疊

    請注意,如果您在圖形介面中移除 Compose 應用程式的容器,這只會移除容器。如果您想要移除網路和掛載卷,則必須手動進行。

在本教學中,您學習了如何使用 Docker Compose 來啟動和停止多容器應用程式。

其他資源

此頁面是對 Compose 的簡短介紹。在以下資源中,您可以更深入地了解 Compose 以及如何編寫 Compose 檔案。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.