Docker Compose 是一款功能強大的協調工具,旨在使用 Docker 簡化多容器應用程式的管理和部署。docker-compose.yml 檔案通過在一個檔案中定義具有多個服務、網路和卷的複雜應用程式來簡化部署。使用 Docker Compose 的一個重要方面是使用卷管理持久化資料。
本文探討了在 Docker Compose 中使用卷處理永續性資料的重要性,並提供了有效使用卷的實踐指南。
什麼是 Docker 卷?
Docker 卷是一個重要的生態系統元件,用於儲存和管理由短暫容器生成的持久資料。即使在移除或更新容器後,資料也能持久存在,這樣就不會在日常操作中丟失重要的應用程式資料。
卷與容器的檔案系統是分離的,因此你可以輕鬆地對它們進行備份,在多個容器之間共享它們,並在主機之間遷移它們。
與繫結掛載(即從主機系統到容器的目錄掛載)相比,使用卷的一個關鍵優勢是可移植性。你可以在不同主機或容器之間快速移動卷,但必須將繫結掛載繫結到主機系統上的特定目錄。
這種可移植性使基於容器的應用中的資料管理更靈活、更高效。卷還相容各種儲存驅動程式,讓您可以根據具體的使用情況選擇最佳的儲存解決方案。
Docker 卷的型別
Docker 卷對於管理基於容器的應用程式中的資料至關重要。它們有兩種不同的型別:命名卷和匿名卷。本節將深入探討這兩種型別的主要區別,並演示如何實施它們來管理應用程式中的資料。
命名卷和匿名卷的用途不同,提供的控制和管理功能也各不相同。由於命名卷具有人類可讀的識別符號,且易於管理,因此在大多數使用案例中,命名卷通常是首選,但要最大限度地發揮這兩種型別的優勢,必須瞭解它們的功能。
已命名卷
命名卷有一個使用者定義的名稱,便於識別、管理和在多個容器之間共享。Docker 建立並管理命名卷,並將其資料儲存在主機系統的特定位置。該位置通常位於 Docker 安裝目錄下,有一個與卷名相對應的唯一 ID。
命名卷提供了更大的控制性和靈活性,因為你可以使用它們的人可讀識別符號輕鬆地引用和操作它們。
要在 Docker 中建立命名卷,請執行:
docker volume create my_named_volume
匿名卷
與命名卷不同,匿名卷沒有使用者定義的名稱。相反,Docker 會在你建立容器時自動建立它們,併為卷分配一個唯一的 ID。
由於缺乏人類可讀的識別符號,管理和儲存卷通常比較困難。由於 Docker 會自動建立卷,因此通常使用匿名捲進行臨時儲存。如果在建立容器時沒有指定命名卷,也會出現匿名卷。
要使用匿名卷建立容器,請執行:
docker run -v /data nginx
此命令將匿名卷掛載到容器 nginx
內的 /data 目錄。可以用掛載卷的容器名稱替換 nginx
。
如何使用 Docker Compose 建立和管理卷
Docker Compose 可以在 docker-compose.yml 檔案中定義卷,從而簡化了卷的建立和管理。該檔案包含應用程式的服務、網路和卷的配置,可在一個地方輕鬆管理應用程式的資源。
1. 在 Docker Compose 中定義卷
要在 docker-compose.yml 檔案中建立一個已命名的卷,請在 volumes
關鍵字下定義它。如有必要,還可以指定卷驅動程式和選項。
2. 將卷掛載到容器
要把卷附加到容器上,請在 docker-compose.yml 檔案的 service
定義中使用 volumes
關鍵字。指定卷名稱後的冒號和要掛載卷的容器路徑。
你還可以使用相同的卷名,在多個容器之間共享卷。
下面是在 docker-compose.yml 檔案中建立名為 web_data
和 db_data
的卷的例子:
version: '3.8' services: web: image: nginx volumes: - web_data:/var/www/html web-test: image: nginx volumes: - web_data:/var/www/html # Web and web test share the web_data volume db: image: mysql volumes: - db_data:/var/lib/mysql volumes: web_data: db_data: driver: local # Define the driver and options under the volume name driver_opts: type: none device: /data/db_data o: bind
此示例定義了兩個命名卷。然後,它將卷掛載到各自容器的特定路徑下。接下來,它將 web_data
卷掛載到 web 容器中的 /var/www/html 目錄,將 db_data
卷掛載到 db
容器中的 /var/lib/mysql 目錄。
web
和 web-test
容器共享 web_data
卷,允許它們訪問和修改相同的資料卷。
通過在 docker-compose.yml 檔案中定義和管理卷,你可以根據需要輕鬆建立、更新和刪除卷,而無需使用 Docker 命令手動管理它們。這種簡化的流程讓您可以專注於開發和部署應用程式,而 Docker Compose 則負責處理底層資源管理。
如何使用 Docker Compose 和 Volume 命令
Docker Compose 提供了多種命令,可幫助您有效管理應用程式及其資源。讓我們詳細回顧一下這些命令及其與卷的關係:
-
docker compose up
會建立並啟動你的應用程式,包括它的服務、網路和卷。如果你在 docker-compose.yml 檔案中定義了已命名的卷,這條命令會自動建立它。 -
docker compose down
停止並刪除應用程式的服務和網路。預設情況下,它不會刪除已命名的卷。要刪除已命名的卷,請使用--volumes
或-v
標誌。 -
docker compose ps
會列出容器及其當前狀態,包括與卷相關的資訊。 -
docker compose config
驗證並顯示從 docker-compose.yml 檔案生成的有效配置,包括卷定義。
列表卷
要列出所有卷,請使用 ls
:
docker volume ls
輸出會顯示所有已命名的卷,包括由 Docker Compose 建立的卷。
檢查卷
要檢視特定卷的詳細資訊,請使用 inspect
。它會輸出卷的相關資訊,如名稱、驅動程式、掛載點和選項:
docker volume inspect db_data
卷的詳細資訊以 JSON 格式給出。例如,考慮到上面提供的 docker-compose.yml 檔案,這就是返回的輸出結果:
[ { "CreatedAt": "some-date-here", "Driver": "local", "Labels": null, "Mountpoint": "/path/on/host/where/volume/is/mounted", "Name": "db_data", "Options": { "device": "/data/db_data", "o": "bind", "type": "none" }, "Scope": "local", "Status": { "Mounts": [ ... ] } } ]
按名稱刪除 Docker 卷
要刪除 Docker 卷,可以使用 docker volume rm
,後面跟卷名:
docker volume rm volume-name
清理未使用的卷
要刪除未使用的卷,請使用 prune
:
docker volume prune
該命令有助於清理開發環境並回收儲存空間。它會刪除所有與容器無關的未使用卷,包括 Docker Compose 建立的卷。
利用這些命令及其與卷相關的功能,你可以有效地管理應用程式的資源,確保最佳效能和儲存空間的高效利用。
Docker Compose 版本
自 2023 年 7 月起,Docker Compose V1 停止接收更新。在新發布的 Docker Desktop 中,它也不再可用。不過,Docker Desktop 仍然支援 docker-compose
別名,以便將命令重定向到 docker compose
,從而提高與第三方工具和指令碼的相容性。
要將現有程式碼從 Docker Compose 版本 1 切換到版本 2,只需將破折號換成空格即可。例如, docker-compose up
變成 docker compose up
。
有了版本 2,你就可以直接在 Docker 命令列介面(CLI)中使用 & compose
命令,切換 Docker 上下文以在雲服務上構建容器,並使用亞馬遜 ECS 和微軟 ACI。
小結
這篇文章強調了在 Docker Compose 中使用卷管理永續性資料的重要性。卷是 Docker 生態系統中的一個重要元件,它使您能夠儲存和管理 Docker 容器生成的資料。有了 Docker 卷,即使在您刪除或更新容器後,重要的應用程式資料也會持續存在,有助於保持應用程式的完整性和一致性。
Docker Compose 提供了一種在 docker-compose.yml 檔案中建立和管理卷的簡化方法。這種方法簡化了開發過程,確保了資源的高效利用。
使用卷還能使開發變得靈活高效,Docker Compose 提供了各種與卷相關的命令,幫助你有效監督應用程式資源。利用這些命令,您可以輕鬆建立、檢查和清理卷。
評論留言