什麼是 Docker Compose?

說明

如果您一直按照指南操作到目前為止,您一直在使用單容器應用程式。但是,現在您想要做更複雜的事情 - 執行資料庫、訊息佇列、快取或各種其他服務。您是否將所有東西都安裝在單個容器中?執行多個容器?如果執行多個容器,您如何將它們全部連接在一起?

容器的最佳實務之一是每個容器應該做一件事情並且把它做好。雖然此規則有例外,但應避免讓一個容器執行多項任務的傾向。

您可以使用多個 docker run 命令來啟動多個容器。但是,您很快就會意識到您需要管理網路、將容器連接到這些網路所需的所有旗標等等。而且當您完成時,清理工作會稍微複雜一些。

使用 Docker Compose,您可以在單個 YAML 檔案中定義所有容器及其配置。如果您將此檔案包含在程式碼儲存庫中,任何複製您的儲存庫的人都可以使用單個命令啟動並執行。

瞭解 Compose 是一個宣告式工具非常重要 - 您只需定義它即可開始使用。您並非總是需要從頭開始重新建立所有內容。如果您進行更改,請再次執行 docker compose up,Compose 將協調檔案中的更改並 هوشمند地套用它們。

Dockerfile 與 Compose 檔案

Dockerfile 提供建構容器映像檔的說明,而 Compose 檔案定義您正在執行的容器。通常,Compose 檔案會參考 Dockerfile 來建構用於特定服務的映像檔。

試用看看

在此實作中,您將學習如何使用 Docker Compose 來執行多容器應用程式。您將使用以 Node.js 建構的簡單待辦事項應用程式,並使用 MySQL 作為資料庫伺服器。

啟動應用程式

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

  1. 下載並安裝複製此範例應用程式

  • 瀏覽至 todo-list-app 目錄

    在此目錄中,您會找到一個名為 compose.yaml 的檔案。這個 YAML 檔案是所有神奇事物發生的地方!它定義了組成應用程式的所有服務,以及它們的配置。每個服務都指定其映像檔、埠、磁碟區、網路,以及其功能所需的任何其他設定。花一些時間瀏覽 YAML 檔案並熟悉其結構。

  • 使用 docker compose up 命令啟動應用程式

    docker compose up -d --build
    

    執行此命令時,您應該會看到如下輸出

    [+] Running 4/4
    ✔ app 3 layers [⣿⣿⣿]      0B/0B            Pulled           7.1s
      ✔ e6f4e57cc59e Download complete                          0.9s
      ✔ df998480d81d Download complete                          1.0s
      ✔ 31e174fedd23 Download complete                          2.5s
    [+] Running 2/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
    • 已為您的應用程式建立網路
    • 已建立磁碟區以在容器重新啟動之間保存資料庫檔案
    • 已使用所有必要的配置啟動兩個容器

    如果這讓您感到不知所措,請不要擔心!您會到達那裡的!

  • 現在一切都已啟動並正在執行,您可以在瀏覽器中開啟 http://localhost:3000A screenshot of a webpage showing the todo-list application running on port 3000

  • 如果您查看 Docker Desktop GUI,您可以看到容器並深入瞭解其配置。

    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 2/2
      ✔ 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
      

      磁碟區保存

      根據預設,當您移除 Compose 堆疊時,磁碟區*不會*自動移除。其想法是,如果您再次啟動堆疊,您可能希望取回資料。

      如果您確實要移除磁碟區,請在執行 docker compose down 命令時新增 --volumes 旗標

      docker compose down --volumes
      
    2. 或者,您可以使用 Docker Desktop GUI 移除容器,方法是選擇應用程式堆疊,然後選擇**刪除**按鈕。

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

      使用 GUI 進行 Compose 堆疊

      請注意,如果您在 GUI 中移除 Compose 應用程式的容器,則只會移除容器。如果您想要這樣做,您必須手動移除網路和磁碟區。

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

    其他資源

    本頁簡要介紹了 Compose。在以下資源中,您可以更深入地瞭解 Compose 以及如何撰寫 Compose 檔案。