docker容器的概念
- 2019 年 10 月 6 日
- 筆記
容器化應用:
軟體應用(例如資料庫伺服器或 HTTP 伺服器)通常部署到虛擬 機或物理主機的運行有一組服務的作業系統中軟體應用受運行環境限制,作業系統的任何更新或修補程式都可能會 破壞該應用 對於開發應用的公司,對運行環境的任何維護都需要進行測試, 保證任何系統更新不會影響到應用 根據應用的複雜性,測試並不容易。而且更新通常要停止應用, 需在環境中啟用高可用,增加了複雜性

系統管理員可選擇使用容器,提供許多與虛擬機相同的優點,如 安全、存儲和網路隔離等,但要求的資源要少得多,而且啟動和 終止速度也更快 利用容器不僅能提升應用的效率、彈性和可重複利用性,也可加 強應用的移植能力。容器廠家有許多,如 Rocket、Drawbridge 和 LXC,但其中最大提供商是 Docker 以下為容器的一些主要優點:
- 硬體佔用量少 - 環境隔離
- 快速部署
- 多環境部署
- 可重複利用
Docker 架構:
Docker 是一種容器實現方式,受到多家公司的支援,紅帽在紅帽 企業 Linux Atomic Host 平台中提供支援
Docker Hub 提供大量由社區開發的容器
Docker 採用 CS 架構:
- 客戶端:docker 命令負責與伺服器通訊,通過 RESTful API 操作
- 伺服器端:docker 服務作為守護進程運行,承擔創建、運行和下 載容器鏡像的任務
Docker 核心三元素:
鏡像:image 是只讀模板,其中包括應用的庫和運行環境。鏡像 用於創建容器。可以創建、更新或下載鏡像
註冊表:registry 存儲鏡像,也可稱為鏡像倉庫,以滿足公共或 私有的用途。知名的公共註冊表為 Docker Hub,它存儲了由社 區開發的多種鏡像。也可在公司中創建私有註冊表。本課程在一 台虛擬機上運行私有註冊表(私有鏡像倉庫),其中存儲了所有 必要的鏡像以加快下載。在 RHEL 環境中,註冊表為 docker- registry.service
容器:container 是隔離的 namespace 環境,應用與共享同一 主機作業系統的其他應用相互隔離
容器和 Linux 內核:
容器由 Docker 從 Docker 格式的容器鏡像創建,通過 Linux 內 核的若干功能相互隔離。其中包括:namespace:內核可將對所有進程可見的系統資源放在一個命名 空間中。在一個命名空間中,只有屬於該命名空間的進程才能看 到這些資源。命名空間中的資源包括網路介面、進程 ID 列表、掛 載點、IPC 資源,以及系統本身的主機名稱等cgroups:將進程和子進程的集合分入不同的組中,以管理和限 制它們消耗的資源。cgroup 對容器可以使用的系統資源加以限 制,防止一個容器佔用主機上太多資源
SELinux:SELinux 是一種強制訪問控制系統,防止容器互相影 響,同時防止主機受到容器的影響。容器進程作為受限 SELinux 類型運行,對主機系統資源具有有限的訪問許可權。此外,sVirt 利 用 SELinux 多類別安全 (MCS) 來防止容器互相影響。每個容器的 進程放入唯一的類別中,從而互相隔離
Docker 容器鏡像:
Docker 中每個容器由一系列層(layer)組成,組成虛擬文件系 統。Docker 容器鏡像具只讀;添加的額外層會覆蓋其內容,但不會更改。image 使用 UnionFS 文件系統
可以通過兩種方式創建新鏡像:
- 利用運行中的容器:使用鏡像啟動新的容器實例,在新層中對容器 進行更改。存儲這一讀寫層將生成新的鏡像。這是創建鏡像的最簡單 途徑,但不是推薦的方法,因為鏡像可能會因為臨時文件和日誌等不 必要的文件而變得非常大
- 使用 Dockerfile:可以通過一系列稱為指令(command)的步驟從基礎鏡像構建容器鏡像。每一指令在鏡像上創建一個新層,以用於構建最終的容器鏡像。這是構建鏡像的建議方法。
關於運維學習、分享、交流,筆者開通了微信公眾號【運維貓】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學運維知識。