什麼是 Docker Compose?

解釋

如果您一直在關注這些指南,那麼您一直在使用單容器應用程式。但是,現在您想做一些更復雜的事情 - 執行資料庫、訊息佇列、快取或各種其他服務。您是在單個容器中安裝所有內容嗎?執行多個容器?如果您執行多個容器,如何將它們連線在一起?

容器的一個最佳實踐是每個容器應該只做一件事,並且要做好。雖然這條規則有例外,但請避免一個容器做多件事的傾向。

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

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

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

Dockerfile 與 Compose 檔案

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

試一試

在本動手操作中,您將學習如何使用 Docker Compose 執行多容器應用程式。您將使用一個簡單的待辦事項清單應用程式,該應用程式使用 Node.js 和 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 檔案就是所有魔法發生的地方!它定義了構成您的應用程式的所有服務,以及它們的配置。每個服務都指定了其映象、埠、卷、網路,以及其功能所需的所有其他設定。花一些時間探索 YAML 檔案,並熟悉它的結構。

  4. 使用 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
    • 為您的應用程式建立了一個網路
    • 建立了一個捲來持久化資料庫檔案,以便在容器重啟之間保留它們
    • 啟動了兩個容器,並配置了所有必需的配置

    如果這感覺很複雜,別擔心!您會克服的!

  5. 現在一切都已經啟動並執行,您可以在瀏覽器中開啟 https://:3000 檢視網站。隨意將專案新增到列表中,勾選它們,並刪除它們。

    A screenshot of a webpage showing the todo-list application running on port 3000
  6. 如果您檢視 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 檔案。