保存容器資料
說明
當容器啟動時,它會使用映象檔 (image) 所提供的檔案和設定。每個容器都能建立、修改及刪除檔案,且這些操作不會影響其他容器。當容器被刪除時,這些檔案變更也會一併刪除。
雖然容器這種「隨用隨丟」的特性非常實用,但當您想要保留資料時就會面臨挑戰。例如,如果您重新啟動資料庫容器,您可能不希望從一個空的資料庫開始。那麼,該如何持久化檔案呢?
容器磁碟區 (Volumes)
磁碟區 (Volumes) 是一種儲存機制,能夠將資料保存到單一容器的生命週期之外。您可以將其想像成從容器內部到容器外部的捷徑或符號連結。
舉例來說,假設您建立了一個名為 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 資料夾的檔案都會儲存在此磁碟區中,位於容器外部。如果您刪除該容器並使用同一個磁碟區啟動新容器,這些檔案仍然會存在。
使用磁碟區共享檔案
您可以將同一個磁碟區掛載到多個容器,以在容器之間共享檔案。這在記錄整合 (log aggregation)、資料管線或其他事件驅動應用程式等情境中非常有用。
管理磁碟區
磁碟區擁有獨立於容器的生命週期,並且根據您使用的資料類型和應用程式,磁碟區的大小可能會變得非常大。下列指令有助於管理磁碟區:
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 命令列:
\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 Desktop 儀表板提供了檢視任何磁碟區內容的功能,以及匯出、匯入和複製磁碟區的能力。
開啟 Docker Desktop 儀表板並瀏覽至 Volumes(磁碟區)視圖。在此視圖中,您應該會看到 postgres_data 磁碟區。
選擇 postgres_data 磁碟區的名稱。
Data(資料)頁籤會顯示磁碟區的內容,並允許您瀏覽檔案。雙擊檔案即可查看內容並進行修改。
右鍵點擊任何檔案即可將其儲存或刪除。
刪除磁碟區
在移除磁碟區之前,它必須未被掛載至任何容器。如果您尚未移除之前的容器,請使用下列指令進行移除(-f 會先停止容器再進行移除):
$ docker rm -f new-db
有幾種方法可以移除磁碟區,包括:
在 Docker Desktop 儀表板的磁碟區上選擇 Delete Volume(刪除磁碟區)選項。
使用
docker volume rm指令$ docker volume rm postgres_data使用
docker volume prune指令移除所有未使用的磁碟區$ docker volume prune
其他資源
下列資源將有助於您進一步了解磁碟區:
下一步
既然您已經學會了如何持久化容器資料,接下來是時候學習如何與容器共享本機檔案了。
與容器共享本機檔案