換到新公司後需要負責一些部署方面的工作,因為是用 local 端起模型的模式,而且客戶的運行環境需要斷網,所以產品的更新需要使用到 docker,透過隔層分離,我們可以快速地遞交更新版本。也不會有環境不符的問題,雖然之前也學過 docker 並部署過東西,但大量使用卻是這份工作開始,為了加深印象,開始探索之旅吧。
什麼是 Docker?
Docker 是一個輕量化的部署平台,可以方便的部署程式、環境、及系統工具。底層機制為建立一個隔離的環境,可以把它理解成 docker 用了些特技把當前系統騙住了,讓他相信這其實是另一個環境。透過容器化
的方式,將環境隔離後,並在此環境運行我們定義的程式碼架構,但其實還是在調用當前系統的內核,所以我們還能在 docker 中寫一些 linux 指令。
核心功能
- Namespaces: 命名空間確保每個容器都有自己的系統視圖,包括自己的進程樹、網路介面和檔案系統。單一容器中的進程無法與另外的進程交互。
- Control Groups (cgroups): Cgroups(控制群組的縮寫)是一項 Linux 核心功能,允許將進程組織成分層群組並對這些群組應用資源限制,docker 利用此特性,限制每個容器的使用資源上限,避免資源競態。
- Union File System (UnionFS):聯合文件系統,允許覆蓋多個目錄,從而建立單一一致的檔案系統,而無需修改底層檔案。
image
為一種只讀的可執行且輕量的印象檔,內部為獨立的環境,由 Dockerfile 建立(下方介紹),可理解為一個掛載檔案,將檔案掛載至當前系統中!我們也可以透過 docker hub(一種類似 github 的東西,但是拿來存放 docker image),所以你可以自己寫,也可以下載別人寫好的服務~
container
最重要的部分,容器
將應用程式與其環境隔離,並確保應用程式在不同的運算環境中一致運行,輕量級的並且共享主機系統的內核
。且容器是基於 image 的,所以當我們透過 Dockerfile 設定 image 時,也可以理解為在設定未來要起的容器內容。這樣是不是很方便呢,過往我們必須要在不同的 host 部署程式的話,還要擔心 host 的各種版本問題,不論是前端還是後端,都需要統一這些環境版本,但有了 docker 後,我們幾乎可以達到一件部署的樣式。
Dockerfile
Dockerfile 是一個文字文件,其中包含一系列有關如何建立 Docker 映像的設定。我個人感覺是寫起來蠻像 yml 的。
實際上這個 markdown 網站也是用 docker 並使用 nginx 代理~
最好是在有 autoformat 的環境撰寫,不然容易多空白之類的...(被雷過🤪
Docker Daemon | Docker Client
Docker Daemon:( dockerd )是 Docker 的核心元件,在背景執行並管理所有 Docker 對象,例如映像、容器、網路和磁碟區。監聽 Docker API 請求並執行它們。 可以使用 JSON 或命令列來設定
Docker Client:( docker )是者與 Docker 互動的主要方式。執行docker run 之類的指令時,將這些指令傳送到 Docker Daemon 進程中執行~
常用指令
Network | Volume
Network: 允許容器相互通訊以及與外部服務通訊。每個容器都分配有自己的網路命名空間,為網路操作提供隔離的環境。
- host:共享主機的網路堆疊,允許容器直接存取主機的網絡,無需隔離。
- bridge:預設網路驅動程式。它創建了一個隔離的網絡,供容器之間相互通信,同時與外部網路隔離。
- overlay:允許跨多個 Docker 主機的容器進行通信
Volume: 用於持久性資料儲存。與容器檔案系統不同,容器檔案系統是短暫的,並且在容器被刪除時可能會遺失,Volume 提供了一種在容器生命週期之外儲存資料的方法。
即使容器停止或刪除,磁碟區也允許資料保留。它們對於需要資料儲存的應用程式(例如資料庫)至關重要。
Docker Commands Cheat Sheet
Docker Compose
是一個讓你可以定義多個 container 執行的設定文件,以 yaml 格式撰寫 docker-compose.yml
,
以下是 gpt-4o 提供的範例,基本上跟公司的長的 7788 像。通常我們可以加些綴詞來區分不同環境如
- docker-compose.local.yml
- docker-compose.sta.yml
- docker-compose.prod.yml ...etc
Docker Desktop | Orbstack | Portainer
Docker Desktop 是操作 docker 的 GUI 介面,可以方便你觀察容器使用情況...etc
OrbStack 是 Docker Desktop 的輕量級且高效的替代方案,用於在 macOS 上運行容器和 Linux 虛擬機器。解決了 Docker Desktop 的一些限制,例如資源密集性和複雜的設定。 使用更少的記憶體和 CPU 資源,但目前只在 macOS 上運行。
Portainer.io:是一個輕量級管理 UI,可輕鬆管理 Docker 環境,包括容器、映像、網頁和磁碟區。它提供了一個簡單直覺的基於 Web 的介面來管理 Docker 資源,使初學者和經驗豐富的使用者都可以更輕鬆地操作和監控其 Docker 環境。