Nơi lưu trữ và quản lý Docker Logs hiệu quả
Docker logs rất quan trọng để chẩn đoán và giải quyết các vấn đề có thể xảy ra trong ứng dụng và môi trường container của bạn. Hiểu rõ nơi lưu trữ các logs này và cách truy cập chúng có thể giúp bạn nhanh chóng xác định nguyên nhân gốc rễ của lỗi, theo dõi xu hướng hiệu suất và đảm bảo tính ổn định tổng thể của môi trường Docker.
Giới thiệu về Docker Logs
Docker logs là những thông tin được tạo ra bởi các container Docker và daemon Docker. Những logs này rất cần thiết để theo dõi, gỡ lỗi và hiểu hành vi của từng container và hệ thống Docker.
Các loại Docker Logs
Docker tạo ra hai loại logs khác nhau, bao gồm:
- Container Logs: Các logs này ghi lại luồng đầu ra chuẩn (stdout) và lỗi chuẩn (stderr) được tạo ra bởi các ứng dụng chạy bên trong một container Docker. Chúng cung cấp cái nhìn quý giá về hành vi của ứng dụng, bao gồm thông điệp, lỗi, cảnh báo và thông tin gỡ lỗi.
- Daemon Logs: Các logs này ghi lại các sự kiện và thông điệp được tạo ra bởi chính daemon Docker, điều khiển và quản lý các container Docker. Logs daemon có thể giúp chẩn đoán các vấn đề liên quan đến chức năng cốt lõi của Docker, mức sử dụng tài nguyên và tương tác với hệ thống máy chủ.
Docker Logs được lưu trữ ở đâu?
Nhìn chung, Docker logs được lưu trữ trong thư mục sau:
/var/lib/docker/
Bên trong thư mục này, vị trí chính xác của logs có thể khác nhau tùy thuộc vào loại logs và driver ghi log của Docker đang được sử dụng. Vì Docker tạo ra hai loại logs, vị trí chính xác cho mỗi loại log sẽ khác nhau:
Nơi lưu trữ Docker Container Logs
Vị trí lưu trữ logs của container Docker phụ thuộc vào hệ điều hành máy chủ.
Trên hệ thống Linux
Logs của container Docker được lưu trữ trong các thư mục con dưới /var/lib/docker/containers/ trên các máy chủ Linux.
Mỗi thư mục của container được đặt tên theo định danh duy nhất của nó (<container_id>) và chúng đều có file log riêng; tên file là {container_id}.log. Docker, theo mặc định, sử dụng driver ghi log JSON File để lưu trữ logs của container, vì vậy mỗi file log đều ở định dạng log JSON.
Mỗi container có một log riêng biệt cho ID của nó (ID đầy đủ, không phải ID rút gọn thường được hiển thị), và bạn có thể truy cập nó như sau:
Để truy cập logs của một container, bạn sẽ cần ID đầy đủ của container đó, không phải ID rút gọn thường được hiển thị khi bạn chạy docker ps. Logs được lưu trữ theo định dạng sau:
/var/lib/docker/containers/ID/ID-json.log
Để lấy ID đầy đủ của tất cả các container đang chạy, chạy:
docker ps -q --no-trunc
Để lấy ID của một container cụ thể:
docker inspect --format '{{.Id}}' <tên-container>
Khi bạn có ID của container, bạn có thể lấy logs từ thư mục này bằng lệnh:
sudo cat /var/lib/docker/containers/<container-ID>/<container-ID>-json.log
Ví dụ:
sudo cat /var/lib/docker/containers/f1d1369976e6407f6ea1735173fc5044499c22f505145f0ccc46aa8080884d1a/f1d1369976e6407f6ea1735173fc5044499c22f505145f0ccc46aa8080884d1a-json.log
Đầu ra sẽ trông giống như sau:
{"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2024-06-30T14:57:36.300165665Z"}
...
Trên hệ thống Mac
Cài đặt Docker Engine trực tiếp không được hỗ trợ trên macOS. Tuy nhiên, bạn có thể sử dụng Docker trên macOS thông qua Docker Desktop. Để truy cập logs của từng container Docker trên Docker Desktop, từ giao diện Docker Desktop, chọn container mong muốn và nhấp vào phần Logs.
Trên hệ thống Windows
Docker Engine hiện không được hỗ trợ một cách bản địa trên Windows. Tuy nhiên, bạn có thể sử dụng Docker trên Windows thông qua Docker Desktop. Tùy thuộc vào cấu hình của bạn, Docker Desktop sử dụng hoặc Windows Subsystem for Linux (WSL 2) hoặc Hyper-V để thiết lập một VM nhẹ chạy kernel Linux.
Logs của container Docker được lưu trữ trong hệ thống file của VM này và có thể được truy cập thông qua WSL 2 hoặc giao diện Docker Desktop.
Logs của container Docker trong VM thường được lưu tại:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\containers\
Logs của từng container cụ thể có thể được truy cập tại:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\containers\[containerID]\[containerID]-json.logs
Lưu ý: Đường dẫn log có thể khác nhau tùy thuộc vào phiên bản Docker của bạn. Hãy chắc chắn kiểm tra phiên bản Docker của bạn khi truy cập logs của container.
Nơi lưu trữ Docker Daemon Logs
Vị trí lưu trữ logs của daemon Docker cũng phụ thuộc vào hệ điều hành máy chủ.
Trên hệ thống Linux
Trên các phiên bản Docker cũ hơn và máy chủ Linux, logs của daemon Docker được lưu tại các thư mục /var/log/syslog hoặc /var/log/messages. Đối với các bản phân phối Linux hiện đại và các phiên bản Docker gần đây, logs của Docker được lưu trữ trong các file journal dưới /var/log/journal. Điều này là do, trên hầu hết các bản phân phối Linux hiện đại sử dụng systemd, Docker sử dụng các thiết lập ghi log mặc định, thường ghi vào journal hệ thống được quản lý bởi systemd (tức là journald).
Để xác định vị trí mà logs Docker được lưu trữ trên hệ thống Linux của bạn, bạn cần kiểm tra file dịch vụ Docker. File dịch vụ Docker chứa các thông tin cấu hình về cách mà daemon Docker được khởi động và quản lý. Trên các hệ thống sử dụng systemd, file này thường nằm tại /lib/systemd/system/docker.service.
Để xem nội dung file dịch vụ Docker:
cat /lib/systemd/system/docker.service
Tìm dòng ExecStart để xem cách mà daemon Docker đang được khởi động.
Từ ảnh chụp màn hình trên, dòng ExecStart trong file đơn vị dịch vụ Docker, cụ thể là /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock, cho thấy rằng Docker được thiết lập để sử dụng kích hoạt socket với systemd. Trong cấu hình này, daemon Docker giao tiếp với systemd thông qua file descriptor được truyền (fd://), và systemd xử lý việc kích hoạt và theo dõi dịch vụ Docker.
Do đó, các logs được tạo ra bởi daemon Docker sẽ được gửi đến journald của systemd. Các file journal thường là nhị phân và không được thiết kế để đọc trực tiếp bởi con người. Để xem hiệu quả logs của daemon Docker được ghi lại bởi journald, sử dụng lệnh:
journalctl -xu docker.service
journalctl là một tiện ích dòng lệnh để truy vấn và hiển thị các bản ghi log từ journal systemd. Journal là một log có cấu trúc lưu trữ thông tin về các sự kiện hệ thống, khởi động/dừng dịch vụ và lỗi.
Dòng lệnh trên sẽ hiển thị và lọc các logs của journal systemd cho các thông điệp liên quan đến dịch vụ Docker, bao gồm cả lỗi.
Trên hệ thống Mac
Trên macOS, Docker Engine không được hỗ trợ trực tiếp. Tuy nhiên, bạn có thể sử dụng Docker Engine trên macOS thông qua Docker Desktop.
Logs của daemon Docker, được gán nhãn là dockerd trên macOS, được lưu tại:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
File log này ghi lại các sự kiện và thông điệp liên quan đến daemon Docker (dockerd) chạy bên trong VM Docker được quản lý bởi Docker Desktop. Nó bao gồm thông tin về các hoạt động của engine Docker, chẳng hạn như các sự kiện vòng đời container (như tạo, khởi động, dừng, xóa), cấu hình mạng, quản lý lưu trữ và các hoạt động chung của daemon Docker.
Đối với logs cụ thể của runtime containerd, chịu trách nhiệm quản lý các hoạt động vòng đời container và môi trường thực thi của chúng, chúng được lưu tại:
~/Library/Containers/com.docker.docker/Data/log/vm/containerd.log
Trên hệ thống Windows
Logs daemon (dockerd) được lưu trữ trong hệ thống file của VM WSL2 mà Docker Desktop sử dụng:
%LOCALAPPDATA%\Docker\log\vm\dockerd.log
Nếu bạn quan tâm đến runtime container, logs containerd cũng được lưu trong hệ thống file của VM WSL2 tại:
%LOCALAPPDATA%\Docker\log\vm\containerd.log
Cách xóa file log Docker
Các file log Docker có thể được xóa dựa trên cách mà Docker được cài đặt. Để xóa file log Docker trên hệ thống Linux, trước tiên dừng Docker:
sudo systemctl stop docker
Đi đến thư mục nơi file log Docker được lưu và sử dụng journalctl để xóa các logs liên quan đến dịch vụ Docker:
sudo journalctl --vacuum-time=1s --unit=docker.service
Lệnh này sẽ xóa bất kỳ logs hệ thống journal nào liên quan đến dịch vụ Docker đã cũ hơn một giây. Điều này đảm bảo rằng chỉ các logs từ dịch vụ Docker bị xóa, để lại các logs hệ thống khác không bị ảnh hưởng.
Lưu ý: Docker liên tục tạo ra các logs mới khi các container được khởi động, dừng hoặc tương tác. Việc xóa logs bằng journalctl chỉ loại bỏ các logs đã được lưu trữ, không phải các logs đang hoạt động hiện tại trong bộ nhớ. Khi các logs đã được xóa, khởi động lại dịch vụ Docker để tiếp tục hoạt động bình thường:
sudo systemctl start docker
Giám sát và phân tích logs Docker với SigNoz
Việc giám sát và phân tích logs Docker trực tiếp trong terminal không hiệu quả và không thể mở rộng, đặc biệt khi ứng dụng của bạn phát triển về độ phức tạp và khối lượng logs tăng lên. Để quản lý và phân tích logs nâng cao, tốt nhất là chuyển tiếp logs đến một công cụ quản lý logs như SigNoz.
SigNoz là một nền tảng quan sát mã nguồn mở cung cấp khả năng quản lý logs toàn diện.
SigNoz sử dụng một cơ sở dữ liệu cột, ClickHouse, để lưu trữ logs. Cơ sở dữ liệu này rất hiệu quả trong việc tiếp nhận và lưu trữ dữ liệu log và làm cho nó có sẵn để phân tích. Nó cũng sử dụng OpenTelemetry để trang bị cho các ứng dụng. OpenTelemetry, được hỗ trợ bởi CNCF, đang nhanh chóng trở thành tiêu chuẩn thế giới để trang bị cho các ứng dụng cloud-native.
Tab logs trong SigNoz có các tính năng nâng cao như trình tạo truy vấn logs, tìm kiếm qua nhiều trường, chế độ xem bảng có cấu trúc, chế độ xem JSON, v.v.
Bạn cũng có thể xem logs theo thời gian thực với tính năng live tail logging.
Với Trình tạo Truy vấn Logs nâng cao, bạn có thể nhanh chóng lọc logs bằng cách kết hợp và kết nối các trường.
Bạn có thể truy cập tài liệu để biết các bước giám sát và phân tích logs của container Docker trong SigNoz.
Bắt đầu với SigNoz
Bạn có thể chọn giữa nhiều tùy chọn triển khai trong SigNoz. Cách dễ nhất để bắt đầu với SigNoz là SigNoz cloud. Chúng tôi cung cấp tài khoản dùng thử miễn phí 30 ngày với quyền truy cập vào tất cả các tính năng.
Những người có mối quan tâm về quyền riêng tư dữ liệu và không thể gửi dữ liệu ra ngoài cơ sở hạ tầng của họ có thể đăng ký cho tùy chọn tự lưu trữ doanh nghiệp hoặc BYOC.
Những ai có chuyên môn để quản lý SigNoz hoặc chỉ muốn bắt đầu với tùy chọn tự lưu trữ miễn phí có thể sử dụng phiên bản cộng đồng của chúng tôi.
Kết luận
Hiểu nơi lưu trữ Docker logs và cách truy cập chúng là rất hữu ích cho việc khắc phục sự cố và giám sát các ứng dụng container của bạn.
Những điểm chính:
- Docker logs cung cấp cái nhìn sâu sắc về sức khỏe, hiệu suất và các vấn đề của cả container Docker (logs ứng dụng) và hệ thống Docker (logs daemon).
- Vị trí lưu trữ logs Docker thay đổi tùy thuộc vào cấu hình hệ thống máy chủ.
- Để truy cập logs Docker, bạn có thể sử dụng lệnh
docker logstrong terminal để lấy logs trực tiếp. - Để phân tích logs nâng cao, hãy sử dụng các công cụ quản lý logs như SigNoz.
- Để phân tích và khắc phục sự cố hiệu quả, hãy xem xét sử dụng một công cụ quản lý logs như SigNoz cung cấp các tính năng nâng cao để tìm kiếm, lọc và hình dung logs của bạn.
Câu hỏi thường gặp (FAQs)
Docker logs ở đâu?
- Docker logs thường được tìm thấy ở
/var/lib/docker/containerstrên Linux vàC:\ProgramData\docker\containerstrên Windows.
Container lưu logs ở đâu?
- Containers không lưu logs một cách vĩnh viễn; chúng xuất ra stdout và stderr, được quản lý bởi daemon Docker.
Logs cũ của Docker ở đâu?
- Các logs cũ có thể được xoay vòng hoặc xóa tùy thuộc vào cấu hình driver ghi log.
Làm thế nào để kiểm tra logs Docker trực tiếp?
- Sử dụng
docker logs -f <tên-container>hoặcdocker logs -f <container-id>.
Docker login được lưu ở đâu?
- Thông tin xác thực đăng nhập Docker được lưu trong file
~/.docker/config.jsontrên Linux và%USERPROFILE%\.docker\config.jsontrên Windows.
Làm thế nào để kiểm tra logs docker-compose?
- Sử dụng
docker-compose logsđể kiểm tra logs của tất cả các dịch vụ được định nghĩa trongdocker-compose.yml.
Container Docker được lưu ở đâu?
- Containers không "được lưu" dưới dạng file đơn lẻ; dữ liệu của chúng tồn tại trong các lớp bên trong image Docker và môi trường runtime.
Logs trong lưu trữ là gì?
- Logs trong lưu trữ đề cập đến các file log được tạo ra bởi các container Docker được lưu trữ cục bộ trên hệ thống file của máy chủ.
Làm thế nào để giảm logs Docker?
- Để giảm logs Docker, cấu hình xoay vòng logs trong cài đặt Docker hoặc với các driver ghi log như
json-filesử dụng tùy chọnmax-sizevàmax-file.
Logs Docker có bền vững không?
- Docker logs là bền vững miễn là các container tạo ra chúng vẫn tồn tại. Chúng được lưu trữ trên hệ thống file của máy chủ cho đến khi bị xóa hoặc quản lý bởi xoay vòng logs.
Làm thế nào để liệt kê tất cả các container Docker?
- Sử dụng
docker ps -a.
Lệnh cho tail logs Docker là gì?
- Sử dụng
docker logs --tail <số_dòng> <container_id>để lấy tail số dòng được chỉ định từ logs của một container.
Làm thế nào để kiểm tra trạng thái đang chạy của Docker?
- Kiểm tra trạng thái đang chạy của Docker với
systemctl status dockertrên Linux hoặcGet-Service dockertrên Windows PowerShell.
Docker images được lưu ở đâu?
- Docker images được lưu trên
/var/lib/docker/trên Linux vàC:\ProgramData\docker\trên Windows theo mặc định.