什麼是 Docker Compose?
解釋
如果你一直按照指南操作,那麼你一直在處理單容器應用程式。但現在,你想做一些更復雜的事情——執行資料庫、訊息佇列、快取或各種其他服務。你會把所有東西都安裝在一個容器裡嗎?執行多個容器?如果執行多個,你如何將它們全部連線在一起?
容器的一個最佳實踐是,每個容器應該只做一件事,並把它做好。雖然這條規則有例外,但要避免讓一個容器做多件事情的傾向。
你可以使用多個 docker run
命令來啟動多個容器。但是,你很快就會意識到你需要管理網路、連線容器到這些網路所需的所有標誌等等。當你完成後,清理工作也會變得有點複雜。
使用 Docker Compose,你可以在單個 YAML 檔案中定義所有容器及其配置。如果你將此檔案包含在你的程式碼倉庫中,任何克隆你倉庫的人都可以透過一個命令啟動並執行。
理解 Compose 是一個宣告式工具非常重要——你只需定義它然後執行即可。你並不總是需要從頭開始重新建立所有東西。如果你做了更改,再次執行 docker compose up
,Compose 將會協調你檔案中的更改並智慧地應用它們。
Dockerfile 與 Compose 檔案
Dockerfile 提供了構建容器映象的指令,而 Compose 檔案則定義了你正在執行的容器。通常,Compose 檔案會引用一個 Dockerfile 來構建用於特定服務的映象。
試一試
在這個動手實踐中,你將學習如何使用 Docker Compose 來執行一個多容器應用程式。你將使用一個簡單的待辦事項列表應用,它由 Node.js 構建,並使用 MySQL 作為資料庫伺服器。
啟動應用程式
按照說明在你的系統上執行待辦事項列表應用。
下載並安裝 Docker Desktop。
開啟一個終端並克隆這個示例應用程式。
git clone https://github.com/dockersamples/todo-list-app
導航到
todo-list-app
目錄cd todo-list-app
在這個目錄中,你會找到一個名為
compose.yaml
的檔案。這個 YAML 檔案是所有魔法發生的地方!它定義了構成你應用程式的所有服務及其配置。每個服務都指定了其映象、埠、卷、網路以及其功能所需的任何其他設定。花些時間探索這個 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 GUI,你可以看到這些容器,並深入瞭解它們的配置。
拆除它
由於這個應用程式是使用 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
卷持久化
預設情況下,當你拆除一個 Compose 棧時,卷*不會*被自動移除。這樣做的想法是,如果你再次啟動該棧,你可能還想找回資料。
如果你確實想移除卷,可以在執行
docker compose down
命令時新增--volumes
標誌docker compose down --volumes [+] Running 1/0 ✔ Volume todo-list-app_todo-mysql-data Removed
或者,你可以使用 Docker Desktop GUI 來移除容器,方法是選擇應用程式棧並點選**刪除**按鈕。
為 Compose 棧使用 GUI
請注意,如果你在 GUI 中移除 Compose 應用的容器,它只移除容器。如果你想移除網路和卷,你必須手動操作。
在這個演練中,你學會了如何使用 Docker Compose 來啟動和停止一個多容器應用程式。
其他資源
本頁是對 Compose 的簡要介紹。在以下資源中,你可以更深入地瞭解 Compose 以及如何編寫 Compose 檔案。