我的服務還好嗎?監控容器的小撇步
上一篇教各位如何部署了自己的專案,身為前端工程師,平時網頁使用沒問題自然不會特別去監控容器狀態。
不過一旦網頁出現問題,進入探索問題根源的過程,你有可能會需要以下指令...
docker ps -a
-a
: 預設情況下,docker ps
只會顯示正在運行中的容器,-a
等同於--all
。--format table
: 此行是預設不需要特別加,但在某些特殊情況下,你也可以變更為--format json
。
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
dcecfc18ffbb | my-project | "/docker-entrypoint..." | 3 minutes ago | Up 3 minutes | 0.0.0.0:10000->80/tcp,... | my-project-1 |
除了使用 docker compose up --build -d
重 build 以外,也可以簡單透過:
docker stop my-project-1
docker start my-project-1
來暫停或重啟 container,觀察你的服務行為。
docker exec -it [container-name] bash
-i
(interactive): 保持標準輸入 (STDIN) 開啟,讓你跟容器互動。-t
(tty): 分配一個 terminal 給該容器。
有時候你會想進 container 看看 nginx 或其他設定檔是否正確,這時候就可以使用這個指令。
要離開容器輸入 exit
即可。
docker logs -f [container-name]
-f
: 即時監控。
這個指令可以查看該 container 的 log,如果有在 container 當中使用 nginx,nginx 預設會將 access_log 的內容導出。
主要用來確認 request 是否有正確導入、來源 IP、裝置為何等。
當然,如果你的 container 一直啟動不了,也可以藉由 log 來查看錯誤訊息。
如果嫌 log 太多,可以只印出倒數 50 行,並用時間排序:
docker logs --tail 50 --follow --timestamps [container-name]
不過如果你有用反向代理,nginx 如何導流的 log 預設是不會顯示在這裡的,需要額外編輯 access_log 的格式。
例如下面這樣:
# nginx.conf
log_format proxy_log '[$time_local] $remote_addr - $remote_user "$host$request_uri" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
' Proxy: "$proxy_host" "$upstream_addr" ';
access_log /var/log/nginx/access.log proxy_log;
server {...}
透過重新定義 log_format
就可以輸出任意格式的 log,nginx 代理的結果可以參照 $upstream_addr
這個變數來查看最終這個 request 被導向了哪裡。
最後記得將你自訂的格式名稱 proxy_log
加在 access_log
後面。
結語
上面這些看似簡單的指令其實都是增加偵錯效率的好武器,比方說遇到網頁 502 開不起來,或是 API 404 等問題我都會優先使用上面的指令進行初步排查,定位癥結點。
像是最後一個更改 log 格式的方法,就是因為我曾 call API 404 卡了老半天,查後端的 LOG 也沒有任何訊息,最後才透過這種方式定位到 nginx reverse proxy 的錯誤。預防勝於治療,如果一開始就設定好的話,也許當初就不會耗費這麼多時間了。