8個必學Docker映像與容器管理技巧:清理策略、跨平台應用及備份攻略!

作者:阿中哥 + AI 協助彙整。 【本文約有2,265字】

AI工作站的Docker映像與容器管理應用報告書

一、概述

本報告書旨在詳細說明 Docker 映像和容器的管理策略、跨平台特性、儲存佔用情況、常見問題的解答及定期備份方法,幫助使用者在工作站環境中合理高效地運行與維護 Docker 應用。

二、Docker 映像的固定性與跨平台性

2.1 映像的固定性

Docker 映像一經下載後,內容便會保持固定,不會自動變更。若需要新增應用程式或軟體庫,通常需要在映像基礎上生成新容器並進行修改,最後再保存為新的映像。

2.2 映像的跨平台性

Docker 映像具有跨平台的特性,理論上可以在不同操作系統上運行。比如同樣的 CUDA 11.8.0 映像可以在 Ubuntu 和 Windows 的 Docker 上使用,但需要注意以下事項:

  • Windows Docker 需要切換到 Linux 容器模式以支持 Linux 基礎映像。
  • 確保兩者均安裝適當的 NVIDIA 驅動和容器工具,以實現 GPU 支援。
  • 映像本身保持一致,但操作系統檔案系統差異需要在掛載本地磁碟時調整路徑格式。

三、容器生成與分層存儲

3.1 容器的生成

從一個映像生成容器時,不一定需要使用 Dockerfile 或 docker-compose.yml。可以直接使用 docker run 指令生成新容器,並透過 -v 指定本地磁碟掛載。

3.2 分層儲存機制

Docker 使用分層儲存技術。當在容器內進行更改時,這些更改會保存至容器的「寫入層」。如果將容器保存為新的映像,Docker 不會直接複製原始映像,而是透過分層的方式合併已存在的基礎層,這樣可以避免重複儲存,從而減少硬碟佔用空間。

四、容器的清理與管理策略

4.1 容器的累積情況

每次執行 docker run 生成新容器後,即使退出或停止容器,Docker 也會保留該容器的數據。長期累積會佔用儲存空間,造成工作站記憶體的浪費。

4.2 清理策略

  • 查看已停止的容器:使用 docker ps -a 檢視所有容器,包括已停止的容器。
  • 手動刪除已停止的容器:可以使用 docker rm 或 docker container prune 刪除所有停止的容器。
  • 自動刪除容器:在生成容器時使用 –rm 參數讓容器在停止後自動刪除,避免容器累積。

五、Docker 映像與容器的硬碟空間佔用

5.1 映像的實際空間佔用當導出映像時(例如使用 docker save),映像的 .tar 檔案大小接近 Docker 中映像的實際總大小。例如,如果 CUDA 11.8.0 基礎映像為 12 GB,並增加了 10 GB 的內容,最終 .tar 檔案大約為 22 GB。5.2 容器的空間佔用從映像生成的容器初始佔用的硬碟空間極小,幾乎是映像的 0%,因為容器會重用映像的基礎層。隨著容器運行過程中新增或修改的數據量增大,容器的硬碟佔用也會隨之增加,但不會重複佔用基礎映像的大小。

六、FAQ 常見問題解答

6.1 當我退出容器(使用 exit)後,容器內的變更會遺失嗎?

  • 不會。當使用 exit 或 docker stop 停止容器時,容器中的所有變更仍然保存在容器中,只是容器暫停運行。只有當你使用 docker rm 刪除容器時,容器中的變更才會被清除。

6.2 Docker 映像和容器是否是跨平台的?

  • Docker 映像是跨平台的,可以在不同的操作系統(例如 Windows 和 Linux)上使用同樣的映像(如 CUDA 11.8.0)。不過,Windows 上的 Docker 需要切換到 Linux 容器模式,並需要安裝相應的驅動。容器則基於操作系統的核心,因此 Linux 容器可在 Linux 系統上跨平台運行,但 Windows 和 Linux 核心之間不具備原生跨平台性。

6.3 每次從映像生成新容器後,容器是否會永久佔用硬碟空間?

  • 是的,每次執行 docker run 生成新容器,該容器會佔用硬碟空間,即使容器停止後,Docker 仍會保存該容器的數據。你可以使用 docker container prune 刪除已停止的容器來釋放空間,或在生成容器時加上 –rm 參數以自動刪除停止的容器。

6.4 如何將自製的映像傳送到其他電腦使用?

  • 可以使用 docker save 將映像保存為 .tar 檔案,然後傳輸到其他電腦上,使用 docker load 導入該映像。例如儲存:
    docker save -o my_image_backup.tar my_image_name

    例如載入之前的備份:
    docker load -i my_image_backup.tar

6.5 從映像生成的新容器是否會直接占用原始映像的硬碟大小?

  • 不會。新容器剛生成時幾乎不會佔用額外空間,因為 Docker 會共用映像的基礎層。隨著容器中新增或修改的數據量增大,硬碟佔用才會增加,但不會重複佔用基礎映像的大小。

6.6 如果根據一個映像檔(如 CUDA 11.8.0)生成的 v1 容器需要再新增項目生成 v2,如何保留 v1 和 v2

  • 可以先將 v1 容器保存為映像,然後基於此映像創建 v2 容器並進行修改,最後保存為 v2 映像。具體步驟是使用 docker commit 生成 v1 映像,基於 v1 映像生成 v2 容器,再使用 docker commit 保存為 v2 映像。

6.7 若基礎映像損壞,是否會影響衍生的映像和容器?

  • 是的,基礎映像損壞可能導致依賴於它的衍生映像和容器無法正常啟動。預防措施包括定期備份映像和檢查映像完整性。

七、定期備份策略

7.1 定期備份的必要性

定期備份 Docker 映像和容器數據是保護數據和應用穩定性的有效手段,特別是在基礎映像損壞或意外遺失時,可以快速恢復系統。

7.2 備份步驟

  1. 備份映像
    • 使用 docker save 指令將映像保存為 .tar 文件,以便在需要時重新導入。
    • 指令範例:docker save -o my_image_backup.tar my_image_name
  2. 備份容器數據
    • 若容器內有重要數據,建議將這些數據保存到本地卷中並進行備份,或者使用 docker commit 將容器狀態保存為新映像,再使用 docker save 導出。
  3. 儲存安全性
    • 將 .tar 備份文件存放在可靠的儲存位置(如外部硬碟或雲端),確保資料的安全性。
  4. 定期更新備份
    • 根據系統變更頻率定期更新備份,以保持映像和數據的最新狀態,建議每週或每月進行一次。

八、結論

通過有效的容器管理、清理策略及定期備份,Docker 使用者可以在不同操作系統上高效運行並維護應用環境。定期備份映像和數據的做法可以顯著提高系統的穩定性,並在映像損壞時快速恢復應用環境。Docker 的分層儲存結構在確保運行一致性的同時,減少了儲存空間佔用,使得系統資源能得到充分利用。

此報告書整合了 Docker 映像和容器管理的各項細節及最佳實踐,並提供了針對常見問題的解答和備份策略。

後記

因應 AI 熱潮,工作上需要,業餘研究也需要,年初便自己去光華購買零組件,自己組裝了一台 AI PC,並在上頭安裝了 2 張 GPU 顯示卡(RTX 3080 Ti 12 GB、RTX 3070 Ti 8 GB),我把它稱為我的 AI 工作站。

現在我經常需要在不同容器之間切換執行不同運算,這才發現對 Docker 的原理似懂非懂,經由上述逐步解析及實務經驗累積,現在已經完全瞭解,用起來也更加得心應手。順手趕快紀錄下來,以利日後備忘。