返回文章列表

Docker Volume 與資料持久化策略

本文探討 Docker Volume、Bind Mounts 和 tmpfs Mounts 等資料持久化機制,比較其優缺點和適用場景,並提供管理和清理 Docker Volume 的最佳實務。同時,文章也涵蓋了 Docker 網路的基礎知識,包括 bridge、host 和 overlay

容器化 DevOps

Docker 提供多種資料持久化方案,讓容器中的資料得以儲存,即使容器被刪除或重建。Volume 是 Docker 原生管理的機制,提供獨立於容器生命週期的儲存空間。Bind Mounts 則將主機目錄掛載到容器中,實作資料分享。tmpfs Mounts 利用主機記憶體作為臨時儲存,適用於需要高效能的場景。選擇合適的策略取決於應用程式的需求,例如資料的生命週期、存取頻率和安全性考量。理解這些機制的差異,才能有效管理容器化應用程式的資料,確保資料安全和系統穩定性。

Docker Volume 管理與應用

Docker Volume 是用於持久化儲存資料的重要機制,確保容器中的資料不會因容器的刪除而遺失。本篇文章將探討 Docker Volume 的使用、掛載和管理。

建立與掛載 Docker Volume

當你執行一個需要持久化儲存的容器時,可以使用 -v 選項來掛載一個 Volume。例如,啟動一個 MySQL 容器並掛載一個名為 pv-mysql-data 的 Volume:

docker run --name mysql-01 -v pv-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-password -d mysql

內容解密:

  • docker run:啟動一個新的容器。
  • --name mysql-01:指定容器名稱為 mysql-01
  • -v pv-mysql-data:/var/lib/mysql:將名為 pv-mysql-data 的 Volume 掛載到容器的 /var/lib/mysql 目錄。
  • -e MYSQL_ROOT_PASSWORD=my-password:設定環境變數 MYSQL_ROOT_PASSWORDmy-password
  • -d mysql:使用 mysql 映象並在後台執行。

如果 pv-mysql-data Volume 不存在,Docker 會自動建立它。這使得管理 Volume 變得更加方便。

掛載現有的 Volume

當你刪除或升級容器時,Volume 中的資料不會被刪除。因此,你可以在新的容器中掛載相同的 Volume,以保留之前的資料。例如,升級 MySQL 容器:

docker run --name mysql-01 -v pv-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-password -d mysql:v2

內容解密:

  • 這條命令與前一條類別似,但使用的 MySQL 映象版本不同(mysql:v2)。
  • 由於使用了相同的 Volume 名稱 (pv-mysql-data),新容器會掛載相同的 Volume,保留原有的資料函式庫資料。

在多個容器中掛載相同的 Volume

Docker 允許多個容器掛載相同的 Volume,這對於需要分享資料的應用場景非常有用。例如,多個 Web 伺服器容器可以掛載同一個包含靜態網站資料的 Volume:

docker run --name webserver01 -v webdata:/opt/web/data -d bitnami/nginx:latest
docker run --name webserver02 -v webdata:/opt/web/data -d bitnami/nginx:latest
docker run --name webserver03 -v webdata:/opt/web/data -d bitnami/nginx:latest
docker run --name webserver04 -v webdata:/opt/web/data -d bitnami/nginx:latest

內容解密:

  • 四個 NGINX 容器都掛載了名為 webdata 的 Volume 到 /opt/web/data 目錄。
  • 由於 NGINX 只讀取資料,不會出現因多個容器同時寫入導致的鎖定錯誤。

列出 Docker Volumes

當系統中存在多個 Volume 時,可以使用 docker volume ls 命令列出所有已建立的 Volume:

docker volume ls

內容解密:

  • 此命令顯示 Docker 主機上所有已建立的 Volume。

Docker 資料管理與持久化技術深度解析

在容器化的世界中,資料持久化是一項至關重要的議題。Docker 提供兩種主要方式來實作資料持久化:Volumes 和 Bind Mounts。正確理解和使用這兩種技術,可以有效管理容器資料,提升系統的穩定性和可維護性。

Docker Volumes 的管理與清理

Docker Volumes 是由 Docker 管理的持久化儲存解決方案。當使用 Volume 時,資料會儲存在 Docker 指定的目錄(通常是 /var/lib/docker/volumes)。隨著時間的推移,這個目錄可能會佔用大量磁碟空間,因此定期清理不再使用的 Volumes 成為一項重要的管理工作。

刪除容器的同時移除 Volume

使用 docker rm 命令刪除容器時,可以加上 -v 引數來刪除與該容器相關聯的 Volume。例如:

docker rm -v mysql

這將刪除名為 mysql 的容器及其相關的 Volume。

單獨管理 Volume

除了在刪除容器時順便刪除 Volume 外,也可以單獨對 Volume 進行管理。以下是一些常用的 Volume 管理命令:

  • 列出所有 Volume:docker volume ls
  • 刪除特定 Volume:docker volume rm <volume_name>
  • 清理未使用的 Volume:docker volume prune

在使用 docker volume prune 命令時,系統會列出即將被刪除的 Volume 並進行確認。這是一個不可逆的操作,因此需要謹慎使用。

Docker Bind Mounts 的原理與應用

除了 Volume 外,Docker 還提供另一種資料持久化的方式:Bind Mount。Bind Mount 允許將主機上的任意目錄掛載到容器內部,與 Volume 不同的是,Bind Mount 不受 Docker 的管理。

Bind Mount 的特點

  • 可以掛載主機上的任意目錄到容器內。
  • 不受 Docker 管理,需要手動維護。
  • 可以在容器啟動時自動建立掛載目錄。

為何使用 Bind Mount?

在某些場景下,Bind Mount 提供了比 Volume 更大的彈性。例如,當需要將主機上的特定資料目錄直接掛載到容器中使用時,Bind Mount 成為一個理想的選擇。

Volume 與 Bind Mount 的比較

特性VolumeBind Mount
管理方式由 Docker 管理不受 Docker 管理
儲存位置固定目錄(通常是 /var/lib/docker/volumes主機上的任意目錄
建立方式使用 docker volume create 命令在執行 docker run 時使用 -v 引數指定
刪除方式使用 docker volume rm 命令手動刪除主機上的目錄
內容重點整理
  • Docker Volume 是由 Docker 管理的持久化儲存方案。
  • 使用 docker volume prune 可以清理未使用的 Volume。
  • Bind Mount 允許將主機上的任意目錄掛載到容器內。
  • Bind Mount 不受 Docker 管理,需要手動維護。
  • 根據具體需求選擇合適的資料持久化策略。

透過上述的解析,我們可以更深入地理解 Docker 資料管理的核心概念和技術細節,為實際應用中的容器化資料管理提供堅實的基礎。

Docker 資料管理:Bind Mounts 與 tmpfs Mounts 詳解

在 Docker 中,資料管理是非常重要的一環。除了使用 Docker Volumes 外,Bind Mounts 和 tmpfs Mounts 也是常見的資料管理方式。本文將探討這兩種方式的使用方法和注意事項。

Bind Mounts:主機與容器之間的資料分享

Bind Mounts 允許將主機上的任意目錄掛載到容器中,使得容器可以存取主機上的資料。這種方式在開發和測試階段非常有用。例如,當你正在開發一個應用程式時,可以將原始碼儲存在主機上的 /source 目錄中,並將編譯後的執行檔儲存在 /apps/testapp 目錄中。然後,可以使用 Bind Mounts 將 /apps/testapp 目錄掛載到容器中,以便在容器中測試應用程式。

使用 Bind Mounts 的步驟

  1. 使用 docker run 命令的 -v 選項,將主機上的 /apps/testapp 目錄掛載到容器中的 /bin/testapp 目錄。
docker run -d -v /apps/testapp:/bin/testapp ubuntu:latest
  1. 在容器中執行應用程式,以測試其功能。
docker exec -it <容器ID> /bin/testapp/testapp
  1. 如果需要修改程式碼,可以在主機上進行修改,然後重新編譯執行檔。容器中的應用程式將自動使用新的執行檔。

Bind Mounts 的優缺點

Bind Mounts 的主要優點是可以在主機和容器之間分享資料。然而,這種方式也存在一些風險,例如,如果將主機上的敏感目錄(如 /etc)掛載到容器中,可能會導致安全問題。

tmpfs Mounts:使用主機 RAM 作為臨時儲存

tmpfs Mounts 允許將主機的 RAM 作為臨時儲存空間,用於存放容器中的資料。這種方式對於某些工作負載非常有用,例如需要高速存取資料的應用程式。

使用 tmpfs Mounts 的步驟

  1. 使用 docker run 命令的 --mount 選項,建立一個 tmpfs Mount。
docker run --mount type=tmpfs,target=/opt/html,tmpfs-mode=1770,tmpfs-size=1000000 --name nginx-test -d bitnami/nginx:latest
  1. 在容器中執行命令,以驗證 tmpfs Mount 是否正確建立。
docker exec -it nginx-test df -h

tmpfs Mounts 的優缺點

tmpfs Mounts 的主要優點是提供了高速的資料存取速度。然而,這種方式也存在一些限制,例如,tmpfs Mounts 只支援 Linux 平台,且單個 tmpfs Mount 只能掛載到一個容器中。此外,如果不指定大小,Docker 將使用主機 RAM 的一半作為 tmpfs Mount 的大小,這可能會導致 RAM 不足的問題。

內容解密:Bind Mounts 與 tmpfs Mounts 的比較
特性Bind Mountstmpfs Mounts
資料儲存位置主機上的任意目錄主機的 RAM
資料永續性資料儲存在主機上資料儲存在 RAM 中,容器停止後資料將遺失
效能取決於主機的檔案系統效能高速存取速度
安全性需要注意主機上的敏感目錄需要注意 RAM 不足的問題
平台支援跨平台支援只支援 Linux 平台

在選擇 Bind Mounts 或 tmpfs Mounts 時,需要根據具體的使用場景和需求進行選擇。透過瞭解這兩種方式的特性和限制,可以更好地管理 Docker 中的資料。

深入理解 Docker 網路

到目前為止,我們主要關注如何在主機系統上存取容器。然而,在許多情況下,僅僅能夠在本機存取容器是不夠的,我們還需要將容器暴露給外部使用者或系統。將容器暴露給外部並不像簡單地執行一個容器那麼簡單,我們需要考慮 Docker 提供的各種選項來將容器連線到網路。

技術需求

本章節沒有特定的技術需求。如果您想使用本章節中的範例建立網路,可以使用在第一章《Docker 和容器基礎》中建立的 Docker 主機。本章節中使用的網路範例對於未來的章節並非必要。

探索 Docker 網路

在本文中,我們將討論 Docker 中可用的網路選項,以及如何使用它們將容器暴露給外部使用者和系統。Docker 包含多種網路選項來將容器連線到您的網路,如果預設的網路選項無法滿足您的需求,您還可以選擇多種第三方網路外掛程式,它們提供了基本網路堆積疊中不包含的功能。預設情況下,Docker 網路專注於單一主機,但對於更複雜的案例,它包含了透過使用 Docker Swarm 來促進跨主機網路的功能。由於業界已經從使用 Docker Swarm 轉向其他解決方案,如 Kubernetes,本章節將重點關注單主機網路。

TCP/IP 連線埠快速回顧

我們假設您對 TCP/IP 有一定的瞭解,但對於那些新手來說,瞭解一些本章節中將會提到的網路概念是非常重要的。瞭解連線埠是完全理解 Docker 中暴露服務限制的關鍵概念。

當您組態 IP 時,您會為系統中的每個網路介面卡分配一個唯一的 IP 位址。當進行輸入或輸出連線時,請求中包括 IP 位址和介於 1 到 65535 之間的連線埠。您可能並不總是看到請求中的連線埠,因為許多應用程式會根據所使用的協定自動包含預設的連線埠。當您在瀏覽器中輸入 URL 時,通常只使用協定和主機名稱。舉個例子,如果您想開啟 Kubernetes 的首頁,您會在瀏覽器中輸入 http://kubernetes.io。HTTP 的預設連線埠是 80,所有瀏覽器都會預設請求使用連線埠 80。在幕後,瀏覽器實際上是在請求 http://kubernetes.io:80

IP 位址和連線埠的組合被稱為通訊端(socket),表示為 <IP 位址>:<連線埠>(例如 192.168.1.1:443)。通訊端是雙向通訊所必需的。當您請求一個網頁時,您的電腦會使用一個在 49152 和 65535 之間隨機選擇的連線埠發出輸出請求。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title TCP/IP 連線埠快速回顧

rectangle "傳送請求到 192.168.100.10:80 使用隨機連線埠 491" as n1
rectangle "回應到 192.168.100.150:49160" as n2
rectangle "傳送請求到 192.168.100.20:80 使用隨機連線埠 491" as n3
rectangle "回應到 192.168.100.150:49161" as n4

n1 --> n2
n2 --> n3
n3 --> n4

@enduml

圖表翻譯: 此圖示展示了使用者端與兩個不同的伺服器之間的通訊過程。使用者端使用不同的隨機連線埠對兩個伺服器發起請求,伺服器則回應到使用者端的對應連線埠。

圖表內容解密:

  • 使用者端使用隨機產生的連線埠對伺服器發起請求。
  • 伺服器回應使用者端的請求,使用使用者端指定的隨機連線埠。
  • 同時進行多個連線時,使用者端會使用不同的隨機連線埠。

Docker 網路型別

Docker 提供了多種網路型別,包括:

  • bridge 網路:預設的網路型別,用於單一主機上的容器間通訊。
  • host 網路:容器直接使用主機的網路堆積疊。
  • overlay 網路:用於跨多個主機的容器間通訊,通常與 Docker Swarm 一起使用。
  • macvlan 網路:允許為容器分配 MAC 位址,使其表現得像物理機器一樣。
  • none 網路:停用容器的網路功能。

建立使用者自定義的 bridge 網路

您可以透過以下命令建立一個新的 bridge 網路:

docker network create --driver bridge my_bridge_network

將容器連線到自定義 bridge 網路

在啟動容器時,您可以透過 --network 引數將其連線到自定義的 bridge 網路:

docker run -d --name my_container --network my_bridge_network my_image

內容解密:

  • docker network create 命令用於建立新的 Docker 網路。
  • --driver bridge 指定了網路驅動程式為 bridge。
  • docker run 命令用於啟動一個新的容器。
  • --network 引數指定了容器要連線的網路。

常見問題

  1. 以下哪種卷提供了容器的持久儲存?

    • A. tmpfs
    • B. Bind mounts
    • C. Volumes
    • D. SAN

    答案:C

  2. Docker 卷必須在使用前建立嗎?

    • A. True
    • B. False

    答案:A

  3. 在具有 64 GB RAM 的主機上建立 tmpfs 卷時,如果未設定大小,Docker 將建立多大的卷?

    • A. 1 GB
    • B. 64 GB
    • C. 20 GB
    • D. 32 GB

    答案:B

  4. 當移除容器時,Docker 卷會自動刪除嗎?

    • A. True
    • B. False

    答案:B

  5. 以下哪種卷型別由 Docker daemon 管理?

    • A. Bind volumes
    • B. Named volumes
    • C. All volumes
    • D. None

    答案:B

  6. 如何刪除未使用的 bind 卷?

    • A. 無需刪除;Docker 將自動刪除它
    • B. docker volume prune
    • C. docker volume bind prune
    • D. 您必須手動刪除 bind 資料夾

    答案:D