Ask me anything
Ithy Logo
Sign in to save

Docker 實作詳解

從基本知識到進階應用,一步步認識與實作 Docker

docker containers hardware tools

重點摘要

  • 基本概念完整解析: 包含映像檔、容器、卷與 Docker Hub 的介紹。
  • Dockerfile 與 docker-compose.yaml 詳解: 了解如何自動化構建映像和管理多容器應用。
  • 常用指令實戰: 從建置、啟動到管理容器的指令和流程一一解析。

基本知識

Docker 是一個開源的容器化平台,旨在透過將應用程式及其相依環境封裝到容器中,實現跨環境、一致性的部署。其核心優勢在於將應用與環境完全隔離,從而避免「在我這邊能跑」的問題。傳統虛擬化技術需要在每個容器中都執行一個完整的作業系統,而 Docker 利用共享宿主機核心的方式,減少了資源開銷並提高啟動速度。

主要元件與概念

映像檔 (Image)

映像檔是一個唯讀模版,包含了建立容器所需的作業環境、應用程式代碼、庫以及其它依賴。可將其視為安裝包,部署時容器依據映像檔來建立運行環境。Docker Hub 作為雲端映像檔的資源庫,提供大量已預建的映像檔供開發者使用。

容器 (Container)

容器是映像檔的運行實例,每一個容器在一個獨立的隔離環境中運作。使用容器可以使得應用程式之間互不干擾,而且能夠快速橫向擴展部署。容器還支持卷 (Volumes),以便在容器重啟或刪除後保持數據的持久化。

其他關鍵概念

除了映像檔和容器外,Docker 還擁有如 Dockerfile、docker-compose.yaml 這兩個核心配置檔案。這些配置檔案不僅提升了建構和部署過程的自動化程度,同時簡化了多容器環境下的管理工作。此外,Docker 的 CLI 指令集使開發者能夠輕鬆地控制整個系統的狀態與資源,從容器啟動、停止、重啟到映像檔的建立與刪除,都能夠通過簡單的命令完成。


DOCKERFILE 詳解

Dockerfile 是一個純文字檔案,內含一系列指令,用以定義如何構建 Docker 映像檔。它就像是一份操作手冊,描述了容器環境的建立步驟,從所需的基礎映像檔開始,逐步添加必須的應用程式、依賴、配置到最終的啟動指令。

基本語法與常用指令

FROM

指定一個基礎映像檔,所有後續命令都基於此映像開始構建。例如:

# 以 Python 3.9-slim 為基礎映像檔
FROM python:3.9-slim

WORKDIR

設定工作目錄,所有後續指令會在這個目錄下運行。這有助於保持環境的一致性,避免路徑混淆:

WORKDIR /app

COPY 與 ADD

COPY 指令用於複製檔案或資料夾到容器內部,通常用來把程式碼或配置文件複製到工作目錄。ADD 則是其擴展版本,除複製功能外,還支持自動解壓縮壓縮檔:

COPY . /app

RUN

在構建映像過程中,RUN 指令用來執行指令,通常用於安裝依賴套件或執行設定操作。例如安裝 Python 的第三方套件:

RUN pip install -r requirements.txt

CMD

定義容器啟動後執行的預設命令,且一個 Dockerfile 只能擁有一個 CMD 指令,通常在容器啟動時指定應用程式的執行入口:

CMD ["python", "app.py"]

EXPOSE

此指令僅用於宣告容器內部應用程式監聽的埠號,讓埠號映射更加明確:

EXPOSE 8000

綜合以上指令,一個簡單 Dockerfile 範例如下:

# 選擇基礎映像檔
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製程式碼到容器內
COPY . /app

# 安裝依賴
RUN pip install -r requirements.txt

# 暴露埠號
EXPOSE 8000

# 設定容器啟動後執行的命令
CMD ["python", "app.py"]

docker-compose.yaml 詳解

當應用程式涉及多個容器,使用 docker-compose.yaml 可以大幅簡化管理。Compose 用 YAML 語法描述應用程式中所有容器與服務的配置,並能夠一鍵啟動整個應用組合。透過定義服務、網路、卷及其依賴關係,便於在開發或生產環境中快速部署。

基本語法與範例解析

版本與服務定義

docker-compose.yaml 一開始通常需指定版本,然後進行各個服務的定義。例如:

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db

  db:
    image: postgres
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword

在此範例中:

  • web 服務從當前目錄構建映像檔,並將本機的 8000 埠映射到容器的 8000 埠。
  • db 服務則使用官方 PostgreSQL 映像檔,同時設定必要的環境變數。

卷 (Volumes) 與環境變數

利用卷能夠將本機文件夾或持久化存儲掛載到容器中,使得應用程式在重啟或移除容器後資料依然保留。同時,環境變數用於指定容器內部的參數設定,例如資料庫用戶和密碼,此功能在多服務依賴場景中特別重要。


常用指令

熟悉 Docker 常用指令是實際應用 Docker 的基石。以下列出了一些最常見的指令,以及它們在整個工作流程中所扮演的角色。

映像檔構建與管理

docker build

使用 docker build 命令來根據 Dockerfile 建立映像檔。常用語法如下:

# 建構映像檔並命名為 myapp
docker build -t myapp .

docker images

該指令用來列出本機上的所有映像檔,方便檢查構建狀態或進行映像檔的管理:

docker images

容器的啟動、管理與運行

docker run

此指令用於從映像檔啟動一個新的容器,並可單獨設置埠口映射,例如:

# 從 myapp 映像檔啟動容器並映射 8000 埠
docker run -d -p 8000:8000 myapp

docker ps

列出所有正在運行的容器資訊:

docker ps

docker stop 與 docker start

分別用於停止正在運行的容器及重新啟動已停止的容器:

# 停止指定 container_id 的容器
docker stop <container_id>

# 重新啟動指定 container_id 的容器
docker start <container_id>

docker rm 與 docker rmi

用來刪除已停止的容器與不再需要的映像檔:

# 刪除容器
docker rm <container_id>

# 刪除映像檔
docker rmi myapp

使用 Docker Compose 管理多容器應用

docker-compose up

一鍵啟動在 docker-compose.yaml 中定義的所有服務。這條命令不僅構建映像檔(若尚未存在),還初始化各個容器:

docker-compose up

docker-compose down

停止並移除所有透過 docker-compose 啟動的容器、網路以及卷,是進行環境重置的理想命令:

docker-compose down

Docker 指令與配置一覽表

下表綜合了常用的 Docker 指令,便於快速參考使用:

指令 用途 範例
docker build 從 Dockerfile 建立映像檔 docker build -t myapp .
docker run 啟動容器 docker run -d -p 8000:8000 myapp
docker ps 列出正在運行的容器 docker ps
docker stop 停止容器 docker stop <container_id>
docker-compose up 啟動多容器服務 docker-compose up
docker-compose down 關閉多容器服務 docker-compose down

實作案例與應用示例

透過整合 Dockerfile 與 docker-compose.yaml,我們可以輕鬆構建一個完整的應用環境。假設要建立一個 Python Web 應用,將其與 PostgreSQL 數據庫一起部署,流程可分為以下步驟:

步驟 1:建立 Dockerfile

首先,您需要建立一個 Dockerfile,定義 Python 環境、安裝依賴以及啟動應用。例如:

# 使用官方 Python 映像檔作為基礎
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製應用程式代碼
COPY . /app

# 安裝必要的 Python 套件
RUN pip install -r requirements.txt

# 暴露容器內部的開放埠號
EXPOSE 8000

# 容器啟動時執行應用
CMD ["python", "app.py"]

步驟 2:建立 docker-compose.yaml

接下來,透過 docker-compose.yaml 定義多個服務。包括一個 Web 服務與一個資料庫服務:

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword

完整的配置可以使得兩個服務之間自動建立網絡連接,確保資料庫在 Web 服務啟動前正常運作。

步驟 3:啟動服務

最後,在含有這兩個配置檔案的目錄中執行:

docker-compose up

此指令會自動建構映像檔(如果尚未存在)、啟動各個容器並連接它們。若需要關閉並清理環境,只需執行:

docker-compose down

此流程不但簡化了部署和維護,還使得應用程式在不同平臺上都能夠保持一致的運行狀態與表現。


實用最佳實踐與注意事項

針對日常開發與生產環境部署,以下是一些值得注意的最佳實踐:

  • 精簡映像檔: 避免在映像檔中存放不必要的檔案或工具,藉此縮小映像大小並加快部署速度。
  • 分層構建: 每一個 Dockerfile 指令會形成一個新的層級,合理分割可以促使構建過程更有效。
  • 環境隔離: 使用卷來保持資料持久性,將配置與資料存儲分離,確保容器更新不影響數據。
  • 監控與日誌: 定期檢查容器日誌與資源利用情況,使用 docker-compose logs 等工具了解應用運行情況。
  • 安全性: 避免在映像檔中包含敏感資訊,如密碼和電鑰,應使用環境變數或秘鑰管理工具。

掌握以上知識與實踐,將大幅提升應用程式的可移植性、擴展性以及維護效率。Docker 不僅僅是一個工具,而是一種全新的開發、部署思維模式。透過自動化配置,您可以輕鬆實現開發、測試、預發佈及生產環境之間的一致性。


參考資源


相關搜尋與推薦探索

docs.docker.net.tw
簡介 | Docker 文件
liupeng0518.github.io
docker-compose.yml 语法说明

Last updated March 11, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI