
「可是在我電腦上明明可以跑啊!」—— 容器化就是為了終結這句話而生的。
先講結論
容器化把你的程式連同它需要的整個環境打包在一起,走到哪裡都能跑。你的 Node.js 版本跟同事不一樣?測試環境跟正式環境設定差了一點點?容器化直接消除這些問題。Docker 是目前最主流的容器化工具,Docker Compose 管多個容器,Kubernetes 管大規模叢集。
容器不是虛擬機
很多人第一次聽到容器會以為它就是輕量版的 VM。概念接近,但差異很大:容器共享主機的 OS kernel,所以秒級啟動、MB 級佔用、接近原生效能。VM 要跑一整個 OS,分鐘級啟動、GB 級佔用。
白話說:VM 是蓋一棟獨立的房子,容器是在同一棟大樓裡隔出獨立的套房。隔音(隔離)沒有獨立房子好,但蓋起來快太多了。
Docker 三分鐘入門
核心概念就四個:Dockerfile(蓋房子的設計圖)、Image(蓋好的模型屋)、Container(住進去的實體房子)、Registry(存放模型屋的倉庫)。
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]docker build -t my-app . # 照設計圖蓋模型屋
docker run -d -p 3000:3000 my-app # 模型屋變成真的房子
docker ps # 看看有哪些房子在住人
docker exec -it <id> /bin/sh # 進去房子裡看看這幾行指令就能讓你的 app 跑在容器裡了。第一次成功的時候你會有一種「就這樣?」的感覺——對,就這樣。Docker 厲害的地方就在於它把複雜的事情變簡單了。
Docker Compose:同時管好幾個容器
實際專案通常不只一個服務。前端、後端、資料庫,用 Docker Compose 一次搞定:
version: '3.8'
services:
web:
build: ./frontend
ports: ["3000:3000"]
depends_on: [api]
api:
build: ./backend
ports: ["8080:8080"]
environment:
- DB_HOST=db
depends_on: [db]
db:
image: postgres:14
volumes: [postgres_data:/var/lib/postgresql/data]
environment:
- POSTGRES_PASSWORD=secret
volumes:
postgres_data:一個 docker compose up 三個服務全部跑起來。比你一個一個手動 docker run 優雅太多了。
Kubernetes:當容器多到管不動
當你的容器從幾個變成幾十個、幾百個,分散在多台機器上,就需要 Kubernetes(K8s)來編排。核心概念:Pod(最小部署單位)、Deployment(管 Pod 數量跟更新策略)、Service(給 Pod 一個穩定的網路入口)。
坦白說,如果你的團隊規模小、服務不多,Docker Compose 就夠了。K8s 的學習曲線很陡,光是看它的 YAML 就能讓你懷疑人生。但如果你在做微服務架構或需要自動擴縮容,K8s 是目前的業界標準。
容器化最大的價值不是技術上的炫酷,而是讓「在你電腦上跑不起來」這句話從此消失。