Docker 簡介
Docker 是一個開源的容器化平台,讓開發者能夠將應用程式及其相依套件打包成一個輕量級、可移植的容器。透過 Docker,您可以確保應用程式在任何環境中都能以相同的方式運行,無論是開發、測試還是生產環境。
Docker 的核心優勢
- 一致性:消除「在我的電腦上可以跑」的問題
- 隔離性:每個容器都是獨立運行的環境
- 可移植性:容器可以在任何支援 Docker 的平台上運行
- 效率:相比傳統虛擬機,容器更加輕量且啟動速度快
- 版本控制:可以追蹤容器映像檔的變更歷史
容器 vs 虛擬機
虛擬機 (Virtual Machine)
虛擬機透過 Hypervisor 在實體硬體上模擬完整的作業系統環境:
- 包含完整的客體作業系統 (Guest OS)
- 需要較多的系統資源(CPU、記憶體、儲存空間)
- 啟動時間較長(通常需要數分鐘)
- 提供較高的隔離性
容器 (Container)
容器共享宿主機的作業系統核心,僅包含應用程式和相依套件:
- 不需要額外的作業系統
- 資源消耗極低
- 啟動時間極短(通常只需數秒)
- 更適合微服務架構
比較表格
| 特性 | 虛擬機 | 容器 |
|---|
| 啟動時間 | 數分鐘 | 數秒 |
| 資源消耗 | 高 | 低 |
| 隔離性 | 完全隔離 | 程序級隔離 |
| 可移植性 | 較差 | 極佳 |
| 映像檔大小 | GB 級別 | MB 級別 |
安裝步驟
在 Ubuntu 上安裝 Docker
- 更新套件索引
- 安裝必要的相依套件
1
2
3
4
5
| sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
|
- 新增 Docker 官方 GPG 金鑰
1
2
| sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
- 設定 Docker 套件庫
1
2
3
| echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
- 安裝 Docker Engine
1
2
| sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
- 驗證安裝
1
| sudo docker run hello-world
|
讓非 root 使用者可以執行 Docker
1
2
| sudo usermod -aG docker $USER
newgrp docker
|
基本指令
系統資訊
1
2
3
4
5
6
7
8
| # 查看 Docker 版本
docker version
# 查看 Docker 系統資訊
docker info
# 查看 Docker 磁碟使用情況
docker system df
|
容器操作指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 列出執行中的容器
docker ps
# 列出所有容器(包含已停止的)
docker ps -a
# 啟動容器
docker start <container_id>
# 停止容器
docker stop <container_id>
# 重新啟動容器
docker restart <container_id>
# 刪除容器
docker rm <container_id>
# 強制刪除執行中的容器
docker rm -f <container_id>
|
執行容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 基本執行
docker run <image_name>
# 以互動模式執行
docker run -it <image_name> /bin/bash
# 在背景執行
docker run -d <image_name>
# 指定容器名稱
docker run --name my-container <image_name>
# 映射連接埠
docker run -p 8080:80 <image_name>
# 掛載磁碟區
docker run -v /host/path:/container/path <image_name>
|
映像檔與容器操作
映像檔管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 搜尋映像檔
docker search <image_name>
# 下載映像檔
docker pull <image_name>
# 列出本地映像檔
docker images
# 刪除映像檔
docker rmi <image_id>
# 清理未使用的映像檔
docker image prune
|
建立自訂映像檔
建立一個名為 Dockerfile 的檔案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 基礎映像檔
FROM ubuntu:22.04
# 維護者資訊
LABEL maintainer="your-email@example.com"
# 更新系統並安裝套件
RUN apt-get update && apt-get install -y \
nginx \
&& rm -rf /var/lib/apt/lists/*
# 複製檔案到容器
COPY index.html /var/www/html/
# 設定工作目錄
WORKDIR /var/www/html
# 開放連接埠
EXPOSE 80
# 啟動指令
CMD ["nginx", "-g", "daemon off;"]
|
建立映像檔:
1
| docker build -t my-nginx:v1 .
|
容器日誌與監控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 查看容器日誌
docker logs <container_id>
# 即時追蹤日誌
docker logs -f <container_id>
# 查看容器資源使用情況
docker stats
# 查看容器詳細資訊
docker inspect <container_id>
# 進入執行中的容器
docker exec -it <container_id> /bin/bash
|
資料持久化
Docker 提供兩種主要的資料持久化方式:
1. Volumes(磁碟區)
1
2
3
4
5
6
7
8
9
10
11
| # 建立磁碟區
docker volume create my-volume
# 使用磁碟區啟動容器
docker run -v my-volume:/data <image_name>
# 列出所有磁碟區
docker volume ls
# 刪除磁碟區
docker volume rm my-volume
|
2. Bind Mounts(綁定掛載)
1
2
| # 將主機目錄掛載到容器
docker run -v /host/path:/container/path <image_name>
|
總結
Docker 是現代軟體開發和部署不可或缺的工具。透過容器化技術,我們可以:
- 簡化應用程式的部署流程
- 確保開發與生產環境的一致性
- 提高資源利用效率
- 加速持續整合與持續部署 (CI/CD) 流程
掌握 Docker 的基本概念和操作指令後,您可以進一步學習 Docker Compose 進行多容器編排,以及 Kubernetes 進行容器叢集管理。