Логирование контейнеров: Управление логами Docker и Kubernetes
Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.
Содержание
Логирование контейнеров: Управление логами Docker и Kubernetes
Логирование в контейнерных средах отличается от традиционного серверного логирования. Поскольку контейнеры эфемерны, централизованный сбор логов за пределами контейнера критически важен. В этом руководстве рассматривается управление логами Docker и Kubernetes, решения для централизованного сбора логов и лучшие практики для production.
Основы логирования Docker
Команда docker logs
# Просмотр логов контейнера
docker logs CONTAINER_NAME
# Последние N строк
docker logs --tail 100 CONTAINER_NAME
# Потоковая передача логов в реальном времени
docker logs -f CONTAINER_NAME
# С временными метками
docker logs -t CONTAINER_NAME
# С определённого времени
docker logs --since 1h CONTAINER_NAME # Последний 1 час
# Определённый временной диапазон
docker logs --since 2h --until 1h CONTAINER_NAME
Драйверы логов Docker
# Проверить текущий драйвер логов
docker info | grep 'Logging Driver'
Конфигурация драйвера логов
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
# Перезапустить Docker daemon
systemctl restart docker
Драйвер логов при запуске контейнера
# json-file с ротацией логов
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
# Перенаправить в syslog
docker run -d \
--name myapp \
--log-driver syslog \
--log-opt syslog-address=udp://localhost:514 \
myapp:latest
Конфигурация логов с Docker Compose
version: '3.8'
services:
app:
image: myapp:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "5"
compress: "true"
nginx:
image: nginx:latest
logging:
driver: json-file
options:
max-size: "5m"
max-file: "3"
Логи подов Kubernetes
# Просмотр логов пода
kubectl logs POD_NAME
# Конкретный контейнер (мульти-контейнерный под)
kubectl logs POD_NAME -c CONTAINER_NAME
# Потоковая передача логов
kubectl logs -f POD_NAME
# Последние N строк
kubectl logs --tail=100 POD_NAME
# С определённого времени
kubectl logs --since=1h POD_NAME
# Логи предыдущего контейнера (после сбоя)
kubectl logs --previous POD_NAME
# Логи всех подов в deployment
kubectl logs -l app=myapp --all-containers
Централизованный сбор логов: Loki + Grafana
# loki-stack.yml
version: '3.8'
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
volumes:
- loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=StrongPass123!
volumes:
- grafana-data:/var/lib/grafana
volumes:
loki-data:
grafana-data:
Ротация логов и управление диском
# Проверить размеры файлов логов Docker
du -sh /var/lib/docker/containers/*/*-json.log
# Очистить лог конкретного контейнера
truncate -s 0 $(docker inspect --format='{{.LogPath}}' CONTAINER_NAME)
# Автоматическая ротация с logrotate
cat > /etc/logrotate.d/docker-containers << 'EOF'
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=10M
missingok
delaycompress
copytruncate
}
EOF
Структурированное логирование (JSON)
// Node.js — JSON-логирование с Winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.Console()
]
});
logger.info('Вход пользователя', {
userId: 123,
action: 'login',
ip: '192.168.1.1'
});
logger.error('Ошибка базы данных', {
error: err.message,
query: 'SELECT * FROM users'
});
Заключение
Эффективное логирование контейнеров необходимо для устранения неполадок и мониторинга состояния системы в production-окружениях. Предотвращайте переполнение диска с ротацией логов Docker, настраивайте централизованный сбор логов с Loki или ELK Stack и упрощайте анализ логов со структурированными JSON-логами. С этими конфигурациями на серверах REXE вы можете управлять контейнерной инфраструктурой с полной видимостью.
Связанные статьи
Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Управление Docker Volume и сетями: Постоянное хранилище и сетевая конфигурация
Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.
Безопасность Docker: Усиление защиты контейнерной среды
Лучшие практики безопасности Docker: пользователь без root, файловая система только для чтения, профили seccomp, сканирование образов, безопасность Docker socket, сетевая изоляция и управление секретами.