什麼是 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 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 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 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
    

    卷持久化

    預設情況下,當你拆除一個 Compose 棧時,卷*不會*被自動移除。這樣做的想法是,如果你再次啟動該棧,你可能還想找回資料。

    如果你確實想移除卷,可以在執行 docker compose down 命令時新增 --volumes 標誌

    docker compose down --volumes
    [+] Running 1/0
    ✔ Volume todo-list-app_todo-mysql-data  Removed
    
  2. 或者,你可以使用 Docker Desktop GUI 來移除容器,方法是選擇應用程式棧並點選**刪除**按鈕。

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

    為 Compose 棧使用 GUI

    請注意,如果你在 GUI 中移除 Compose 應用的容器,它只移除容器。如果你想移除網路和卷,你必須手動操作。

在這個演練中,你學會了如何使用 Docker Compose 來啟動和停止一個多容器應用程式。

其他資源

本頁是對 Compose 的簡要介紹。在以下資源中,你可以更深入地瞭解 Compose 以及如何編寫 Compose 檔案。