跳至主要内容

Introduction

在現代軟體開發與部署中,「可攜性」「一致性」 是兩個非常重要的目標。開發者經常遇到「在我的機器上可以運行,但在伺服器上出錯」的問題,而容器技術就是為了解決這個問題而誕生的。


什麼是容器(Container)?

容器是一種輕量級的虛擬化技術,它能夠將應用程式及其所有依賴環境(如函式庫、設定檔等)封裝 在一個獨立的可執行單元內,並確保該應用能夠在任何支援容器的環境中運行,而不受底層作業系統的影響。

容器技術的核心概念來自於 Linux 的命名空間(Namespace)控制群組(Cgroups)

  • Namespace:提供進程級的隔離,確保每個容器擁有獨立的檔案系統、網路、行程空間等。
  • Cgroups:控制容器對 CPU、記憶體、磁碟等系統資源的使用,確保不同容器不會互相干擾。

容器 vs. 傳統虛擬機(VM)

許多人會將容器與虛擬機(Virtual Machine, VM)作比較,兩者雖然都能提供獨立的運行環境,但運作方式截然不同。

what-is-a-container

容器與虛擬機的比較

比較項目容器(Container)虛擬機(Virtual Machine, VM)
啟動速度幾秒內啟動需啟動整個作業系統,較慢
硬體資源使用共用 OS 核心,較輕量需模擬整個作業系統,較耗資源
隔離性應用程式級別隔離完整的作業系統級別隔離
可攜性高,可跨平台運行較低,需符合虛擬機平台要求
管理方式透過 Docker 及相關工具管理透過 Hypervisor 管理 VM

容器技術的優勢

  1. 輕量級:容器只需幾 MB 的空間,並且可以快速啟動,而 VM 可能需要 GB 級別的資源並且啟動較慢。
  2. 一致性:應用程式及其環境完全封裝在容器中,確保「開發環境」與「正式部署環境」一致。
  3. 可攜性:可以在任何支援 Docker 的環境中運行,不需要重新安裝相依套件。
  4. 高效能:不需要額外的作業系統層,效能開銷更小,能夠更快地執行應用程式。
  5. 快速部署:開發者可以將容器映像檔(Image)打包並發佈至不同的環境,快速擴展應用程式。

什麼是 Docker?

Docker 是目前最流行的容器管理工具,它提供了一整套的工具與技術,讓開發者可以輕鬆建立、部署及管理容器化應用程式

Docker 的核心理念

Docker 的設計理念可以簡單歸納為:「Build, Ship, Run」,即:

  • Build(建構):開發人員使用 Dockerfile 定義應用程式環境,並建立 Docker 映像檔(Image)。
  • Ship(傳輸):Docker 映像檔可以推送至 Docker Hub(或其他私有倉庫)並分享給其他開發者或伺服器。
  • Run(執行):從映像檔啟動容器,並在不同環境中執行相同的應用程式。

Docker 的主要組件

Docker 由幾個核心組件組成,每個組件都負責不同的功能:

Docker Engine(Docker 引擎)

Docker Engine 是 Docker 的核心,它是一個伺服器應用程式,負責管理容器的執行。它包含以下三個部分:

  1. Docker Daemon(守護程序):負責管理 Docker 容器的生命週期。
  2. REST API:提供與 Docker Daemon 互動的 API 介面,讓其他工具可以控制 Docker。
  3. Docker CLI(命令列工具):使用者透過 docker 指令來與 Docker 互動,例如建立、啟動或停止容器。

Docker Image(映像檔)

Docker 映像檔是一個唯讀的模板,它包含應用程式的程式碼、相依函式庫、設定檔及執行環境。例如,你可以使用 nginx 映像檔來建立一個 Nginx Web 伺服器。

常見的 Docker 映像檔來源:

  1. 官方映像檔(如 ubuntunginxmysql)。
  2. 自訂映像檔(使用 Dockerfile 建立自己的映像檔)。
  3. Docker Hub 或私有倉庫(下載共享的映像檔)。

Docker Container(容器)

容器是從映像檔執行的獨立環境。你可以把 Docker 容器想像成一個運行中的應用程式,這個應用程式擁有自己的檔案系統、執行環境,並與其他容器隔離。

容器的特性:

  • 可以啟動/停止(使用 docker startdocker stop)。
  • 可以刪除/重建(使用 docker rm)。
  • 可以執行不同的版本(例如 mysql:5.7mysql:8.0)。

Docker Hub(映像檔倉庫)

Docker Hub 是 Docker 官方的映像檔倉庫,開發者可以從 Docker Hub 下載現成的映像檔,也可以上傳自己的映像檔,讓團隊或社群共享。

使用 docker pull 指令即可從 Docker Hub 下載映像檔,例如:

docker pull nginx

這將會從 Docker Hub 下載 nginx 的最新映像檔到本地端。


Dockerfile

Dockerfile 是用來定義 Docker 映像檔的設定檔,它包含了應用程式的所有安裝步驟,例如:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
CMD ["nginx", "-g", "daemon off;"]

這個 Dockerfile 會:

  1. 從 Ubuntu 20.04 映像檔開始FROM ubuntu:20.04)。
  2. 安裝 NginxRUN apt-get install -y nginx)。
  3. 啟動 Nginx 伺服器CMD ["nginx", "-g", "daemon off;"])。

總結

  • 容器是一種輕量級虛擬化技術,可封裝應用程式及其依賴環境。
  • Docker 是目前最流行的容器管理工具,可幫助開發者快速建構、部署和管理應用程式。
  • Docker 透過映像檔(Image)和容器(Container)提供一致的開發與部署環境,並確保應用程式的可攜性。