Docker 持久化

等你下课啊發表於2024-05-01

Docker 持久化

docker 三種持久化方式

  • 資料卷(Volumes)
  • 繫結掛載 (Bind Mounts)
  • tmpfs

資料卷(Volumes)

  • Volumes 是Docker推薦的掛載方式,與把資料儲存在容器的可寫層相比,使用Volume可以避免增加容器的容量大小,還可以使儲存的資料與容器的生命週期獨立。

  • Volumes是可供一個/多個容器使用的特殊目錄,其作用和特性如下所示:

    • 可以在容器之間共享和重用;
    • 可以被修改,且立即生效;
    • 對其進行更新,並不影響映象;
    • 預設情況下,即使容器被刪除了,它也會一直存在;
    • 與bind mounts相比,volumes更易於備份或遷移。
    • 您可以使用Docker CLI命令或Docker API管理Volumes。
    • volumes在Linux和Windows容器上均可工作。
    • 可以在多個容器之間更安全地共享volumes。
    • volumes驅動程式使您可以將volumes儲存在遠端主機或雲提供程式上,以加密volumes內容或新增其他功能

建立 Volumes


# 建立一個名為 dv_mysql_data 的 volumes
docker volume create dv_mysql_data

檢視所有 Volumes


docker volume ls

檢視某個 Volumes 詳細


# 檢視 dv_mysql_data 的 詳細
docker volume inspect dv_mysql_data

刪除 Volumes



# 移除一個或多個卷。不能刪除容器正在使用的卷。
docker volume rm dv_mysql_data
docker volume remove dv_mysql_data

# 移除所有未使用的本地卷。
docker volume prune

啟動一個掛載 Volumes 的容器


# 使用 --mount (推薦) [--mount type=volume 是預設值,可以省略]
docker run -p 3306:3306 --name mysql \
--mount source=dv_mysql_data,target=/var/lib/mysql \
-d mysql:8.0.20


# 使用 -v
docker run -p 3306:3306 --name mysql \
-v dv_mysql_data:/var/lib/mysql \
-d mysql:8.0.20

--mount

  • -v能做的--mount指令都可以做,與-v指令對比,--mount指令更靈活,支援更多複雜操作,並且不需要嚴格按照引數順序,透過key value鍵值對方式進行配置,可讀性更高。

  • --mount有以下幾個引數:

    • type - type可以是bind、volume或者tmpfs,預設是volume
    • source - 宿主機上的目錄路徑,可以用縮寫src
    • destination - 目標路徑,容器上掛載的路徑,可以用dst或者 target
    • readonly - 可選項,如果設定了,那麼容器掛載的路徑會被設定為只讀
    • volume-opt - 可選項,當volume驅動接受同時多個引數作為選項時,可以以多個鍵值對的方式傳入

繫結掛載(Bind-Mounts)

  • 與volumes相比,bind mount的功能有限。 使用繫結安裝時,會將主機上的檔案或目錄安裝到容器中。 檔案或目錄由主機上的完整或相對路徑引用。 相比之下,當您使用volume時,將在主機上Docker的儲存目錄中建立一個新目錄,並且Docker管理該目錄的內容。

  • 該檔案或目錄不需要在Docker主機上已經存在。 如果尚不存在,則按需建立。 bind mounts效能非常好,但是它們依賴於具有特定目錄結構的主機檔案系統。 如果要開發新的Docker應用程式,請考慮使用命名volume。 您不能使用Docker CLI命令直接管理bind mounts


# 使用 --mount (推薦) [--mount type=bind 不可以省略]
docker run -p 3306:3306 --name mysql \
--mount type=bind,source=/home/data,target=/var/lib/mysql \
-d mysql:8.0.20


# 使用 -v
docker run -p 3306:3306 --name mysql \
-v /home/data:/var/lib/mysql \
-d mysql:8.0.20

tmpfs

  • 使用tmpfs不會持久化資料,資料只會存放在宿主機器記憶體中

docker run -p 3306:3306 --name mysql \
--mount type=tmpfs,source=/home/data,target=/var/lib/mysql \
-d mysql:8.0.20

相關文章