## Docker Docker 是一種開源的容器化技術,它能夠將應用程式及其所有相關的環境配置都打包到一個容器中,讓應用程式能在不同的系統上保持一致的運行環境。這項技術大幅簡化了應用程式的部署、擴展和管理流程,使其變得更加高效。 如下圖所示,Docker 是一個用於建構(build)、運行(run)和分享(share)應用程式的平台。它的核心優勢在於能夠將應用程式與其所有依賴項目 - 包括程式碼、運行環境、系統工具和系統函式庫等,全部打包成一個標準化的單元。每個 Docker 容器都是一個獨立且封閉的環境,這確保了應用程式能夠在任何環境中穩定運行。 ![image](https://hackmd.io/_uploads/BJ5oFWuUyg.png) 在傳統的部署流程中,我們需要逐一安裝各種依賴包和第三方軟體庫,這個過程往往繁瑣且容易出錯。而 Docker 技術徹底改變了這一點 - 它可以將應用程式與其運行所需的所有組件(包括依賴包、第三方軟體庫、配置文件等)一次性打包在一起。這種整體打包的方式確保了應用程式能夠在任何環境中正確且一致地運行,大大提高了部署的效率和可靠性。 ## Docker 和虛擬機的區別 - 虛擬機(VM): - VM 是一個完整的虛擬作業系統,包括虛擬硬體、作業系統核心、應用程式,以及其他相關資源。 - VM 需要虛擬化層(Hypervisor)來管理和運行,通常需要較大的映像檔(Image)。 - VM 的啟動速度較慢,需要幾分鐘。 - 安全性較高,因為硬體層以上都虛擬化。 - Docker 容器(Container): - Container 是一個封裝了應用程式相關的程式碼、函式庫和執行環境的隔離環境。 - Container 使用 Host OS 的核心運行,因此輕量且啟動速度快,映像檔一般只有數百 MB。 - 容器的移轉性強,可以在任何安裝了 Docker 的系統上運行。 - 更新容器較為容易,只需重新啟動即可。 - 兩者差異比較: ![image](https://hackmd.io/_uploads/HJtlCW_Lkl.png) ## 基本原理和概念 ![image](https://hackmd.io/_uploads/H19DAZd8ke.png) 1. 客戶端 (Client) - 使用者介面: - 這是使用者與 Docker 互動的主要方式,通常是透過命令列工具 docker。 - 功能: - docker run: 從映像檔 (image) 創建並啟動一個容器 (container)。 - docker build: 根據 Dockerfile 建構一個新的映像檔。 - docker pull: 從倉庫 (registry) 下載一個已存在的映像檔。 2. 伺服器 (Docker Host) - Docker daemon: 在後台執行的程序,負責接收並處理來自客戶端的指令。 - 映像檔 (images): 是一個只讀的模板,包含了運行應用程式所需的所有內容,例如系統工具、庫等等。 - 容器 (containers): 基於映像檔創建的運行實例,是應用程式實際運行的地方。每個容器都是相互隔離的,確保應用程式之間不會相互影響。 3. 倉庫 (Registry) - 儲存庫: 用於儲存 Docker 映像檔的地方。 - 功能: - 共享映像檔: 可以將自己建立的映像檔上傳到公共或私有倉庫,以便其他人使用。 - 下載映像檔: 從倉庫中下載所需的映像檔。 4. 運作流程 - 使用者 透過 docker run、docker build 或 docker pull 命令向 Docker daemon 發送請求。 1. Docker daemon 接收到請求後,根據命令執行對應的操作。 2. 如果是 docker pull,daemon 會從 registry 下載指定的映像檔到本地。 3. 如果是 docker build,daemon 會根據 Dockerfile 的指令一步步構建一個新的映像檔。 4. 如果是 docker run,daemon 會從本地或 registry 中找到指定的映像檔,並基於這個映像檔創建一個新的容器,然後啟動這個容器。 5. Containerization (容器化) - 將應用程式打包成容器,然後在容器中運行應用程式的過程。 - Dockerfile 是一個文件包含所有構建鏡像所需要的所有內容。 ## Docker Compose - Docker Compose 是一個工具,用於定義和運行多容器 Docker 應用程式。 - 它使用一個 YAML 檔案來配置應用程式的服務,每個服務對應一個容器。 - 一條命令即可創建並啟動所有服務。 ![image](https://hackmd.io/_uploads/Hk1w-39A0.png) ## Reference - [30分鐘 Docker 入門教學](https://www.youtube.com/watch?v=Ozb9mZg7MVM) - [Docker 介紹與安裝](https://medium.com/ching-i/docker-%E4%BB%8B%E7%B4%B9%E8%88%87%E5%AE%89%E8%A3%9D-6ca8ea6beaf0)