跳轉到

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

實戰:三分鐘除錯流程#

  1. docker ps -a——容器在跑嗎?狀態是什麼?
  2. docker logs --tail 100 <容器>——日誌裡有什麼錯誤?
  3. docker exec -it <容器> sh——進去看設定、看檔案、試指令

這三步能解決 80% 的容器問題。

本章小結#

  • docker logs -f <容器>:查看/追蹤背景容器的輸出,排障第一步
  • docker exec -it <容器> bash:進入執行中的容器,-i 和 -t 缺一不可
  • 精簡鏡像沒有 bash 就用 sh
  • exec 進入後 exit 只離開 shell,容器不受影響
  • 排障三部曲:ps -a → logs → exec

想一想#

  1. 容器一啟動就掛掉,你的除錯流程是什麼?
  2. docker exec -it 的 -i 和 -t 各負責什麼?只加 -i 會怎樣?
  3. 為什麼 exec 進入後 exit,容器不會停掉;但 docker run -it 進入後 exit,容器會停掉?(提示:主行程)