2.2 進出容器與日誌查看#
為什麼要進入容器?#
容器是隔離的環境——裡面的檔案系統、行程、網路都與主機分開。當你需要除錯、檢查設定、手動操作時,就要「進入」容器內部的終端機。而當程式在背景執行(-d),它的輸出你看不見,就要靠日誌。
查看日誌:docker logs#
背景執行的容器,其標準輸出(stdout/stderr)由 Docker 收集,用 docker logs 查看:
# 查看目前為止的所有日誌
docker logs my-nginx
# 持續追蹤(-f = follow),像 tail -f 一樣,Ctrl+C 離開
docker logs -f my-nginx
# 只看最後 100 行
docker logs --tail 100 my-nginx
# 加時間戳
docker logs -t my-nginx
工程實務:
docker logs -f是排障的第一步。容器一啟動就掛掉(docker ps -a看到Exited (1)),先看日誌,錯誤訊息幾乎都會告訴你原因。
進入容器:docker exec -it#
docker exec -it my-nginx bash
這兩個選項缺一不可:
| 選項 | 意義 |
|---|---|
-i(interactive) | 保持標準輸入開啟,讓你能打字 |
-t(tty) | 配置一個終端機,有指令提示、方向鍵、Tab 補全 |
-u root | 以 root 身分進入(部分精簡鏡像預設使用者非 root) |
進入後你就在容器的檔案系統內,可以像操作一般 Linux 一樣操作:
root@abc123:/# ls # 看容器內的檔案
root@abc123:/# cat /etc/nginx/nginx.conf # 檢查設定
root@abc123:/# ps aux # 看容器內的行程
root@abc123:/# exit # 離開容器(容器繼續執行,不會停掉)
重要觀念:
exit只是離開你開的 shell,容器本身不受影響(它是exec進去的附加行程)。這與docker run -it ... bash再exit不同——後者 exit 會讓主行程結束、容器停止。
精簡鏡像沒有 bash 怎麼辦?#
為了輕量,很多鏡像(如 alpine、python:3.12-slim)沒有 bash,改用 sh:
docker exec -it my-container sh # sh 幾乎所有鏡像都有
排障利器:如果鏡像內連除錯工具都沒有,可以臨時啟動一個帶工具的容器共用目標容器的環境(進階用法,了解即可):
docker run --rm -it --pid container:my-nginx nginx sh
實戰:三分鐘除錯流程#
docker ps -a——容器在跑嗎?狀態是什麼?docker logs --tail 100 <容器>——日誌裡有什麼錯誤?docker exec -it <容器> sh——進去看設定、看檔案、試指令
這三步能解決 80% 的容器問題。
本章小結#
docker logs -f <容器>:查看/追蹤背景容器的輸出,排障第一步docker exec -it <容器> bash:進入執行中的容器,-i和-t缺一不可- 精簡鏡像沒有 bash 就用
sh exec進入後exit只離開 shell,容器不受影響- 排障三部曲:
ps -a→logs→exec
想一想#
- 容器一啟動就掛掉,你的除錯流程是什麼?
docker exec -it的-i和-t各負責什麼?只加-i會怎樣?- 為什麼
exec進入後 exit,容器不會停掉;但docker run -it進入後 exit,容器會停掉?(提示:主行程)