文章目錄
- 🐳 Docker 入門教程(二):Docker 的基本原理
- 1. Docker 架構總覽:三大核心角色
- 2. 鏡像與容器的關系
- 3. 容器啟動流程:`docker run` 背后發生了什么?
🐳 Docker 入門教程(二):Docker 的基本原理
在學習鏡像與容器的命令操作之前,我們必須弄清楚:Docker 是如何運作的?容器和鏡像到底是什么關系?docker run
背后到底做了什么?
這一節我們通過結構圖 + 原理分析,建立起對 Docker 系統性理解的底層認知。
1. Docker 架構總覽:三大核心角色
Docker 采用經典的客戶端 - 服務端架構(C/S 架構),它主要由以下三部分組成:
1.1 Client(客戶端)
客戶端就是我們日常使用的命令行工具,例如:
docker build
docker pull
docker run
這些命令本質上不會直接操作容器或鏡像,而是通過 HTTP API 請求把意圖發送給 Docker 服務端。
1.2 Docker Daemon(服務端)
也稱為 dockerd
,是 Docker 的守護進程,負責實際執行一切命令,包括:
- 拉取鏡像
- 構建鏡像
- 創建 / 啟動容器
- 管理網絡、掛載、資源等
它同時維護兩個最核心的資源:
- Images(鏡像):只讀模板,用于創建容器
- Containers(容器):基于鏡像運行出來的隔離進程
1.3 Registry(鏡像倉庫)
這是 Docker 鏡像的集中分發平臺,默認是 Docker Hub,也可以是私有倉庫(如 Harbor)。
Docker Daemon 會在執行 docker pull
、docker run
時自動從 Registry 拉取鏡像。
圖解架構流程
+---------+ HTTP API +-------------------------+
| Client | ─────────────?──────────? | Docker Daemon |
| | | (dockerd) |
| docker | | |
| build | | +------------+ |
| pull | | | Images |?───────┐
| run | | +------------+ |
+---------+ | | Containers | || +------------+ |+-------------------------+▲│pull/push│+-------------------------------+| Registry || (Docker Hub or custom) |+-------------------------------+
2. 鏡像與容器的關系
Docker 中,鏡像(Image)和容器(Container)的關系可以從兩個角度來類比理解:
類比一:類 vs 實例
-
鏡像 就像一個類(Class)
它定義了對象的結構、行為和屬性,但不能直接運行。 -
容器 就是類創建出來的實例(Instance)
每個容器基于鏡像創建,可以獨立運行、修改、銷毀,彼此互不影響。
類比二:安裝包 vs 軟件
-
鏡像 像是一個軟件安裝包,里面包含程序代碼和運行環境。它本身是靜態的、不能直接運行。
-
容器 就是你在電腦上安裝并運行起來的軟件,它有自己的配置、運行數據和狀態。你可以同時運行多個程序實例,它們都來源于同一個安裝包。
3. 容器啟動流程:docker run
背后發生了什么?
當你運行:
docker run redis
Docker 表面上只做了一件事:運行了一個 Redis 容器。
但實際上,它在背后做了一系列工作,整個過程可以拆成幾個簡單的步驟:
第一步:找鏡像
Docker 會先檢查你本地有沒有 redis
鏡像。
- 有就直接用
- 沒有就從 Docker Hub 下載
第二步:創建容器
基于鏡像,Docker 創建一個容器。就像“解壓安裝包、準備好環境”。
這一步會:準備一個獨立的運行環境p;分配一個容器 ID;設置網絡和存儲
第三步:啟動容器
Docker 會執行容器里的默認啟動命令(比如 Redis 的服務器進程),讓它真正“跑起來”。
此時容器就進入了運行狀態(Running)。
第四步:資源隔離 & 控制(Docker 背后自動做的)
雖然我們看不見,但 Docker 還會在后臺做幾件重要的事:
- 資源隔離:讓容器擁有自己獨立的文件系統、網絡、進程空間等
- 資源限制:防止某個容器用光 CPU 或內存
- 文件系統掛載:用一種叫 Overlay 的方式疊加鏡像和容器的文件系統,便于讀寫分離