網站首頁 編程語言 正文
調試大多數 Linux 程序通常涉及檢查日志文件,這可能是一個復雜的過程。但是,在 Docker 下的容器化環境中運行時,您需要使用更具體的工具來調試生產中的應用程序。
日志存儲在哪里?
簡單的答案是 Docker 將容器日志存儲在其主要存儲位置/var/lib/docker/. 每個容器都有一個特定于其 ID 的日志(完整 ID,而不是通常顯示的縮短的 ID),您可以像這樣訪問它:
/var/lib/docker/containers/ID/ID-json.log
這 就是它們的存儲位置,但由于它們采用 JSON 格式,因此不易讀取,并且必須使用完整的容器 ID 很煩人。Docker 提供了一個內置命令來查看它們:
docker logs -f e4bd48ef3103
在這里,該-f 標志將保持提示打開并“關注”文件中的任何新條目。您還可以使用–tail 該文件,或使用–timestamps 來顯示日志時間,或使用–until并 --since 根據時間進行過濾。
如果您使用 Docker Compose,則可以使用其中的 log 命令輕松查看所有日志:
docker-compose logs
但是,您會注意到的一件事是 STDOUT 和 STDERR,它們對很多事情都很有用,但只顯示 Docker 文件中“CMD”指定的入口點的控制臺輸出。許多應用程序都有自己的專用日志系統,這些系統通常會記錄到/var/log/nginx/access.log. 仍然可以通過 Docker 從主機端訪問這樣的日志。
從容器內的應用程序查看日志
根據容器的不同,這可能不是必需的。例如,默認的 NGINX 容器設置為將其 Docker 日志發送到 STDOUT 以簡化日志檢查。它使用/dev/stdout 指向日志文件的符號鏈接來執行此操作,您可以為容器設置類似的內容。
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
但是,如果您想查看容器內的特定文件,您可以這樣做。Docker 提供的exec -it 命令允許您在任何正在運行的 Docker 進程中運行任何命令。使用它,您可以在 Docker 容器內跟蹤日志文件:
docker exec -it e4bd48ef3103 tail -f log.txt
因為這允許您運行任何命令,所以您可以使用journalctl 或任何其他您想要的調試策略,只要您以docker exec -it. /bin/bash 如果你想跳進去四處逛逛,你甚至可以跑步。
一個更適合主機服務的永久性解決方案是使用 Docker 卷掛載。您可以將類似目錄綁定/var/log/nginx 到主機可見的卷。首先,創建一個新卷:
docker volume create nginx-logs
并使用以下命令運行容器–mount:
docker run -d \ --name devtest \ --mount source=nginx-logs,target=/var/log/nginx \ nginx:latest
如果您使用 Docker Compose,則該過程可以自動化:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
這樣,主機上的任何日志聚合服務都可以直接攝取日志文件。
查看 Docker 守護進程日志
如果您想查看服務器上整個 Docker 服務的特定日志,而不是任何特定的容器化應用程序,您需要查看journalctl 日志:
sudo journalctl -fu docker.service
這是它在大多數系統上的存儲位置,但在某些系統上的位置不同:
- 亞馬遜Linux: /var/log/docker
- CentOS/RHEL: /var/log/messages | grep docker
- 蘋果: ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Windows: AppData\Roaming\Docker\log\vm\dockerd.log?
原文鏈接:https://blog.csdn.net/wlcs_6305/article/details/122112322
相關推薦
- 2023-04-24 一文掌握python中的__init__的意思及使用場景分析_python
- 2024-07-18 Spring Security之認證信息的處理
- 2023-06-03 pip?install?python-Levenshtein失敗的解決_python
- 2022-04-28 C++中的友元函數與友元類詳情_C 語言
- 2022-09-19 C語言中switch語句基本用法實例_C 語言
- 2022-04-11 C#基于SerialPort類實現串口通訊詳解_C#教程
- 2022-12-07 C++?如何將Lambda轉換成函數指針_C 語言
- 2022-05-10 原生ajax 設置get請求參數和請求頭信息和發送 post請求
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支