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_PASSWORD為my-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 的比較
| 特性 | Volume | Bind 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 的步驟
- 使用
docker run命令的-v選項,將主機上的/apps/testapp目錄掛載到容器中的/bin/testapp目錄。
docker run -d -v /apps/testapp:/bin/testapp ubuntu:latest
- 在容器中執行應用程式,以測試其功能。
docker exec -it <容器ID> /bin/testapp/testapp
- 如果需要修改程式碼,可以在主機上進行修改,然後重新編譯執行檔。容器中的應用程式將自動使用新的執行檔。
Bind Mounts 的優缺點
Bind Mounts 的主要優點是可以在主機和容器之間分享資料。然而,這種方式也存在一些風險,例如,如果將主機上的敏感目錄(如 /etc)掛載到容器中,可能會導致安全問題。
tmpfs Mounts:使用主機 RAM 作為臨時儲存
tmpfs Mounts 允許將主機的 RAM 作為臨時儲存空間,用於存放容器中的資料。這種方式對於某些工作負載非常有用,例如需要高速存取資料的應用程式。
使用 tmpfs Mounts 的步驟
- 使用
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
- 在容器中執行命令,以驗證 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 Mounts | tmpfs 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引數指定了容器要連線的網路。
常見問題
以下哪種卷提供了容器的持久儲存?
- A. tmpfs
- B. Bind mounts
- C. Volumes
- D. SAN
答案:C
Docker 卷必須在使用前建立嗎?
- A. True
- B. False
答案:A
在具有 64 GB RAM 的主機上建立 tmpfs 卷時,如果未設定大小,Docker 將建立多大的卷?
- A. 1 GB
- B. 64 GB
- C. 20 GB
- D. 32 GB
答案:B
當移除容器時,Docker 卷會自動刪除嗎?
- A. True
- B. False
答案:B
以下哪種卷型別由 Docker daemon 管理?
- A. Bind volumes
- B. Named volumes
- C. All volumes
- D. None
答案:B
如何刪除未使用的 bind 卷?
- A. 無需刪除;Docker 將自動刪除它
- B.
docker volume prune - C.
docker volume bind prune - D. 您必須手動刪除 bind 資料夾
答案:D