Перейти к основному содержимому
Вернуться в категорию

Логирование контейнеров: Управление логами Docker и Kubernetes

Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.

Время чтения: 15 dk Контейнеры и оркестрация
dockerkubernetesлогированиелогlokielkfluentdмониторинг

Содержание

Логирование контейнеров: Управление логами Docker и Kubernetes

Логирование в контейнерных средах отличается от традиционного серверного логирования. Поскольку контейнеры эфемерны, централизованный сбор логов за пределами контейнера критически важен. В этом руководстве рассматривается управление логами Docker и Kubernetes, решения для централизованного сбора логов и лучшие практики для production.

Основы логирования Docker

Команда docker logs

hljs bash
# Просмотр логов контейнера
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

hljs bash
# Проверить текущий драйвер логов
docker info | grep 'Logging Driver'

Конфигурация драйвера логов

hljs json
// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "compress": "true"
  }
}
hljs bash
# Перезапустить Docker daemon
systemctl restart docker

Драйвер логов при запуске контейнера

hljs bash
# 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

hljs yaml
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

hljs bash
# Просмотр логов пода
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

hljs yaml
# 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:

Ротация логов и управление диском

hljs bash
# Проверить размеры файлов логов 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)

hljs javascript
// 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 вы можете управлять контейнерной инфраструктурой с полной видимостью.