arrow_back回到田野筆記
DEVOPS 已發佈 9 Aug 2026

Docker 是什麼,開發者為什麼應該學習它?

給開發者的 Docker 實用指南:容器與虛擬機的差異、核心指令、Dockerfile,以及如何在真實專案中開始使用。

Docker 在工作機會和設定指南中不斷出現,如果你從未接觸過容器,可能會覺得它像一道必須跨越的牆才能寫出真正的程式碼。一旦你掌握了術語,其實沒有那麼複雜。

容器實際上是什麼

容器將你的應用程式及其執行所需的一切打包在一起:程式碼、執行環境、系統函式庫和設定檔案。它不是虛擬機。虛擬機會虛擬化整個作業系統,包括核心,這表示啟動一個虛擬機可能需要一分鐘並耗用幾 GB 的 RAM。容器共享主機的核心,只隔離行程,所以它在一秒內就能啟動,通常只用到幾十 MB 而不是幾 GB。

這就是 Docker 為什麼這麼快速地佔據了本機開發和 CI 流程的原因。你可以在一台筆電上啟動 Postgres 資料庫、Redis 快取和應用伺服器,而不需要直接在 OS 上安裝它們。

你需要了解的核心概念

有四個術語涵蓋了你日常處理的大部分工作:

  • Image(映像檔):從 Dockerfile 建立的唯讀範本。可以把它想成是檔案系統的快照加上關於如何執行它的元資料。
  • Container(容器):映像檔的執行實例。你可以啟動、停止和刪除容器,而無需觸及它們來自的映像檔。
  • Dockerfile:一個文字檔案,包含逐行建立映像檔的指令。
  • Registry(儲存庫):儲存和拉取映像檔的地方,最常見的是 Docker Hub。

Node.js 應用程式的最小 Dockerfile 看起來像這樣:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

使用 docker build -t my-app . 建立它,並用 docker run -p 3000:3000 my-app 執行它。-p 標誌將你的機器上的一個埠對應到容器內的一個埠,這就是你實際上如何從瀏覽器進入應用程式的方式。

你會經常使用的指令

少數幾個指令涵蓋了大部分日常工作:

  • docker ps — 列出執行中的容器
  • docker ps -a — 列出所有容器,包括已停止的
  • docker images — 列出你的機器上的映像檔
  • docker logs <container> — 檢查執行中或已崩潰的容器的輸出
  • docker exec -it <container> sh — 在執行中的容器內開啟 shell
  • docker rm / docker rmi — 清理你不再需要的容器和映像檔

最後這一對比人們預期的更重要。Docker 會很樂意讓磁碟空間消失在舊映像檔和已停止的容器中。定期執行 docker system prune 可以回收大量空間。

為什麼 docker-compose 改變了工作流程

大多數真實專案需要多於一個容器:應用伺服器、資料庫、也許還有快取。為每個容器寫出 docker run 指令很快就會變得乏味。docker-compose.yml 讓你在一個檔案中定義整個堆疊:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: devpassword
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

執行 docker compose up,兩個服務都會一起啟動,並進行網路連接,使 web 可以透過服務名稱連接到 db。這是你在幾乎每個開源項目的 README 中會看到的設定,理解它意味著你可以在幾分鐘內克隆一個專案並讓它執行,而不是手動安裝 Postgres、Redis 和應用程式需要的其他任何東西。

初期人們容易卡住的地方

Volume(卷)一開始幾乎會讓所有人困惑。如果沒有卷,在容器內寫入的任何資料在容器被移除時都會消失,這對資料庫來說是個問題。上面 compose 檔案中的 volumes 部分將一個具名卷對應到容器內的一個路徑,這樣資料在重新啟動後仍然存在。

另一個常見的錯誤是因為沒有 .dockerignore 檔案就將 node_modules.git 複製到映像檔中。像 .gitignore 一樣添加一個:

node_modules
.git
.env

這樣可以加快構建速度並減小映像檔大小,當你將映像檔推送到儲存庫或部署到 Kubernetes 時,這很重要。

掌握基礎後的進階方向

一旦構建和執行容器變得很正常,下一個有用的技能是用於產生較小映像檔的多階段構建、理解 Docker 網路模式,以及在某些東西無法正確連接時讀取 docker inspect 的輸出。沒有什麼是困難的,只是第一次接觸時不熟悉。

若要深入了解容器化真實應用程式並將其連接到雲部署流程,請查看 Korra Studio 上的 DevOps 和 Cloud 部分。

本文由 AI 協助撰寫,經 Michal Pilch(CISSP)審核並發佈,Korra Studio。

準備好更進一步了嗎?

這是 Korra Studio 知識庫中的一篇筆記——該平台將每個主題與一對一的師資配對。

免費開始arrow_forward