容器 (Container) 技術是什麼?從零開始看懂 Docker 與容器化應用

容器技術是一種讓應用程式可以在任何環境中穩定執行的打包技術,不需要擔心「在我電腦上可以跑,你電腦上不行」的問題。

它比虛擬機輕量、啟動快,是現代雲端開發的核心基礎。

只要你理解它的概念,Docker、Kubernetes 這些詞就不會再讓你頭痛。

容器技術的定義

一種「把應用程式和它需要的所有東西打包在一起」的技術,確保程式在任何環境都能穩定執行。

這個「所有東西」包含:

  1. 程式碼本身
  2. 執行環境 (不同程式需要的環境都不一樣)
  3. 相依套件 (像是函式庫 Library 或模組,沒有裝就不能順利跑起來,像 python 要處理資料就要再裝 pandas)
  4. 容器設定檔 (Dockerfile)

打包完之後,這個容器可以在任何支援容器的機器上執行。

不管你的作業系統是 Ubuntu、CentOS 還是 Windows Server,甚至在你的 Mac 電腦,只要先裝好 Docker,同一個容器都可以順利跑起來。

容器和「貨櫃」的關係:生活化比喻

容器的英文是 Container,這個字本來就是「貨櫃」的意思。

以前船運貨物,每次都要重新裝箱、綁繩、確認尺寸,而每艘船、每個港口規格不同,搬運過程很容易出錯。

貨櫃標準化之後,不管是船運、火車還是卡車,同一個貨櫃直接搬上去就能走,裡面的東西不需要重新整理。

容器技術做的事情一模一樣:把你的應用程式裝進一個標準化的「盒子」,這個盒子搬到哪裡都能直接執行。

從實體貨運到數位標準 容器 (Container) 的本質

容器技術解決了什麼問題?

在它出現之前,工程師最常遇到這個情境:

開發環境裝的是 Python 3.8,測試環境是 Python 3.6,上線環境是 Python 3.11。

程式在開發機跑得好好的,一到正式環境就報錯,花兩天找問題,最後發現程式根本沒寫錯,而是套件版本不對。

容器從根本解決這個問題:開發、測試、上線用的是同一個容器映像檔,環境完全一致,不會出現版本差異。

在我電腦上可以跑!!

容器技術的運作原理

容器是怎麼隔離環境的?

容器使用 Linux 核心內建的兩個機制來做隔離:

  1. Namespace:讓每個容器有自己的「視角」,容器 A 看不到容器 B 的處理程序、網路介面、檔案系統。
  2. Cgroups(Control Groups):限制每個容器能用多少 CPU、記憶體、磁碟 I/O,避免一個容器把整台機器的資源吃光。

這兩個機制讓多個容器可以同時在同一台機器上執行,彼此不干擾,也不互搶資源。

如果你是初學者來,不需要記住 Namespace 和 Cgroups 的細節。

只要記住一件事:容器的隔離是靠作業系統核心直接支援的,不是靠模擬出另一台電腦。這就是容器比虛擬機輕量的根本原因。

為什麼容器可以這麼輕量?

虛擬機要模擬一整台電腦,包含硬體層、作業系統、核心。

光是一個虛擬機就要佔用 10–20 GB 的空間,啟動需要 30 秒到幾分鐘,所以開機才這麼慢。

容器不模擬硬體,也不需要自己的作業系統核心,直接借用宿主機(Host)的 Linux 核心。

一個容器映像檔大約只有 100–200 MB,啟動時間在 1–3 秒以內。

這個差異在大規模部署時非常明顯:一台實體機器可能只能跑 10–20 個虛擬機,但可以輕鬆跑超過 100 個容器。

容器 (Container) 輕量化的秘密 作業系統級別的隔離

容器映像檔(Image)是什麼?

容器映像檔(Image)是容器的「範本」,是一個唯讀的打包檔案,裡面包含程式碼和所有執行環境,用來啟動容器實例。

「實例」這個名詞有點難解釋,你可以理解爲一臺虛擬的小電腦,隨時可以產生出來或刪除掉。

你可以把 Image 想成「食譜」,容器是「用這份食譜做出來的菜」。

同一份食譜可以做出很多份菜,同一個 Image 可以啟動很多個容器實例,彼此獨立、互不影響。

你也可以把 Image 想成遊戲光碟片,那容器就是光碟片開始轉,裡面的遊戲檔被讀出來執行的樣子。

Image 採用分層結構:

  1. 底層是作業系統基礎(例如 Ubuntu slim)
  2. 上面一層是語言環境(例如 Node.js 18)
  3. 最上面才是你的應用程式

如果你第一次打包映像檔,它會先上網下載作業系統環境的相關檔案;然後第二層再下載你的程式語言所需要的環境檔案,以及一些相依性的套件。

由於它每一層都可以快取 (暫存在你電腦裡面),如果你的程式碼有改,更新容器只需要重新打包有變動的那層,不用再下載作業系統跟程式語言環境,效率很高。

容器映像檔 (Image) 唯讀的應用程式食譜

容器 vs 虛擬機:哪裡不一樣?

容器(Container)和虛擬機(Virtual Machine,VM)都是用來隔離執行環境的技術,但架構完全不同:

容器共用宿主機的 OS 核心,虛擬機則模擬出一整台獨立的電腦。這個差異直接決定了兩者在速度、體積和資源消耗上的巨大差距。

架構差異一次看懂

比較項目容器虛擬機
作業系統共用宿主機核心每個 VM 有自己的 OS
啟動時間1–3 秒30 秒–幾分鐘
映像檔大小100–500 MB10–40 GB
隔離程度程序層隔離完整硬體層隔離
資源消耗
移植性高(跨平台執行)中(依賴 Hypervisor)

啟動速度與資源佔用的比較

容器啟動快,不是因為硬體更好,而是架構不同。

虛擬機每次啟動的流程:

  1. 初始化虛擬硬體
  2. 載入 BIOS
  3. 啟動 OS 核心
  4. 載入系統服務
  5. 才能執行你的程式

容器啟動的流程:

  1. 在宿主機核心上建立隔離空間
  2. 載入映像檔
  3. 執行程式

跳過了模擬硬體和啟動 OS 這兩個最耗時的步驟,所以快。

在資源佔用方面:一台 8 GB RAM 的伺服器,跑虛擬機時每個 VM 至少需要 1–2 GB RAM 給 OS 本身;

跑容器時 OS 的 RAM 消耗幾乎為零,幾乎所有記憶體都給應用程式用。

核心架構對決 為什麼容器能取代虛擬機?

什麼情況該用容器?什麼情況該用虛擬機?

適合容器的情況:

  1. 微服務架構,需要大量部署小型服務
  2. CI/CD 流程,需要快速啟動、測試、銷毀環境
  3. 開發環境一致性,多人協作的專案
  4. 雲端部署,需要彈性擴充和縮減的應用程式

適合虛擬機的情況:

  1. 需要完整 OS 隔離(例如執行不信任的第三方程式)
  2. Windows 應用程式(容器對 Windows 的支援較複雜)
  3. 需要模擬不同作業系統進行相容性測試
  4. 對安全隔離要求極高的金融或醫療系統

兩者不是非此即彼的關係。

實際生產環境中,常見做法是:虛擬機作為底層基礎設施,容器在虛擬機上運行。

Docker 容器:最主流的容器工具

Docker 是什麼?和容器的關係

容器技術這個概念在 Docker 之前就存在,但當時提供容器技術的廠商非常多,而且操作複雜、工具不統一,只有少數工程師會用。

Docker 是目前最主流的容器工具,由 Docker Inc. 於 2013 年發布。

它讓開發者可以用簡單的指令打包、分發、執行容器,大幅降低容器技術的使用門檻。

並且提供統一的指令介面、映像檔格式,以及 Docker Hub 這個映像檔共享平台。

所以 Docker 幾乎一統江湖,成為容器技術的獨佔廠商。

容器技術是概念,Docker 則是最受歡迎的容器廠商。

現在說「用容器部署」,90% 的情況都是在用 Docker 或基於 Docker 格式的工具。

Docker: 將複雜概念轉化為開發標準

Docker Hub:映像檔從哪裡來?

Docker Hub 是 Docker 官方的映像檔倉庫(Repository),可以把它想成「容器的 App Store」。

想跑一個 MySQL 資料庫?不需要自己安裝,一行指令就能從 Docker Hub 下載官方的 MySQL 映像檔,直接啟動。

Docker Hub 上有超過 1,000 萬個映像檔,包含:

你也可以把自己打包好的映像檔推上去,私有或公開都支援。

Docker 官方的映像檔倉庫(Repository)Docker Hub

用 Docker 跑第一個容器:3 個步驟

假設你已經安裝好 Docker,跑第一個 Docker 容器只需要:

  1. 開啟終端機,輸入 docker pull nginx,從 Docker Hub 下載 Nginx 的映像檔
  2. 輸入 docker run -d -p 8080:80 nginx,啟動容器並把 8080 port 對應到容器內的 80 port
  3. 開啟瀏覽器,前往 http://localhost:8080,看到 Nginx 歡迎頁面就代表成功

從下載到執行,整個過程在 30 秒內完成。你不需要安裝、設定 Nginx,只要這三步就有一個完整運行的 Web 伺服器。這就是 Docker 容器改變開發流程的地方。

Kubernetes 容器編排:容器多了之後怎麼管?

為什麼需要 Kubernetes?

3–5 個容器,Docker 指令就夠用。300 個容器分散在 20 台伺服器上,Docker 指令完全不夠用。你需要解決:

  • 某個容器掛掉,要怎麼自動重啟?
  • 流量暴增,要怎麼自動增加容器數量?
  • 新版本要怎麼在不停機的情況下更新?
  • 20 台伺服器的資源要怎麼統一分配?

這些問題就是「容器編排」要解決的事。

從單一容器到艦隊管理 規模化的挑戰

Kubernetes(簡稱 K8s)是目前最主流的容器編排平台,由 Google 於 2014 年開源,現在由 CNCF(雲端原生運算基金會)維護,是大規模容器化應用的業界標準。

Kubernetes 和 Docker 的分工

Docker 負責:建立和執行單個容器

Kubernetes 負責:管理大量容器的生命週期,包含排程、擴縮、自我修復、網路和儲存配置。

兩者是互補關係,不是競爭關係。在大多數生產環境中,Kubernetes 會呼叫容器執行時(Container Runtime)來實際啟動和停止容器,Docker 就是最常見的容器執行時之一。

容器編排解決的三個核心問題

Kubernetes 解決了容器規模化之後最常見的三個痛點:

  1. 自我修復(Self-healing):容器掛掉,Kubernetes 在幾秒內自動重新啟動,不需要人工介入
  2. 水平擴展(Horizontal Scaling):CPU 使用率超過 80% 時,Kubernetes 自動新增容器副本;流量下降後自動縮減,節省成本
  3. 滾動更新(Rolling Update):新版本部署時,Kubernetes 逐步替換舊容器,零停機時間,出問題可以一鍵回滾到上一版
Kubernetes (K8s) 現代容器編排 (管理) 的業界標準

容器技術的實際應用場景

開發環境一致性:再也不會「我電腦上可以跑」

這是最直接、最普遍的應用場景。

10 人的開發團隊,每個人的電腦環境都不一樣:Windows、macOS、不同版本的 Linux,不同版本的 Node.js、Python、資料庫。

用容器技術,把開發環境定義在一個 docker-compose.yml 檔案中。新成員加入團隊,執行一個指令就能啟動和資深工程師完全相同的開發環境,從加入到開始寫程式只需要 15 分鐘,而不是過去光設定環境就要花一整天的「環境設定地獄」。

微服務架構與容器化應用

微服務架構是把一個大型應用程式拆成很多個小型、獨立的服務,每個服務負責一個功能,可以獨立開發、部署、擴展。容器化應用是微服務架構的最佳搭配:每個微服務打包成一個容器,可以用不同的程式語言撰寫、獨立部署、獨立擴展。

舉個例子:一個電商平台有訂單服務、庫存服務、推薦系統、金流服務各自獨立。促銷期間推薦系統需要大量 CPU,你可以只針對推薦系統的容器擴展,不需要把整個平台都擴展,省下大量成本。

CI/CD 流程中的容器角色

CI/CD(持續整合 / 持續交付)是現代軟體開發的標準流程:工程師提交程式碼後,自動執行測試、打包、部署,不需要人工介入。

容器在 CI/CD 流程中扮演關鍵角色:

  1. 測試環境用容器啟動,每次測試都在乾淨的環境中執行,不受之前測試殘留的狀態影響
  2. 打包成容器映像檔,確保開發、測試、正式環境用完全相同的產物
  3. 部署時直接替換容器,速度快、可回滾,比傳統部署方式風險低很多

容器技術的限制與常見誤解

容器不是萬能的:三種不適合用容器的情境

它很強,但不是所有情境都適合:

  1. 需要 GUI 的桌面應用程式:容器設計上是無頭(Headless)的,跑有圖形介面的軟體需要額外設定
  2. 需要直接存取硬體的應用程式:例如需要存取特定 GPU、USB 裝置,容器的隔離層會增加複雜度
  3. 狀態複雜的單體式舊系統(Legacy System):把有幾十年歷史的大型系統容器化,往往需要大量改寫,成本超過效益

容器技術最適合「雲端原生(Cloud Native)」的應用程式——從設計之初就考慮到分散式部署、無狀態、水平擴展的架構。

容器安全性:常見疑慮與對應做法

容器的隔離比虛擬機弱——這是事實,但不代表容器不安全。

常見的安全疑慮和對應做法:

  1. 容器逃逸(Container Escape):攻擊者從容器內部突破隔離,存取宿主機。
    對應方式:不以 root 身分執行容器、定期更新容器映像檔、使用 Seccomp 和 AppArmor 限制系統呼叫
  2. 映像檔安全性:從 Docker Hub 下載的映像檔可能包含漏洞或惡意程式。
    對應方式:只使用官方映像檔或自建基礎映像、在 CI/CD 流程中加入映像檔掃描(例如 Trivy、Snyk)
  3. 密鑰管理:不要把密碼、API Key 直接寫進映像檔。
    對應方式:使用 Kubernetes Secret 或 HashiCorp Vault 管理敏感資訊

容器安全是可以管理的問題,只要遵守基本的安全實踐,風險完全在可接受的範圍內。

技術界線與安全防護 容器並非萬靈丹

學容器的建議路徑

從 Docker 開始還是從概念開始?

建議先從概念開始,再動手。

很多人第一步就打開終端機跑 Docker 指令,結果遇到錯誤不知道為什麼,也不知道自己在做什麼,很快就放棄。

理解「容器是什麼、解決什麼問題、和虛擬機有什麼差別」之後,再開始動手,每一個指令都有清楚的脈絡,遇到問題也更容易判斷方向。

推薦的學習順序與資源

從零開始學容器技術,建議依這個順序:

  1. 理解概念:搞清楚容器 vs 虛擬機、Image vs 容器的關係(本文就是起點)
  2. 安裝 Docker Desktop:官網提供 WindowsmacOS 的圖形化安裝包,10 分鐘內完成
  3. 跑第一個容器:用 docker run hello-world 確認環境正常,再跑 Nginx 或 Python 應用程式
  4. 學習 Dockerfile:學會自己撰寫 Dockerfile,把自己的應用程式打包成映像檔
  5. 學習 Docker Compose:用 YAML 檔案定義多容器環境,例如「應用程式 + 資料庫」的組合
  6. 入門 Kubernetes:理解 Docker 之後再學 K8s,不要跳過 Docker 直接學 K8s

每個階段大約需要 1–2 週,有實作練習的情況下,2–3 個月可以達到在工作中使用容器技術的基本水準。

零基礎實戰路徑 從概念到生產力

結語:容器技術值得學嗎?

值得,而且越早學越好。

容器技術已經不是「進階技能」,而是現代後端工程師和 DevOps 工程師的基本配備。

人才需求中出現 Docker、Kubernetes 的頻率,在過去五年內增加了超過三倍。

從理解容器的概念開始,裝好 Docker,跑幾個練習專案,這樣就夠了。Kubernetes 和進階的容器編排,等你對容器有基本掌握之後再學,不會太晚。

容器技術的學習曲線在前兩週最陡,一旦度過那段,後面會越來越順。

容器化已非進階選項, 而是現代雲端的必備基石

常見問題(FAQ)

Q1:容器技術是什麼?用一句話說明。
A:容器技術是一種把應用程式和它的執行環境打包在一起的技術,確保程式在任何機器上都能穩定執行,不受底層作業系統差異影響。
它比虛擬機輕量、啟動更快,是現代雲端部署的核心基礎。
尤其是它在開發、測試、上線環境完全一致,是容器技術解決的最核心問題。

Q2:一個容器可以同時跑多個應用程式嗎?
A:技術上可以,但不建議。容器的設計哲學是「一個容器、一個程序」,這樣才能充分發揮容器的輕量性和獨立性。
如果你需要跑多個應用程式,應該用多個容器,再用 Docker Compose 或 Kubernetes 讓它們協同工作。

Q3:容器和 Serverless 有什麼關係?
A:Serverless(如 AWS Lambda、GCP Cloud Functions)是更高階的抽象,你不需要管理伺服器或容器,只要上傳函數程式碼就好。
但實際上,很多 Serverless 平台的底層就是用容器技術來隔離和執行函數,只是這個細節被平台隱藏起來了。
最有名的就是 Cloud Run,它可以直接讓你的容器跑起來。

Q4:Docker 和 Podman 有什麼差別?
A:Podman 是 Red Hat 推出的容器工具,最大差別是不需要常駐的 Daemon(背景服務),以及預設不需要 root 權限執行,安全性稍高。
指令格式和 Docker 幾乎完全相同,可以直接替換使用。
對初學者來說,先學 Docker 就好,兩者概念完全通用。Podman 知名度低很多。

Q5:容器映像檔更新了,跑起來的容器會自動更新嗎?
A:不會。已經在跑的容器使用的是啟動時的映像檔版本,不會自動套用新映像檔。
你需要停止舊容器、拉取新映像檔、再啟動新容器。
這也是為什麼 Kubernetes 的滾動更新(Rolling Update)功能很重要,它可以幫你自動完成這個過程,而且不停機。

Q6:容器的資料存放在哪裡?容器刪掉資料會不見嗎?
A:預設情況下,容器內部產生的資料在容器刪除後就消失了。這是容器「無狀態」設計的一部分。如果你需要持久保存資料(例如資料庫的資料),要使用 Volume(磁碟掛載),把資料存在宿主機的指定路徑,容器刪除後資料仍然存在。

Q7:學容器技術需要先學 Linux 嗎?
A:不需要精通,但需要基本熟悉。你需要能看懂基本的 Linux 指令(ls、cd、cat、chmod)、了解檔案系統結構,以及知道什麼是 Port 和環境變數。
如果這些概念對你完全陌生,建議先花 1–2 週補一下 Linux 基礎,之後學容器技術會順很多。

Q8:免費使用 Docker 有限制嗎?
A:Docker Desktop(桌面版)對個人使用和小型公司(員工數少於 250 人、年營收低於 1,000 萬美元)免費。超過這個規模需要付費訂閱。
Docker Engine(命令列版本,在 Linux 伺服器上使用)則是完全免費且開源的。Docker Hub 免費帳號有 Image 下載次數限制,付費帳號則無限制。

Q9:GCP、AWS、Azure 上的容器服務有什麼差別?
A:三大雲端平台都提供託管的 Kubernetes 服務:GCP 是 GKE(Google Kubernetes Engine)、AWS 是 EKS(Elastic Kubernetes Service)、Azure 是 AKS(Azure Kubernetes Service)。
三者核心功能相似,差異在於和各自雲端生態系的整合程度。GKE 因為 Kubernetes 本身就是 Google 開發的,整合度和功能被認為是最成熟的。

Q10:公司說要「容器化」現有的系統,這有多難?
A:難度差異很大,取決於現有系統的架構。
如果是相對現代的應用程式(有明確的相依套件清單、設定可以用環境變數注入),架構清晰的應用程式, 1–3 週就能完成基礎版本。
如果是有幾十年歷史的大型單體式系統,深度依賴特定硬體或作業系統功能,容器化可能需要數個月甚至不值得做。
建議先評估系統架構,再決定是否容器化以及容器化的範圍,有可能需要大幅的更動甚至重寫程式碼。

Table of Contents
返回頂端