cover

「可是在我電腦上明明可以跑啊!」—— 容器化就是為了終結這句話而生的。

先講結論

容器化把你的程式連同它需要的整個環境打包在一起,走到哪裡都能跑。你的 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 是目前的業界標準。


容器化最大的價值不是技術上的炫酷,而是讓「在你電腦上跑不起來」這句話從此消失。

延伸閱讀

Docker 官方文件 Kubernetes 官方文件 Docker — 從入門到實踐 架構 CD