Docker 的運作方式——建置、傳送、執行 · 心智圖
Docker 的運作方式——建置、傳送、執行. 可編輯嘅心智圖,以彩色分支、子題目同曲線連結呈現概念。 曲線表示關聯;只有方向重要時先用箭嘴。
Docker 把一個應用程式連同它所需的一切打包成一個映像檔,然後把它當作容器執行——一個隔離的程序,在任何裝有 Docker 引擎的機器上,行為都完全一致。
Docker 的運作方式——建置、傳送、執行 · 心智圖
The interactive MindMap canvas for this explanation — every lane, row and arrow above is a real QueryChart diagram you can open and edit.
點樣閱讀呢張心智圖
- 由中央主題開始,沿住彩色分支探索相關概念。
- 曲線表示關聯;只有方向重要時先用箭嘴。
Describe & build
呢個分支匯集 “The Dockerfile is a recipe: base image, dependencies, files to copy, the command to run. It makes the build reproducible — the same file produces the same image everywhere.”, “docker build packages the app and its dependencies”.
Image
呢個分支匯集 “An image is the packaging artifact: everything the app needs to run, frozen in read-only layers. It never changes once built.”, “Image is pushed to a registry, or pulled from one”.
Container
呢個分支匯集 “docker run starts a container from the image”, “Namespaces isolate what the process can see (its own file system, network, processes); cgroups limit what it can use (CPU, memory). This is how many containers run on one host without fighting.”.
Host kernel
呢個分支匯集 “Container shares the host kernel but has its own file system”.
Portable app
呢個分支匯集 “Because the container carries its own runtime, libraries and configuration, “works on my machine” stops being a real failure mode.”.
跨分支關聯
映像檔是一張唯讀的快照;容器則是它執行起來的一個實例。
容器共用主機核心,並以 namespaces 造出隔離的假象——這就是它們幾秒內就啟動,而虛擬機器要用幾分鐘的原因。
Cgroups 限制一個容器可以耗用多少,所以一個吵鬧的鄰居不會令整部主機挨餓。
映像檔不可變這一點,正是「在任何地方都以同樣方式執行」成立的原因。
Docker 提供打包與執行環境;Kubernetes 這類編排工具則管理散佈在多部主機上的大量容器。
Key relationships and takeaways
- 映像檔是一張唯讀的快照;容器則是它執行起來的一個實例。
- 容器共用主機核心,並以 namespaces 造出隔離的假象——這就是它們幾秒內就啟動,而虛擬機器要用幾分鐘的原因。
- Cgroups 限制一個容器可以耗用多少,所以一個吵鬧的鄰居不會令整部主機挨餓。
- 映像檔不可變這一點,正是「在任何地方都以同樣方式執行」成立的原因。
- Docker 提供打包與執行環境;Kubernetes 這類編排工具則管理散佈在多部主機上的大量容器。
When to use this visual
- 向一位開發者講解 Docker 為甚麼行得通,以及容器與虛擬機器有甚麼分別。
- 在一支團隊寫下第一份 Dockerfile 之前,先帶他們熟習建置、傳送、執行這個模型。
- 為一場關於環境漂移的討論定下基礎——為甚麼「在我的機器上是好的」不再說得通。
運作方式
調整中央主題
按項目或課堂修改中央主題名稱。
擴展分支
編輯概念並加入例子或註解。
連結相關概念
畫出跨分支連結;只有方向重要時先用箭嘴。
常見問題
容器與虛擬機器有甚麼分別?
虛擬機器把硬件虛擬化:它自帶一套完整的作業系統,一切都經由 hypervisor 居中處理,所以它既笨重又啟動得慢。容器則把作業系統虛擬化:它共用主機核心,以 namespaces 達成隔離,以 cgroups 設下資源上限。這就是容器幾秒內就啟動、而且輕得多的原因——代價是同一部主機上的所有容器,都共用那部主機的核心。
映像檔與容器有甚麼不同?
映像檔是靜態的產物——由 Dockerfile 建置出來、關於應用程式及其依賴的一張唯讀快照。容器則是這個映像檔動起來的樣子:一個執行中的程序,上面多了一層可寫入的分層。你只建置一次映像檔,就可以由它啟動成千上萬個容器,而每一個都與其他容器隔離。
Docker 怎樣隔離容器?
靠兩項 Linux 核心功能。Namespaces 令每一個容器對系統都有自己一套視野——自己的檔案系統、網絡堆疊、程序表與用戶 id——所以它看起來就像一部獨立的機器。Cgroups(control groups)則限制並計量資源,為一個容器可以耗用多少 CPU、記憶體與 I/O 封頂,令一個容器無法拖垮它的鄰居。
Docker 為甚麼令應用程式可以到處搬?
因為映像檔把應用程式連同它的執行環境、程式庫與設定一併打包——除了核心以外的一切。只要有 Docker 引擎的地方,這個映像檔就以同樣的方式執行,於是開發者的手提電腦、CI runner 與生產環境伺服器之間的落差,就收窄到只剩下那些刻意留在映像檔外面的設定。
喺 QueryChart 編輯呢張心智圖
喺可編輯畫布開啟心智圖。移動概念、加入分支同畫連結。