Docker 實作操作手冊
對象:已照《Docker 安裝教學手冊》裝好 Docker 的學員 涵蓋:Docker 基本操作 → Dockerfile 實作 → 真實專案 → Docker Compose(整合版 + 分開版)→ DockerHub → Portainer 所有指令都在 Docker 29.6.1 / Compose v5.2.0 / Ubuntu 22.04 實測通過 最後更新:2026-06-27
使用前提
# 確認 Docker 可用(不用 sudo)
docker --version # Docker version 29.x.x
docker compose version # Docker Compose version v2+(v5.2.0)
docker run hello-world # 看到 Hello from Docker!
如果 docker ps 要加 sudo 才能跑 → docker 群組還沒生效,照以下步驟處理:
# Step 1:把用戶加入 docker 群組
sudo usermod -aG docker $USER
# Step 2:關閉 WSL 讓群組生效(在 Windows PowerShell 執行,不是在 Ubuntu 裡)
1. 關閉所有 Ubuntu / WSL 視窗
2. 開啟 Windows PowerShell(開始選單搜尋 PowerShell)
3. 輸入:wsl --shutdown
4. 等 5 秒
5. 重新從開始選單打開 Ubuntu
# Step 3:驗證(重開 Ubuntu 後)
groups
# 列出的群組中應該包含 docker
docker ps
# 不用 sudo 能跑 = 成功
⚠️ 只在 Ubuntu 裡
exit再開是不夠的,一定要在 PowerShell 跑wsl --shutdown完全關閉 WSL 再重開。
📁 重要:所有實作都在 WSL 原生路徑(
~/)下做,不要在/mnt/c/(會慢 3-5 倍且檔案監聽失效)。
目錄
- 第五部分:hahow-crawler 前置
- 第六部分:hahow-crawler 分開版
- 第七部分:hahow-crawler 整合版 A
- 第八部分:hahow-crawler 整合版 B
- 第九部分:DockerHub 分享 image
- 第十部分:Portainer 圖形化管理
- 附錄:重 build 檢查 清理
第一部分:Docker 基本操作
先用官方 hello-world 熟悉 image / container 的關係。
Step 1:跑第一個 container
docker run hello-world
✅ 預期:
Hello from Docker!
This message shows that your installation appears to be working correctly.
這行指令背後做了 4 件事:
- 本機沒有
hello-worldimage → 自動從 DockerHub 下載 - 用這個 image 建立一個 container
- container 執行印出訊息
- 執行完畢,container 停止
Step 2:看 image 和 container
# 看本機所有 image
docker images
# 預期:看到 hello-world
# 看「正在執行」的 container
docker ps
# 預期:空的(hello-world 跑完就停了)
# 看「所有」container(含已停止)
docker ps -a
# 預期:看到 hello-world,STATUS 是 Exited
💡 重點觀念:
docker ps只顯示執行中的 → hello-world 看不到docker ps -a加-a(all)才看得到停止的
Step 3:管理 container 生命週期
# 跑一個會持續執行的 container(Ubuntu 互動 shell)
docker run -it ubuntu bash
# 進到 container 裡,提示符變成 root@xxxx:/#
# 試試:
ls /
cat /etc/os-release
exit # 離開,container 停止
# 看剛才的 container
docker ps -a
# 刪除停止的 container
docker rm <container_id 或 name>
# 刪除 image
docker rmi hello-world
Step 4:常用指令速查
docker run -d <image> # 背景執行(detached)
docker run -p 8080:80 <image> # port 映射(主機 8080 → 容器 80)
docker run --name myapp <image> # 命名 container
docker logs <id> # 看 container log
docker exec -it <id> bash # 進入正在跑的 container
docker stop <id> # 停止
docker start <id> # 重新啟動
docker rm <id> # 刪除 container
docker rmi <image> # 刪除 image
docker system prune # 清理未使用資源
第二部分:Dockerfile 實作 FastAPI
從零寫一個 Dockerfile,把一個 FastAPI 小程式打包成 image。
情境
你寫好一個 API,想讓別人「不用裝任何東西、一行指令就能跑」。
Step 1:建立專案資料夾
cd ~
mkdir fastapi-demo && cd fastapi-demo
Step 2:寫 main.py
cat > main.py << 'EOF'
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello Docker + FastAPI!"}
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id}
EOF
用 VS Code 的話直接新建
main.py貼上即可。
Step 3:寫 requirements.txt
cat > requirements.txt << 'EOF'
fastapi
uvicorn[standard]
EOF
Step 4:寫 Dockerfile
cat > Dockerfile << 'EOF'
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
EOF
逐行解讀:
| 指令 | 作用 |
|---|---|
FROM python:3.13-slim |
基底 image(精簡版 Python) |
WORKDIR /app |
設定容器內工作目錄 |
COPY requirements.txt . |
先複製依賴清單(為了快取) |
RUN pip install ... |
安裝套件 |
COPY . . |
複製程式碼進去 |
EXPOSE 8000 |
宣告容器用 8000 port |
CMD [...] |
容器啟動時執行的指令 |
💡 為什麼先 COPY requirements 再 COPY 程式碼?
Docker 有層快取。只要 requirements.txt 沒變,pip install 那層就不用重跑。只改程式碼的話 rebuild 會非常快。
Step 5:Build image
docker build -t fastapi-demo .
✅ 預期:最後看到
naming to docker.io/library/fastapi-demo:latest
可能是舊版,業師在確認
# 確認 image 建好
docker images | grep fastapi-demo
Step 6:Run container
docker run -d --name fastapi-demo -p 8000:8000 fastapi-demo
-d:背景執行--name:命名-p 8000:8000:主機 8000 → 容器 8000
✅ 驗證(實測通過):
curl http://localhost:8000/
# {"message":"Hello Docker + FastAPI!"}
curl http://localhost:8000/items/42
# {"item_id":42}
Step 7:看 Swagger UI
開瀏覽器 → http://localhost:8000/docs
✅ 會看到 FastAPI 自動產生的互動式 API 文件(HTTP 200)。
Step 8:停止與清理
docker stop fastapi-demo
docker rm fastapi-demo
第三部分:de-course 真實專案 Dockerfile
用課程的 de-course repo(ep03-04)打包真實的爬蟲專案。這個 Dockerfile 用 uv 管理環境。
Step 1:進入專案
cd ~/de-01-projects/de-course/ep03-04
ls
# 看到 Dockerfile、docker-compose.yml、crawlers/、pyproject.toml、uv.lock...
Step 2:看 Dockerfile
cat Dockerfile
FROM python:3.13-slim
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
# 安裝 uv
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh
WORKDIR /app
# 先複製依賴檔(快取)
COPY pyproject.toml uv.lock ./
RUN uv sync
# 複製程式碼
COPY crawlers/ ./crawlers/
COPY *.py ./
ENV TZ=Asia/Taipei
CMD ["/bin/bash"]
和 FastAPI 版的差異:
| fastapi-demo | de-course | |
|---|---|---|
| 套件管理 | pip + requirements.txt | uv + pyproject.toml/uv.lock |
| 基底 | python:3.13-slim | python:3.13-slim |
| 啟動 | 跑 uvicorn server | 開 bash(互動用) |
Step 3:Build
docker build -t test-app .
✅ 預期:image 約 438MB(實測),最後 naming to ... test-app:latest done
docker images | grep test-app
Step 4:Run + 進入容器
docker run -it test-app
# 進到容器的 bash,提示符變 root@xxxx:/app#
Step 5:在容器裡跑爬蟲
# (在容器內)
uv run python crawlers/ptt_crawler.py
# 會實際去爬 PTT,印出文章資料
✅ 看到爬蟲輸出 = 整個環境(Python + uv + 套件 + 程式碼)都被正確打包進 image 了。
Step 6:離開容器
exit
# 容器停止,但 image 還在
docker ps -a # 看到剛才的 test-app container(Exited)
第五部分:hahow-crawler 前置
hahow-crawler 是真實的資料工程專案,比 ep03-04 多了 worker(執行爬蟲)和 producer(發送任務)。有三種操作方式(分開版 / 整合版 A / 整合版 B),以下前置步驟三種都要先做。
專案架構
Producer 發任務 → RabbitMQ 排隊 → Worker 執行爬蟲 → MySQL 儲存
↑
Flower 監控
phpMyAdmin 管理 DB
Step 1:取得 hahow-crawler
cd ~
git clone https://github.com/lu791019/hahow-crawler-de-course-materials.git
cd hahow-crawler
ls
# Dockerfile docker-compose-broker.yml docker-compose-mysql.yml
# docker-compose-worker.yml docker-compose-producer.yml
# docker-compose.yml(整合版 A:DockerHub)
# docker-compose-local.yml(整合版 B:本地 build)
# data_ingestion/ ...
六個服務說明
| 服務 | Image | Port | 角色 |
|---|---|---|---|
| rabbitmq | rabbitmq:3.13-management-alpine | 5672 / 15672 | 訊息佇列(派工) |
| flower | mher/flower:latest | 5555 | Celery 任務監控 |
| mysql | mysql:8.0 | 3306 | 資料庫(存爬蟲結果) |
| phpmyadmin | phpmyadmin:latest | 8000 | 資料庫管理介面 |
| worker | enzochang/data_ingestion 或本地 build | — | 執行爬蟲(Celery Worker) |
| producer | 同 worker | — | 發送爬蟲任務(一次性) |
三種操作方式怎麼選
| 分開版(第六部分) | 整合版 A(第七部分) | 整合版 B(第八部分) | |
|---|---|---|---|
| compose file | 4 個 | docker-compose.yml |
docker-compose-local.yml |
| worker image | DockerHub | DockerHub | 本地 build |
| network | 手動建 my_network |
自動 | 自動 |
| 適合 | 教學逐步展示 | 學生快速用 | 老師 Mac / 備用 |
# 教學流程:先用 ep03-04 學基本 → 拆掉 → 再用 hahow-crawler
cd ~/de-01-projects/de-course/ep03-04
docker compose down -v # 先拆 ep03-04
cd ~/hahow-crawler
docker compose up -d # 再起 hahow-crawler
第六部分:hahow-crawler 分開版
前提:已完成第五部分的
git clone。
每個服務一個 compose file,一次加一個。適合教學逐步展示、除錯。
Step 1:建立共用 network(關鍵!)
分開版的服務分散在不同 compose file,要靠一個共用網路互通。所有 compose file 都設了 my_network: external: true,所以要先手動建:
cd ~/hahow-crawler
docker network create my_network
✅ 驗證:
docker network ls | grep my_network
⚠️ 不先建這個網路,
docker compose -f ... up會報network my_network declared as external, but could not be found。
Step 2:RabbitMQ + Flower(broker)
docker compose -f docker-compose-broker.yml up -d
✅ 驗證:
- RabbitMQ 管理:http://localhost:15672 (worker / worker)
- Flower 監控:http://localhost:5555
Step 3:MySQL + phpMyAdmin
docker compose -f docker-compose-mysql.yml up -d
✅ 驗證:
- phpMyAdmin:http://localhost:8000(root / 1234)
- 也可從另一容器測 MySQL 連線:
docker run --rm --network my_network mysql:8.0 \ mysqladmin ping -h mysql -uroot -p1234 # mysqld is alive
Step 4:Worker
docker compose -f docker-compose-worker.yml up -d
Worker 用的是 DockerHub 上預先 build 好的 image
enzochang/data_ingestion:latest,第一次會自動 pull。
✅ 看 log 確認 celery ready:
docker compose -f docker-compose-worker.yml logs -f
看到這行 = worker 正常:
celery@workerXXXX ready.
如果看到 Failed to spawn: 'celery' → 見附錄排錯表。
Step 5:發送任務 — Producer
docker compose -f docker-compose-producer.yml up
# producer 跑完就結束(送出爬蟲任務)
⚠️ 確認 worker 已經
ready才跑 producer,否則任務會堆在 queue 裡。
Step 6:驗證完整閉環
# 1. Flower 看 task 狀態
# http://localhost:5555 → Tasks → 應該看到 SUCCESS
# 2. Worker log 看有沒有存進 MySQL
docker compose -f docker-compose-worker.yml logs | grep -E "UPSERT|INSERT|succeeded"
# 3. MySQL 查資料
docker exec mysql mysql -uroot -p1234 -e "USE hahow; SHOW TABLES; SELECT COUNT(*) FROM hahow_course;"
Step 7:在 Flower 看任務執行
回到 http://localhost:5555 → Tasks 頁籤,看 Worker 接到任務並執行。
Step 8:停止所有服務
docker compose -f docker-compose-broker.yml -f docker-compose-mysql.yml \
-f docker-compose-worker.yml down
docker network rm my_network
第七部分:hahow-crawler 整合版 A
前提:已完成第五部分的
git clone。
worker/producer 用 DockerHub 上預先 build 好的 enzochang/data_ingestion:latest,不需要本地 build。
Step 1:啟動 infra + worker
cd ~/hahow-crawler
docker compose up -d rabbitmq flower mysql phpmyadmin worker
第一次會 pull 所有 image(約 2-3GB),需要時間。建議課前先
docker compose pull。 ⚠️ 不要docker compose up -d全起 — producer 會因為 rabbitmq 還沒 ready 而失敗。
Step 2:確認服務正常(等 20-30 秒)
docker compose ps -a
# rabbitmq/flower/mysql/phpmyadmin/worker 都是 Up
web 介面:
| 服務 | 網址 | 帳密 |
|---|---|---|
| RabbitMQ 管理 | http://localhost:15672 | worker / worker |
| Flower 監控 | http://localhost:5555 | (無) |
| phpMyAdmin | http://localhost:8000 | root / 1234 |
✅ 確認 worker ready:
docker compose logs worker | grep ready
# celery@workerXXXX ready.
Step 3:發送任務 — Producer
docker compose up producer
# 前景跑,看到 send task ... 然後 exit code 0 = 成功
Step 4:驗證完整閉環
# 1. Flower 看 task 狀態
# http://localhost:5555 → Tasks → 應該看到 SUCCESS
# 2. Worker log 看有沒有存進 MySQL
docker compose logs worker | grep -E "UPSERT|INSERT|succeeded"
# 3. MySQL 查資料
docker exec mysql mysql -uroot -p1234 -e "USE hahow; SHOW TABLES; SELECT COUNT(*) FROM hahow_course;"
Step 5:停止全部
docker compose down -v # 含刪 volume
第八部分:hahow-crawler 整合版 B
前提:已完成第五部分的
git clone。
worker/producer 從 Dockerfile 本地 build,不依賴 DockerHub image。適合:
- 老師 Apple Silicon Mac(DockerHub image 是 amd64-only)
- DockerHub image 版本不對或有問題時
- 想用最新 Dockerfile 的時候
Step 1:build + 啟動
cd ~/hahow-crawler
docker compose -f docker-compose-local.yml up -d --build rabbitmq flower mysql phpmyadmin worker
第一次 build 需要幾分鐘(下載 ubuntu base image + uv sync)。 要完全從零 build(不用快取):加
--no-cache
Step 2:確認服務正常(等 20-30 秒)
docker compose -f docker-compose-local.yml ps -a
# rabbitmq/flower/mysql/phpmyadmin/worker 都是 Up
web 介面:
| 服務 | 網址 | 帳密 |
|---|---|---|
| RabbitMQ 管理 | http://localhost:15672 | worker / worker |
| Flower 監控 | http://localhost:5555 | (無) |
| phpMyAdmin | http://localhost:8000 | root / 1234 |
✅ 確認 worker ready:
docker compose -f docker-compose-local.yml logs worker | grep ready
# celery@workerXXXX ready.
Step 3:發送任務 — Producer
docker compose -f docker-compose-local.yml up producer
# 前景跑,看到 send task ... 然後 exit code 0 = 成功
Step 4:驗證完整閉環
# 1. Flower 看 task 狀態
# http://localhost:5555 → Tasks → 應該看到 SUCCESS
# 2. Worker log 看有沒有存進 MySQL
docker compose -f docker-compose-local.yml logs worker | grep -E "UPSERT|INSERT|succeeded"
# 3. MySQL 查資料
docker exec mysql mysql -uroot -p1234 -e "USE hahow; SHOW TABLES; SELECT COUNT(*) FROM hahow_course;"
Step 5:停止全部
docker compose -f docker-compose-local.yml down -v
第九部分:DockerHub 分享 image
把你 build 好的 image push 上 DockerHub,別人 pull 就能用。
DockerHub = 「image 版的 GitHub」。GitHub 管程式碼,DockerHub 管 Docker image。
Step 1:註冊 + 登入
# 先到 https://hub.docker.com 註冊帳號(記住 username)
docker login
# 輸入 DockerHub 帳號密碼
✅ 預期:Login Succeeded
Step 2:給 image 加 tag
DockerHub 的 image 命名規則是 username/image:tag:
docker tag test-app <你的username>/test-app:latest
docker images | grep test-app # 確認多了一個 username/test-app
Step 3:Push 上 DockerHub
docker push <你的username>/test-app:latest
✅ 到 https://hub.docker.com → Repositories,看到 test-app。
Step 4:pull 下來測試(驗證 push 成功)
# 模擬另一台電腦:先刪本地 image
docker rmi <你的username>/test-app:latest
# 從 DockerHub 拉下來
docker pull <你的username>/test-app:latest
# 跑起來確認
docker run -it <你的username>/test-app:latest
✅ 能跑 = push 成功!別人只要 docker pull 就能用你的環境,不用自己 build。
第十部分:Portainer 圖形化管理
Docker 指令太多記不住?Portainer 是 Docker 的網頁圖形管理介面(取代 Docker Desktop 的 GUI)。
Step 1:安裝 Portainer(一行)
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
參數說明:
-p 9000:9000:網頁介面 port-v /var/run/docker.sock:讓 Portainer 能控制 Docker--restart=always:開機自動啟動
✅ 驗證(實測):
docker ps --filter name=portainer
# STATUS: Up
curl -o /dev/null -w "%{http_code}\n" http://localhost:9000
# 200
Step 2:設定 admin 密碼
開瀏覽器 → http://localhost:9000 → 第一次會要求設定管理員帳密(密碼至少 12 碼)。
Step 3:用 Portainer 看所有 container
- 選
local環境 - 左側選
Containers - 看到所有 container,可以直接點按鈕 start / stop / logs / console,不用打指令
Step 4:移除 Portainer(若不需要)
docker rm -f portainer
docker volume rm portainer_data
附錄:重 build 檢查 清理
重新 build image
# 一般重 build(用快取,改了 code 才重跑變動的層)
docker compose -f docker-compose-local.yml up -d --build
# 完全從零 build(不用任何快取,最乾淨最確實,但要 3-5 分鐘)
docker compose -f docker-compose-local.yml build --no-cache
docker compose -f docker-compose-local.yml up -d
# 或合一步
docker compose -f docker-compose-local.yml up -d --build --no-cache
💡 分兩步的好處:build 失敗不會試圖啟動壞掉的東西,先確認 build 成功再 up。
啟動後檢查(每次 up 完都該跑)
# 1. 服務狀態(全部應該 Up,producer 是 Exited(0))
docker compose ps -a
# 2. Web 介面(都應該 HTTP 200)
curl -o /dev/null -w "RabbitMQ: %{http_code}\n" http://localhost:15672
curl -o /dev/null -w "Flower: %{http_code}\n" http://localhost:5555
curl -o /dev/null -w "phpMyAdmin: %{http_code}\n" http://localhost:8000
# 3. Logs(看有沒有 error)
docker compose logs # 全部
docker compose logs worker # 單一服務
docker compose logs worker | grep ready # 找關鍵字
docker compose logs -f # 即時跟蹤(Ctrl+C 離開,不會停服務)
docker compose logs --tail 20 # 只看最後 20 行
# 4. MySQL 連線
docker exec mysql mysqladmin ping -uroot -p1234
# mysqld is alive = OK
# 5. MySQL 查資料(跑完 producer 後)
docker exec mysql mysql -uroot -p1234 -e "USE hahow; SHOW TABLES;"
docker exec mysql mysql -uroot -p1234 -e "SELECT COUNT(*) FROM hahow.hahow_course;"
# 6. 進入容器除錯(需要時才用)
docker exec -it crawler_hahow_worker bash
重啟服務
# 重啟單一服務
docker compose restart worker
# 重啟全部
docker compose restart
# 完全拆掉重來(刪 container + network,保留 image)
docker compose down
docker compose up -d
# 完全拆掉 + 刪 volume(資料庫資料也清掉)
docker compose down -v
docker compose up -d
清理
# 清理單一實作
docker compose down -v # 停 compose 服務 + 刪 volume
docker rm -f <container> # 刪 container
docker rmi <image> # 刪 image
# 全部清乾淨(謹慎)
docker ps -aq | xargs -r docker rm -f # 刪所有 container
docker system prune -a --volumes # 刪所有未使用 image/network/volume
常見實作排錯
| 問題 | 解法 |
|---|---|
docker compose up 報 DOCKER-FORWARD / No chain/target/match |
sudo service docker restart 後重試(見《Docker 安裝教學手冊》Q14.5) |
network my_network not found |
分開版要先 docker network create my_network |
port already in use |
docker ps 找佔用的 → docker stop,或改 compose 的 port |
| ep03-04 和 de-project 同時跑衝突 | container 名稱相同,先 docker compose down -v 一個再起另一個 |
| phpMyAdmin 一直 Restarting(Apple Silicon) | 改用 phpmyadmin:latest(多架構),hahow-crawler 已修好 |
worker Failed to spawn: 'celery' |
command 已改成 uv run python -m celery(hahow-crawler 已修好) |
producer ModuleNotFoundError: data_ingestion |
environment 要有 PYTHONPATH=/app(hahow-crawler 已加) |
producer Connection refused exit(1) |
RabbitMQ 還沒 ready,等 20-30 秒再跑 docker compose up producer |
worker 爬完但 MySQL Unknown database |
compose 的 MYSQL_DATABASE 要和程式碼一致(hahow-crawler 已改成 hahow) |
worker 連不到 MySQL 127.0.0.1 refused |
compose 的 worker environment 要有 MYSQL_HOST=mysql(hahow-crawler 已加) |
| worker image arm64 segfault(老師 Mac) | 用整合版 B(docker-compose-local.yml,本地 build) |
| build 很慢 | 第一次要下載基底 image,之後有快取會快 |
| 容器內檔案改了主機看不到 | 用 volume 掛載:-v $(pwd):/app |
Docker 指令速查表
基礎操作
# Image
docker build -t <name> . # Build image
docker images # 列出所有 image
docker rmi <name> # 刪除 image
docker pull <name> # 從 DockerHub 下載
docker push <name> # 推上 DockerHub
docker tag <src> <dst> # 給 image 加 tag
# Container 生命週期
docker run <image> # 跑 container
docker run -d <image> # 背景執行
docker run -it <image> bash # 互動模式
docker run -p 8080:80 <image> # port 映射
docker run --name myapp <image> # 命名
docker run --rm <image> # 跑完自動刪除
docker ps # 看正在跑的
docker ps -a # 看全部(含已停止)
docker stop <id> # 停止
docker start <id> # 重新啟動
docker rm <id> # 刪除
docker rm -f <id> # 強制刪除(含執行中)
# 查看與除錯
docker logs <id> # 看 log
docker logs -f <id> # 即時跟蹤 log
docker logs --tail 20 <id> # 最後 20 行
docker exec -it <id> bash # 進入正在跑的 container
docker inspect <id> # 看詳細資訊(JSON)
docker cp <id>:/path ./local # 從 container 複製檔案出來
# 清理
docker system prune # 清理未使用資源
docker system prune -a --volumes # 清理全部(含 image + volume)
docker image prune # 只清懸掛 image
Docker Compose 操作
# 啟動與停止
docker compose up -d # 背景啟動全部
docker compose up -d <service> # 只起特定服務
docker compose up <service> # 前景跑(看即時輸出)
docker compose down # 停止 + 移除 container/network
docker compose down -v # 同上 + 刪 volume(資料庫清空)
docker compose restart # 重啟全部
docker compose restart <service> # 重啟特定服務
# 狀態與 log
docker compose ps # 看服務狀態
docker compose ps -a # 含已停止
docker compose logs # 全部 log
docker compose logs <service> # 特定服務 log
docker compose logs -f # 即時跟蹤
docker compose logs --tail 20 # 最後 20 行
# Build
docker compose build # build 所有 build: . 的服務
docker compose build --no-cache # 不用快取從零 build
docker compose up -d --build # build + 啟動
docker compose up -d --build --no-cache # 從零 build + 啟動
# 指定 compose 檔案
docker compose -f docker-compose-local.yml up -d
docker compose -f docker-compose-broker.yml up -d
進階操作
# Network
docker network create <name> # 建立網路
docker network ls # 列出網路
docker network rm <name> # 刪除網路
docker network inspect <name> # 看網路詳細(哪些 container 連在上面)
# Volume
docker volume create <name> # 建立 volume
docker volume ls # 列出 volume
docker volume rm <name> # 刪除 volume
# 連線測試
docker exec mysql mysqladmin ping -uroot -p1234 # 測 MySQL 連線
docker exec mysql mysql -uroot -p1234 -e "SHOW DATABASES;" # 查 database
# Image 架構
docker inspect <image> --format "{{.Architecture}}" # 看 image 架構
docker manifest inspect <image> # 看多架構 manifest
# Compose scale(多 worker)
docker compose up -d --scale worker=3 # 開 3 個 worker
# Docker daemon(WSL)
sudo service docker start # 啟動(無 systemd)
sudo service docker restart # 重啟
sudo systemctl start docker # 啟動(有 systemd)
sudo systemctl restart docker # 重啟
sudo systemctl status docker # 看狀態

送件鴿飛出去了