持久化容器資料

解釋

當容器啟動時,它使用映象提供的檔案和配置。每個容器都能夠建立、修改和刪除檔案,並且這樣做不會影響任何其他容器。當容器被刪除時,這些檔案更改也會被刪除。

雖然容器的這種臨時性很好,但當您想持久化資料時,它會帶來挑戰。例如,如果您重啟一個數據庫容器,您可能不希望從一個空的資料庫開始。那麼,您如何持久化檔案呢?

容器卷

卷是一種儲存機制,它提供了在單個容器的生命週期之外持久化資料的能力。可以把它想象成在容器內部提供一個指向容器外部的快捷方式或符號連結。

舉個例子,假設你建立了一個名為 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 目錄中。透過在此處附加捲,您將能夠在多次重啟容器的同時保留資料。

使用卷

  1. 下載並安裝 Docker Desktop。

  2. 使用 Postgres 映象 透過以下命令啟動一個容器。

    $ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql/data postgres
    

    這將在後臺啟動資料庫,為其配置密碼,並將一個卷附加到 PostgreSQL 將持久化資料庫檔案的目錄。

  3. 使用以下命令連線到資料庫。

    $ docker exec -ti db psql -U postgres
    
  4. 在 PostgreSQL 命令列中,執行以下命令建立一個數據庫表並插入兩條記錄。

    CREATE TABLE tasks (
        id SERIAL PRIMARY KEY,
        description VARCHAR(100)
    );
    INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun');
  5. 透過在 PostgreSQL 命令列中執行以下命令來驗證資料是否在資料庫中。

    SELECT * FROM tasks;

    您應該得到類似以下的輸出。

     id | description
    ----+-------------
      1 | Finish work
      2 | Have fun
    (2 rows)
  6. 透過執行以下命令退出 PostgreSQL shell。

    \q
    
  7. 停止並移除資料庫容器。請記住,即使容器已被刪除,資料仍然持久化在 postgres_data 卷中。

    $ docker stop db
    $ docker rm db
    
  8. 透過執行以下命令啟動一個新容器,並附加包含持久化資料的相同卷。

    $ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql/data postgres 
    

    您可能已經注意到,POSTGRES_PASSWORD 環境變數被省略了。這是因為該變數僅在引導新資料庫時使用。

  9. 透過執行以下命令驗證資料庫中是否仍有記錄。

    $ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
    

檢視卷內容

Docker Desktop 儀表盤提供了檢視任何卷內容的能力,以及匯出、匯入和克隆卷的功能。

  1. 開啟 Docker Desktop 儀表盤並導航到**卷**檢視。在此檢視中,您應該能看到 **postgres_data** 卷。

  2. 選擇 **postgres_data** 卷的名稱。

  3. **資料**選項卡顯示卷的內容,並提供了瀏覽檔案的功能。雙擊檔案可以檢視其內容並進行更改。

  4. 右鍵單擊任何檔案可儲存或刪除它。

移除卷

在移除卷之前,它必須沒有附加到任何容器。如果您還沒有移除之前的容器,請使用以下命令進行操作(-f 標誌會先停止容器然後再移除它)。

$ docker rm -f new-db

有幾種方法可以移除卷,包括以下幾種:

  • 在 Docker Desktop 儀表盤中選擇捲上的**刪除卷**選項。

  • 使用 docker volume rm 命令。

    $ docker volume rm postgres_data
    
  • 使用 docker volume prune 命令移除所有未使用的卷。

    $ docker volume prune
    

其他資源

以下資源將幫助您瞭解更多關於卷的資訊。

後續步驟

現在您已經瞭解瞭如何持久化容器資料,是時候學習如何與容器共享本地檔案了。

與容器共享本地檔案