【Docker 筆記】Image & Container 的基本觀念
此系列筆記
- 【Docker 筆記】Image & Container 的基本觀念(本篇)
- 【Docker 筆記】Image & Container 基礎實作
- 【Docker 筆記】部署 React 到 AWS EC2
索引
- Docker 是什麼
- Docker 想解決什麼問題
- Container 的一致性、隔離性以及可攜性
- 所以容器化是什麼
Docker 是什麼
在【Docker只是一個實現容器化的工具 | 重點是容器化Container | 全網最詳解 | 分散式宇宙一部曲】這部影片提到:
- 容器化(Containerization)是一門技術
- Docker 是實現容器化技術的一個工具(待會提到容器化的意思)
- 實現容器化技術不一定要用 Docker,像是 podman 、k8s 都可以實現
Docker 想解決什麼問題
假設今天你本地的電腦是 macOS,遠端正式站的主機是 linux,在部署的應用程式到正式站時你可能要先熟悉 linux 的設定以及語法,然後 setup 好應用程式需要的環境後才能部署,部署完還要確保說你的應用程式能和作業環境是相容的,這部分就讓工程師花了很多時間在處理可能的配置錯誤,導致沒時間處理真正的業務邏輯。
而 Docker 的出現可以解決要花很多時間在處理配置上的問題,只要此作業環境能安裝 Docker,就能透過執行 Image 來跑 Container (待會解釋兩個名詞)來執行應用程式,就能來大大減少出錯的機會,就下面的圖來說 Container 主要是執行在 Docker Engine 上,而 Docker Engine 又建立在 OS 或是 VM 上,而要細究這些有什麼不同可以參考這篇淺談虛擬化技術:虛擬機(VM)與容器(Container)之技術價值與比較分析。
Container 的一致性、隔離性以及可攜性
而每個 Container 都具有一致性、隔離性以及可攜性:
- 一致性:只要該主機有安裝 Docker,在跑起來相同的 Image 時就會有相同的功能。
- 隔離性:Container 內的執行應用程式互不干涉,如 MySQL 和 SQL 都跑在個別的 Container,環境變數不互相干預,就不會造成應用程式出錯。
- 可攜性:Image 可以跑在任何一台有安裝 Docker 的電腦。
這些特性看看就好。
所以容器化是什麼
是一個輕量級的虛擬化技術,Docker 會將應用程式運行時所需的環境設定、軟體版本、應用程式的程式碼、資料庫以及網路配置等等打包成一個 Image(是一個可被執行的檔案),再透過 Docker 將 Image 跑起來變成 Container(可以想像成是一個 instance,會下載 Image 所描述的相關配置,如 code libraries 以及執行 runtime 等等,而應用程式也會被跑起來了),來用以下這張圖解釋一下 Image 和 Container 在整個流程所扮演的位置在哪。
Docker_Client
執行 docker 的指令,可以想像是餐廳老闆,他吩咐說應該要做哪些餐點,廚房要怎麼配置等等,可以透過 Command Line 或是 Docker Desktop 的GUI 介面來執行。
Docker Host (DockerDaemon)
聽從於 Docker_Client 的指令去執行事情,可以想像是餐廳執行主廚,被吩咐說要去買食譜回來研究開發並料理出餐等等。
Images
會透過 Dockerfile (放在專案的根目錄)描述的東西來打包成 Image,而 Docker Host 會執行 Images 上的步驟,就像是食譜。
Container
透過 Images 跑起來的 instance 環境,跑起來後你的應用程式就等同於部署好了,像是一個廚房能一直提供服務(做出餐點),而多個 Container 就像是不同的廚房都負責不一樣的餐點,但一樣都是要透過食譜製作出料理,而且一個 Container 只會運行一個 Image 的服務。
Registry
存放 Images 的地方,就和 github 一樣可以 push/pull,只是這裡是存放 Images,而公共 Registry,如 Docker Hub,也可以自託管的私有 Registry,保護專有或敏感的 images。
小結語
在了解 Docker 的過程還有其他的名詞如 Volumes 、Docker Compose 等等的,但這篇也算是介紹了最基本的流程,而這次的筆記也一解我過去不太理解的地方,總算是踏出了一小步,下一篇就來實際寫 Dockerfile 來產生 Image。