Docker 安全性是容器化應用程式佈署的關鍵環節。本文介紹如何利用使用者名稱空間提升 Docker 容器的安全性,並提供 Docker 資源清理的最佳實踐,確保系統資源的有效利用。此外,文章也簡要介紹 Docker Registry 的概念及其在映像檔管理中的作用,協助讀者全面理解 Docker 生態系統。使用者名稱空間技術允許將容器內的 root 使用者對應到主機系統上的非特權使用者,即使容器遭到入侵,也能有效限制攻擊者在主機系統上的許可權。定期清理 Docker 映像檔和容器則有助於釋放磁碟空間,避免資源耗盡,提升系統穩定性。

  1. 檢視檔案許可權
ls -l file.txt

您會發現該檔案的所有者是 root,與擁有讀寫許可權。

使用者名稱空間:構建安全的隔離環境

Docker 引入了使用者名稱空間技術,允許將容器內的 root 使用者對應到主機系統上的非特權使用者。如此一來,即使容器內的應用程式以 root 身份執行,在主機系統上也僅擁有受限的許可權,有效降低安全風險。

以下步驟示範如何使用使用者名稱空間:

  1. 停止所有正在執行的容器和 Docker 引擎:
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
sudo systemctl stop docker
  1. 使用 --userns-remap 引數啟動 Docker 守護行程:
sudo dockerd --userns-remap=default &

此引數會建立一個名為 dockremap 的系統使用者,並將容器內的 root 使用者對應到該使用者。

  1. 檢視 /etc/subuid/etc/subgid 檔案,確認使用者和群組的 ID 對應關係:
cat /etc/subuid
cat /etc/subgid
  1. 建立一個測試檔案:
echo "我是從主機" > /tmp/usernamespace-test.txt
  1. 啟動一個 Alpine 容器,並將主機的 /tmp 目錄掛載到容器內:
docker run -itd -v /tmp/:/shared/ alpine
  1. 進入容器的 shell:
docker exec -it <container_id> sh
  1. 嘗試讀取和寫入測試檔案:
cd /shared/
ls
cat usernamespace-test.txt
echo "我是從容器" >> usernamespace-test.txt

您會發現可以讀取檔案,但無法寫入。這是因為容器內的 root 使用者在主機系統上並非真正的 root,其許可權受到限制。

  1. 使用 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 流程,以構建更安全、更高效的容器化應用程式。