8.1 認識虛擬磁碟
掛載卷(Volumes)是 Docker 最有用的功能之一。透過它,容器可以輕鬆使用主機機器的資料。這個功能讓資料管理變得靈活且方便:你可以長期保存資料,在容器間共享資料,並且如果出現問題,也可以輕鬆地進行備份或恢復資料。
卷(Volumes)在 Docker 裡是一種保存資料的方式,使其不依賴於容器。即使容器被刪除,存放在卷裡的資料仍然安全無虞。卷可以掛載到容器上,這使得資料可以分開存放並重複使用,不管你創建或刪除了多少次容器都不會影響它們。
主要的卷類型
- 匿名卷(Anonymous Volumes)
- 當容器沒有明確指定卷時,Docker 會自動創建。
- 用於臨時儲存資料。
- 命名卷(Named Volumes)
- 由 Docker 創建並管理。
- 可以連接到多個容器,即使容器被刪除或停止也依然存在。
- 綁定卷(Bind Mounts)
- 將主機機器中的目錄與容器中的目錄進行綁定。
- 非常適合存取主機系統的資料,並且在開發過程中特別方便。
掛載卷的 docker run
指令主要語法
-v <host_path>:<container_path>
完整語法:
docker run -v <host_path>:<container_path> [OPTIONS] IMAGE [COMMAND] [ARG...]
掛載卷的主要參數
1. 參數 -v
或 --volume
用於創建命名卷或綁定卷。
範例:
docker run -d -v /host/data:/container/data nginx
2. 參數 --mount
提供更靈活且細緻的掛載卷方式,支持更多的參數。
範例:
docker run -d --mount type=bind,source=/host/data,target=/container/data nginx
8.2 創建與使用 Volumes
1. 命名 Volumes
命名 Volumes 是由 Docker 創建與管理的。它們主要用於長期儲存需要在容器重啟或刪除之後仍然保留的數據。
創建命名 Volume:
docker volume create my_volume
啟動掛載 Volume 的容器:
在這個例子中,Volume my_volume
被掛載到容器內的目錄 /data
。寫入到 /data
的所有數據將會保存在 Volume 中,即使刪除了容器,數據仍然可用。
docker run -d -v my_volume:/data --name my_container nginx
2. 匿名 Volumes
匿名 Volumes 是 Docker 自動創建的,它們與特定的容器綁定。這些 Volumes 適合用於刪除容器後不需要保留的臨時數據。
啟動帶匿名 Volume 的容器:
在這個例子中,Docker 將自動創建匿名 Volume,並將其掛載到容器內的目錄 /data
。
docker run -d -v /data --name my_container nginx
3. 綁定目錄
綁定目錄允許將主機系統中的目錄掛載到容器中。這在容器與主機系統之間共享數據時非常有用。這種方法在開發過程中也很常見,例如源代碼存儲在主機系統時。
啟動帶綁定目錄的容器:
在這個例子中,主機機器上的目錄 /host/data
被掛載到容器內的目錄 /container/data
。
docker run -d -v /host/data:/container/data --name my_container nginx
8.3 使用卷的範例
1. 保存資料庫數據
使用卷來保存資料庫數據,有助於在重新啟動或更新容器時保存數據。這點對於生產環境中的可靠運行特別重要。
範例:
在這個範例中,PostgreSQL 的數據被保存到卷 db_data
中,這確保了數據在重新啟動或刪除容器時不會丟失。
docker volume create db_data
docker run -d -v db_data:/var/lib/postgresql/data --name postgres_container postgres
2. 容器之間共享數據
有時候需要讓多個容器共享數據。卷讓這個操作變得簡單。
範例
我們將創建一個卷,並啟動兩個容器共同使用這個卷。這兩個容器都能訪問卷 shared_data
中的數據,從而實現數據共享。
docker volume create shared_data
docker run -d -v shared_data:/data --name container1 nginx
docker run -d -v shared_data:/data --name container2 nginx
3. 開發與測試
在進行應用程式開發時,可以使用綁定目錄來共享原始碼,讓容器和主機之間無縫合作。這樣開發者可以在主機上編輯程式碼,容器則可以立即使用更新後的程式碼。
範例
在這個範例中,主機上的目錄 /path/to/source
被掛載到容器 dev_container
的目錄 /app
中。這樣,容器可以直接使用主機系統上的最新原始碼。
docker run -d -v /path/to/source:/app --name dev_container node
8.4 卷管理
Docker 提供了方便的命令來管理卷,讓我們可以輕鬆創建、刪除以及查看卷的資訊。
1. 查看所有卷
這個命令會列出主機機器上所有可用的卷。
docker volume ls
2. 查看卷的資訊
使用這個命令可以獲取卷 my_volume
的詳細資訊:它在主機文件系統上的位置,以及使用該卷的容器資訊。
docker volume inspect my_volume
3. 刪除卷
這個命令會刪除卷 my_volume
。在刪除之前,務必要確認該卷未被任何容器使用,否則命令將無法執行。
docker volume rm my_volume
8.5 卷宗的備份
為了保證資料的安全,能夠創建卷宗的備份並在必要時恢復它們是很重要的。
1. 卷宗的備份
在這個例子中,卷宗 my_volume
的內容被歸檔到文件 my_volume_backup.tar.gz
中,然後保存在主機上的目錄 /backup
中。
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar czf /backup/my_volume_backup.tar.gz /volume
2. 卷宗的恢復
這個例子從存儲在文件 my_volume_backup.tar.gz
中的備份中恢復卷宗 my_volume
的內容。
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar xzf /backup/my_volume_backup.tar.gz -C /volume
GO TO FULL VERSION