Introduction
在現代軟體開發與部署中,「可攜性」 和 「一致性」 是兩個非常重要的目標。開發者經常遇到「在我的機器上可以運行,但在伺服器上出錯」的問題,而容器技術就是為了解決這個問題而誕生的。
什麼是容器(Container)?
容器是一種輕量級的虛擬化技術,它能夠將應用程式及其所有依賴環境(如函式庫、設定檔等)封裝 在一個獨立的可執行單元內,並確保該應用能夠在任何支援容器的環境中運行,而不受底層作業系統的影響。
容器技術的核心概念來自於 Linux 的命名空間(Namespace)和控制群組(Cgroups):
- Namespace:提供進程級的隔離,確保每個容器擁有獨立的檔案系統、網路、行程空間等。
- Cgroups:控制容器對 CPU、記憶體、磁碟等系統資源的使用,確保不同容器不會互相干擾。
容器 vs. 傳統虛擬機(VM)
許多人會將容器與虛擬機(Virtual Machine, VM)作比較,兩者雖然都能提供獨立的運行環境,但運作方式截然不同。
容器與虛擬機的比較
比較項目 | 容器(Container) | 虛擬機(Virtual Machine, VM) |
---|---|---|
啟動速度 | 幾秒內啟動 | 需啟動整個作業系統,較慢 |
硬體資源使用 | 共用 OS 核心,較輕量 | 需模擬整個作業系統,較耗資源 |
隔離性 | 應用程式級別隔離 | 完整的作業系統級別隔離 |
可攜性 | 高,可跨平台運行 | 較低,需符合虛擬機平台要求 |
管理方式 | 透過 Docker 及相關工具管理 | 透過 Hypervisor 管理 VM |
容器技術的優勢
- 輕量級:容器只需幾 MB 的空間,並且可以快速啟動,而 VM 可能需要 GB 級別的資源並且啟動較慢。
- 一致性:應用程式及其環境完全封裝在容器中,確保「開發環境」與「正式部署環境」一致。
- 可攜性:可以在任何支援 Docker 的環境中運行,不需要重新安裝相依套件。
- 高效能:不需要額外的作業系統層,效能開銷更小,能夠更快地執行應用程式。
- 快速 部署:開發者可以將容器映像檔(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 的核心,它是一個伺服器應用程式,負責管理容器的執行。它包含以下三個部分:
- Docker Daemon(守護程序):負責管理 Docker 容器的生命週期。
- REST API:提供與 Docker Daemon 互動的 API 介面,讓其他工具可以控制 Docker。
- Docker CLI(命令列工具):使用者透過
docker
指令來與 Docker 互動,例如建立、啟動或停止容器。
Docker Image(映像檔)
Docker 映像檔是一個唯讀的模板,它包含應用程式的程式碼、相依函式庫、設定檔及執行環境。例如,你可以使用 nginx
映像檔來建立一個 Nginx Web 伺服器。
常見的 Docker 映像檔來源:
- 官方映像檔(如
ubuntu
、nginx
、mysql
)。 - 自訂映像檔(使用 Dockerfile 建立自己的映像檔)。
- Docker Hub 或私有倉庫(下載共享的映像檔)。
Docker Container(容器)
容器是從映像檔執行的獨立環境。你可以把 Docker 容器想像成一個運行中的應用程式,這個應用程式擁有自己的檔案系統、執行環境,並與其他容器隔離。
容器的特性:
- 可以啟動/停止(使用
docker start
、docker stop
)。 - 可以刪除/重建(使用
docker rm
)。 - 可以執行不同的版本(例如
mysql:5.7
和mysql: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 會:
- 從 Ubuntu 20.04 映像檔開始(
FROM ubuntu:20.04
)。 - 安裝 Nginx(
RUN apt-get install -y nginx
)。 - 啟動 Nginx 伺服器(
CMD ["nginx", "-g", "daemon off;"]
)。
總結
- 容器是一種輕量級虛擬化技術,可封裝應用程式及其依賴環境。
- Docker 是目前最流行的容器管理工具,可幫助開發者快速建構、部署和管理應用程式。
- Docker 透過映像檔(Image)和容器(Container)提供一致的開發與部署環境,並確保應用程式的可攜性。