Docker 實作詳解
從基本知識到進階應用,一步步認識與實作 Docker
重點摘要
- 基本概念完整解析: 包含映像檔、容器、卷與 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 不僅僅是一個工具,而是一種全新的開發、部署思維模式。透過自動化配置,您可以輕鬆實現開發、測試、預發佈及生產環境之間的一致性。
參考資源
- Docker Introduction - Omniwaresoft
- A Beginner's Guide to Docker - Tarswork Blog
- Dockerfile 設定指南 - iThome
- Docker Compose Tutorial - Runoob
- Docker Commands Tutorial - GTWang
相關搜尋與推薦探索
Last updated March 11, 2025