附錄五:如何除錯 Docker

開啟 Debug 模式

在 dockerd 設定檔案 daemon.json (預設位於 /etc/docker/) 中新增

{
  "debug": true
}

重啟守護程序。

$ sudo kill -SIGHUP $(pidof dockerd)

此時 dockerd 會在日誌中輸出更多訊息供分析。

檢查核心日誌

$ sudo dmesg |grep dockerd
$ sudo dmesg |grep runc

Docker 不回應時處理

可以殺死 dockerd 程序檢視其堆疊呼叫情況。

$ sudo kill -SIGUSR1 $(pidof dockerd)

重置 Docker 本地資料

注意,本操作會移除所有的 Docker 本地資料,包括映象和容器等。

更安全的替代方式是優先使用以下指令進行清理:

$ docker system prune

如果你只是想 『恢復出廠設定』,在 Docker Desktop 裡也提供了相應入口。

只有在確認要丟棄本機全部映象、容器、卷和建立快取,並且已經停止 Docker 服務、完成備份或匯出後,才考慮刪除 Docker 資料目錄:

$ sudo systemctl stop docker containerd
$ sudo cp -a /var/lib/docker /var/lib/docker.backup
$ sudo rm -rf /var/lib/docker
$ sudo systemctl start docker

常見故障排查

容器啟動失敗

如果容器啟動後立即退出,可以使用 docker logs 檢視原因。

  • Exit Code 1:應用程式錯誤。通常是設定錯誤或依賴缺失。
  • Exit Code 137:OOM (Out Of Memory)。容器記憶體不足被核心殺掉。
    • 檢查宿主機記憶體。
    • 調整容器記憶體限制 (--memory)。
  • Exit Code 127:指令未找到。可能是 ENTRYPOINTCMD 指定的指令不存在。

網路連線問題

容器內部無法聯網
  1. 檢查 Docker DNS 設定 (/etc/docker/daemon.json)。
  2. 檢查宿主機防火牆 (iptables/firewalld) 是否攔截了轉發。
  3. 容器內測試:ping 8.8.8.8 (測試連通性),nslookup google.com (測試 DNS)。
連接埠對映不通
  1. 檢查容器連接埠是否正確監聽:netstat -tunlp (宿主機) 或 docker exec <container> netstat -tunlp
  2. 確認應用監聽地址是 0.0.0.0 而不是 127.0.0.1
    • 如果應用監聽在 127.0.0.1,只有容器內部能訪問,對映到宿主機外部也無法被外部請求訪問。

映象拉取失敗

  • connection refused:檢查網路或代理設定。
  • image not found:檢查映象名稱和 Tag 拼寫。
  • EOF / timeout:網路不穩定,嘗試設定映象加速器。
第 193 页,共 196 页
使用 mdPress 构建