AI & Data Dreamers練功房
寶箱片場規則
前傳・開工前環境安裝

Docker 實作操作手冊

← 回資料館・在 GitHub 看原始檔(de-course)・裝到一半卡住?左下角送件鴿或 Discord #觀眾服務台 喊一聲

對象:已照《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 倍且檔案監聽失效)。


目錄


第一部分: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 件事:

  1. 本機沒有 hello-world image → 自動從 DockerHub 下載
  2. 用這個 image 建立一個 container
  3. container 執行印出訊息
  4. 執行完畢,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

✅ 驗證:

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

  1. 選 local 環境
  2. 左側選 Containers
  3. 看到所有 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                             # 看狀態