持久化容器資料
解釋
當容器啟動時,它使用映象提供的檔案和配置。每個容器都能夠建立、修改和刪除檔案,並且這樣做不會影響任何其他容器。當容器被刪除時,這些檔案更改也會被刪除。
雖然容器的這種瞬態特性非常棒,但在您想要持久化資料時它也帶來了一項挑戰。例如,如果您重新啟動一個數據庫容器,您可能不希望從一個空資料庫開始。那麼,如何持久化檔案呢?
容器卷
卷是一種儲存機制,它提供了持久化資料的能力,超出單個容器的生命週期。可以將其視為從容器內部到容器外部提供快捷方式或符號連結。
例如,假設您建立了一個名為 log-data
的卷。
$ docker volume create log-data
使用以下命令啟動容器時,該卷將被掛載(或附加)到容器中的 /logs
目錄。
$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker
如果卷 log-data
不存在,Docker 會自動為您建立它。
當容器執行時,它寫入 /logs
資料夾中的所有檔案都將儲存在此卷中,位於容器外部。如果您刪除容器並使用同一個卷啟動一個新的容器,這些檔案仍然存在。
使用卷共享檔案
您可以將同一個卷附加到多個容器,以在容器之間共享檔案。這在日誌聚合、資料管道或其他事件驅動的應用程式等場景中可能很有幫助。
管理卷
卷有自己獨立於容器的生命週期,並且根據您使用的應用程式型別和資料型別,卷的大小可能會變得很大。以下命令將有助於管理卷
docker volume ls
- 列出所有卷docker volume rm <volume-name-or-id>
- 刪除卷(僅在卷未附加到任何容器時有效)docker volume prune
- 刪除所有未使用的(未附加的)卷
試試看
在本指南中,您將練習建立和使用捲來持久化 Postgres 容器建立的資料。當資料庫執行時,它將檔案儲存到 /var/lib/postgresql/data
目錄中。透過在此處附加捲,您將能夠多次重新啟動容器,同時保留資料。
使用卷
下載並安裝 Docker Desktop。
使用 Postgres 映象 啟動容器,使用以下命令
$ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql/data postgres
這將啟動後臺的資料庫,使用密碼配置它,並將一個卷附加到 PostgreSQL 將持久化資料庫檔案的目錄。
使用以下命令連線到資料庫
$ docker exec -ti db psql -U postgres
在 PostgreSQL 命令列中,執行以下命令來建立一個數據庫表並插入兩條記錄
CREATE TABLE tasks ( id SERIAL PRIMARY KEY, description VARCHAR(100) ); INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun');
透過在 PostgreSQL 命令列中執行以下命令來驗證資料是否在資料庫中
SELECT * FROM tasks;
您應該看到類似以下輸出的結果
id | description ----+------------- 1 | Finish work 2 | Have fun (2 rows)
透過執行以下命令退出 PostgreSQL shell
\q
停止並刪除資料庫容器。請記住,即使容器已被刪除,資料仍然保留在
postgres_data
卷中。$ docker stop db $ docker rm db
使用以下命令啟動一個新容器,附加具有持久化資料的同一個卷
$ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql/data postgres
您可能已經注意到
POSTGRES_PASSWORD
環境變數已被省略。這是因為該變數僅在引導一個新資料庫時使用。透過執行以下命令驗證資料庫中是否仍然存在記錄
$ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
檢視卷內容
Docker Dashboard 提供檢視任何卷內容的功能,以及匯出、匯入和克隆卷的功能。
開啟 Docker Dashboard 並導航到 **卷** 檢視。在此檢視中,您應該看到 **postgres_data** 卷。
選擇 **postgres_data** 卷的名稱。
**資料** 選項卡顯示卷的內容,並提供導航檔案的功能。雙擊檔案可以檢視內容並進行更改。
右鍵單擊任何檔案以儲存或刪除它。
刪除卷
在刪除卷之前,它必須不附加到任何容器。如果您尚未刪除之前的容器,請使用以下命令這樣做(-f
將首先停止容器,然後將其刪除)
$ docker rm -f new-db
刪除卷有幾種方法,包括以下方法
在 Docker Dashboard 中選擇捲上的 **刪除卷** 選項。
使用
docker volume rm
命令$ docker volume rm postgres_data
使用
docker volume prune
命令刪除所有未使用的卷$ docker volume prune
其他資源
以下資源將幫助您瞭解有關卷的更多資訊
下一步
既然您已經瞭解了持久化容器資料,現在該學習如何與容器共享本地檔案了。