Docker 安全性是容器化應用程式佈署的關鍵環節。本文介紹如何利用使用者名稱空間提升 Docker 容器的安全性,並提供 Docker 資源清理的最佳實踐,確保系統資源的有效利用。此外,文章也簡要介紹 Docker Registry 的概念及其在映像檔管理中的作用,協助讀者全面理解 Docker 生態系統。使用者名稱空間技術允許將容器內的 root 使用者對應到主機系統上的非特權使用者,即使容器遭到入侵,也能有效限制攻擊者在主機系統上的許可權。定期清理 Docker 映像檔和容器則有助於釋放磁碟空間,避免資源耗盡,提升系統穩定性。
- 檢視檔案許可權
ls -l file.txt
您會發現該檔案的所有者是 root,與擁有讀寫許可權。
使用者名稱空間:構建安全的隔離環境
Docker 引入了使用者名稱空間技術,允許將容器內的 root 使用者對應到主機系統上的非特權使用者。如此一來,即使容器內的應用程式以 root 身份執行,在主機系統上也僅擁有受限的許可權,有效降低安全風險。
以下步驟示範如何使用使用者名稱空間:
- 停止所有正在執行的容器和 Docker 引擎:
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
sudo systemctl stop docker
- 使用
--userns-remap
引數啟動 Docker 守護行程:
sudo dockerd --userns-remap=default &
此引數會建立一個名為 dockremap
的系統使用者,並將容器內的 root 使用者對應到該使用者。
- 檢視
/etc/subuid
和/etc/subgid
檔案,確認使用者和群組的 ID 對應關係:
cat /etc/subuid
cat /etc/subgid
- 建立一個測試檔案:
echo "我是從主機" > /tmp/usernamespace-test.txt
- 啟動一個 Alpine 容器,並將主機的
/tmp
目錄掛載到容器內:
docker run -itd -v /tmp/:/shared/ alpine
- 進入容器的 shell:
docker exec -it <container_id> sh
- 嘗試讀取和寫入測試檔案:
cd /shared/
ls
cat usernamespace-test.txt
echo "我是從容器" >> usernamespace-test.txt
您會發現可以讀取檔案,但無法寫入。這是因為容器內的 root 使用者在主機系統上並非真正的 root,其許可權受到限制。
- 使用
id
命令確認容器內使用者的 ID:
id
輸出結果會顯示容器內的 root 使用者對應到主機系統上的非特權使用者。
Docker 資源清理最佳實踐
為了維護系統的效能和穩定性,定期清理 Docker 映像檔和容器至關重要。以下是一些清理 Docker 資源的最佳實踐:
清理 Docker 容器
- 列出所有正在執行的容器:
docker ps
- 停止特定容器:
docker stop <container_id>
- 移除特定容器:
docker rm <container_id>
- 停止所有容器:
docker stop $(docker ps -aq)
- 移除所有容器:
docker rm $(docker ps -aq)
清理 Docker 映像檔
- 列出所有映像檔:
docker images
- 移除特定映像檔:
docker rmi <image_id>
- 移除所有映像檔:
docker rmi $(docker images -q)
Docker Registry 簡介
Docker Registry 是儲存和分發 Docker 映像檔的中心樞紐。Docker Hub 是一個公開的 Registry,任何人都可以存取。公司內部也可以搭建私有 Registry,以提升安全性並控管映像檔的存取許可權。
要確認目前使用的 Docker Registry,可以執行以下命令:
docker info
本文探討了 Docker 安全性的關鍵導向,包括使用者名稱空間的應用以及 Docker 資源的清理方法。透過使用者名稱空間,我們可以有效隔離容器與主機系統,降低安全風險。同時,定期清理 Docker 資源有助於維護系統的效能和穩定性。 理解 Docker Registry 的概念,則有助於我們更好地管理和分發 Docker 映像檔。
graph LR subgraph 主機系統 A[Root 使用者] --> B(檔案系統) end subgraph 容器 C[Root 使用者 - 對應到非特權使用者] --> D[檔案系統 - 掛載主機檔案系統] end D --> B
上圖展示了使用者名稱空間如何將容器內的 root 使用者對應到主機系統的非特權使用者,從而限制容器對主機檔案系統的存取許可權。
graph LR B[B] A[Docker Client] --> B{Docker Daemon} B --> C[Docker Registry]
上圖展示了 Docker Client、Docker Daemon 和 Docker Registry 之間的關係。Docker Client 透過 Docker Daemon 與 Docker Registry 互動,進行映像檔的推播和提取。
總結來說,本文提供了有關 Docker 安全性和資源管理的一些重要見解,包括如何使用使用者名稱空間來隔離容器,以及如何清理 Docker 資源以維護系統效能。同時,也簡介了 Docker Registry 的概念及其在映像檔管理中的作用。
立足系統安全與效能的交會點,本文深入探討了 Docker 的關鍵安全機制和資源管理策略。核心要點在於利用使用者名稱空間技術,有效隔離容器與主機系統,限制容器的許可權範圍,從而降低安全風險。此外,文章也提供了清理 Docker 容器和映像檔的最佳實踐,有助於維護系統的穩定性和效能。同時,簡要介紹了 Docker Registry 的概念及其在映像檔管理和分發中的重要作用,為讀者構建更全面的 Docker 知識體系。隨著容器技術的持續發展,精細化的安全管理和高效的資源利用將成為 Docker 生態演進的重要方向。 建議開發者深入研究使用者名稱空間的組態和應用,並將資源清理納入日常的 DevOps 流程,以構建更安全、更高效的容器化應用程式。