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

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

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

Время чтения: 15 dk Контейнеры и оркестрация
dockerkubernetesлогированиелогlokielkfluentdмониторинг
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление

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

Часто задаваемые вопросы

Где хранятся логи Docker?

При использовании стандартного драйвера json-file логи хранятся в /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log. Используйте docker inspect CONTAINER_NAME | grep LogPath для нахождения точного пути. Без настроенной ротации логов эти файлы со временем могут заполнить диск.

Как просмотреть логи после удаления контейнера?

При удалении контейнера его логи тоже теряются. Поэтому использование централизованного сбора логов (Loki, ELK, Fluentd) в production критически важно. Альтернативно можно перенаправить в syslog с --log-driver syslog или писать в файл внутри приложения и сделать его постоянным с помощью volume.

Как настроить ротацию логов?

Два метода: 1) На уровне Docker daemon добавьте max-size и max-file в /etc/docker/daemon.json (применяется ко всем контейнерам). 2) При запуске контейнера используйте --log-opt max-size=10m --log-opt max-file=3. Не забудьте перезапустить Docker после изменений.

Как отслеживать логи нескольких подов в Kubernetes?

Используйте kubectl logs -l app=myapp --all-containers с селектором меток для одновременного просмотра логов нескольких подов. Для более продвинутых решений используйте инструменты stern или kubetail. В production рекомендуется централизованный сбор логов с Loki или ELK Stack.

Почему важно логирование в формате JSON?

JSON-логи структурированы и могут автоматически парситься системами вроде Loki и Elasticsearch. Можно фильтровать и искать по конкретным полям (например, все логи с userId=123). Текстовые логи требуют парсинга с помощью regex, что медленно и подвержено ошибкам.

Связанные статьи

Безопасность Docker: Усиление защиты контейнерной среды

Лучшие практики безопасности Docker: пользователь без root, файловая система только для чтения, профили seccomp, сканирование образов, безопасность Docker socket, сетевая изоляция и управление секретами.

17 dk
dockerбезопасностьконтейнер
Сетевой трафикВходящий GbpsИсходящий Gbps