9.1 調試工具和指令
Docker Compose 讓多容器應用程式的開發和部署變得超簡單,但就像其他技術一樣,有時難免會出問題,這時就需要調試來解決問題。在這一講中,我們會來看看在 Docker Compose 中找 Bug 和調試應用程式的基本方法和工具。
常見問題及解決方法:
- 啟動容器時遇到的問題:
- 檢查容器的 logs。
- 檢查容器的狀態。
- 檢查設定檔。
- 網路問題:
- 檢查網路連線。
- 使用容器內的網路工具。
- Volume 的問題:
- 檢查 volume 的掛載。
- 檢查對 volume 的訪問權限。
調試的工具和指令:
1. 查看容器 logs
容器 logs 是出問題時首選的查看地方。指令 docker compose logs
可以查閱所有在 compose.yaml
中定義的服務的 logs。
docker compose logs
可以指定某個具體的服務,來查看它的 logs:
docker compose logs <service_name>
2. 檢查容器狀態
指令 docker compose ps
會顯示由 Docker Compose 管理的所有容器的狀態資訊。
docker compose ps
這個指令的輸出會顯示容器的狀態、埠和識別碼。
3. 重啟容器
如果容器運行異常,可以試著重啟它:
docker compose restart <service_name>
4. 連接正在運行的容器
若想更深入地研究問題,可以使用指令 docker compose exec
連接到正在運行的容器中。
docker compose exec <service_name> /bin/bash
這個指令 會打開容器內的終端機,以便執行診斷指令。
5. 使用網路工具
在容器內檢查網路連線可以幫助診斷網路問題。你可以使用工具,比如 ping, curl, netcat 等等。
docker compose exec <service_name> ping <hostname>
docker compose exec <service_name> curl http://<hostname>
docker compose exec <service_name> netcat -z -v <hostname> <port>
9.2 進階方法
進階的錯誤排查方法
1. 檢查 Docker Compose 檔案
compose.yaml
檔案中的錯誤可能導致容器運行不正常。使用以下指令檢查檔案語法:
docker compose config
此指令會檢查檔案是否有錯,並輸出最終配置。
2. 使用 Healthcheck
你可以在 compose.yaml
裡定義服務的 healthcheck,讓 Docker 自動檢查容器狀態。
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
interval: 30s
timeout: 10s
retries: 3
3. 檢查卷掛載
卷的問題可能因掛載不正確或存取權限不足而產生。確保卷正確掛載且容器有訪問權限。
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
3.1 檢查卷的可用性
為了檢查卷是否可供容器使用,可以啟動容器並執行檢查卷的指令(例如列出卷中的檔案)。假設卷掛載在容器中的路徑是 /mnt/volume:
docker run --rm -v my_volume:/mnt/volume alpine ls /mnt/volume
如果卷可用,指令 ls
會列出卷中的檔案和目錄。如果卷不可用或為空,則會顯示相應的訊息。
3.2 檢查卷中的可用空間
若要檢查容器內卷的可用空間,可以使用指令 df
:
docker run --rm -v my_volume:/mnt/volume alpine df -h /mnt/volume
此指令顯示掛載卷所在的檔案系統的可用空間。選項 -h
會以易讀格式(例如 MB, GB 等)顯示資訊。
4. 使用 IDE
使用具有 debug 功能和日誌記錄的 IDE 可以簡化除錯過程。你可以為開發和生產建立單獨的配置檔案,使用參數 --file
:
docker compose --file docker-compose.dev.yml up
重要!
這裡有一個非常有用的教學,介紹如何通過 IntelliJ IDEA 設置在 Docker 中運行的應用的遠端除錯: 設置遠端除錯 .
5. 檢查環境變數
錯誤或缺失的環境變數可能導致問題。確保所有必要的變數已在 .env
檔案中或直接在 compose.yaml
中設置。
version: '3.8'
services:
app:
image: myapp:latest
environment:
- APP_ENV=development
- DEBUG=true
9.3 用於調試的指令範例
用於調試的指令範例
範例 1:檢查並修復與資料庫的連接問題
查看服務 web
的日誌:
docker compose logs web
檢查 web
和 db
之間的網絡連接:
docker compose exec web ping db
docker compose exec web curl http://db:5432
連接到容器 web
進行診斷:
docker compose exec web /bin/bash
範例 2:檢查與卷相關的問題
檢查卷的掛載:
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
連接到容器 db
並檢查數據:
docker compose exec db /bin/bash
ls -l /var/lib/postgresql/data
GO TO FULL VERSION