Docker Volume Containers для базы данных, журналов и метрик

У меня есть приложение, которое использует встроенную БД, а также генерирует журналы и необработанные метрики для следующей структуры каталогов:

/opt/myapp/data/
  database/
  logs/
  raw_metrics/

Я нахожусь в процессе изучения Docker и пытаюсь «докеризировать» это приложение и пытаюсь найти решение для монтажа/объема, которое позволяет мне достичь следующих целей:

  • Встроенная база данных хранится в одном и том же смонтированном томе независимо от того, сколько у меня запущено экземпляров контейнера myapp. Другими словами, все экземпляры контейнера записывают свои данные в общий том database/; а также
  • Я также предпочел бы то же самое для своих журналов и необработанных метрик (то есть: все экземпляры контейнера записывают журналы/метрики в один и тот же общий том), за исключением того, что здесь мне нужно иметь возможность различать данные журнала и метрики для каждого контейнера. Другими словами, мне нужно знать, что контейнер X сгенерировал конкретное сообщение журнала, или что контейнер Y ответил на запрос через 7 секунд и т. д.

Мне интересно, какая стандартная процедура здесь, в стране докеров. После прочтения официальной документации Docker, а также этой статьи о томах Docker. мой предварительный подход заключается в следующем:

  1. Создайте контейнер тома данных и подключите его, скажем, к /opt/myapp на хост-компьютере.
  2. Затем я могу настроить свою встроенную базу данных для чтения содержимого БД и записи его в /opt/myapp/database, и я полагаю (если я правильно понимаю то, что прочитал), что все экземпляры контейнера будут совместно использовать одну и ту же БД.
  3. Каким-то образом внедрить идентификатор контейнера или какой-либо другой уникальный идентификатор в каждый экземпляр контейнера и реорганизовать мой код ведения журналов и метрик, чтобы включить этот введенный идентификатор при создании журналов или необработанных метрик, чтобы у меня мог быть, скажем, файл /opt/myapp/logs/containerX.log, файл /opt/myapp/logs/containerY.log, и т. д. Но меня очень интересует стандартная практика объединения журналов между контейнерами Docker!

Кроме того, и, возможно, гораздо более важным является тот факт, что я не уверен, что это решение будет работать в сценарии с несколькими хостами, где у меня есть Swarm/кластер с десятками myapp контейнеров на нескольких хостах. Будет ли мой Data Volume Container волшебным образом синхронизировать том /opt/myapp на всех хостах? Если нет, то какое решение для монтирования общих томов для контейнеров, независимо от того, на каком хосте они работают? Заранее спасибо!


person smeeb    schedule 13.06.2017    source источник


Ответы (1)


Есть несколько хороших вопросов. Ниже приведены некоторые из моих ответов.

  1. Драйвер ведения журнала по умолчанию, используемый Docker, — это файл json. Это захватит stdout и stderr в формате json. Существуют и другие драйверы ведения журналов (такие как syslog, fluentd, LogEntries и т. д.), которые можно отправлять на центральный сервер журналов. Использование централизованного ведения журналов также позволяет избежать проблемы самостоятельного обслуживания томов. Все драйверы ведения журнала Docker собраны здесь (https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers)
  2. Если вы используете режим Swarm со службами, существует концепция ведения журнала службы, где журналы службы содержат журналы, связанные со всеми контейнерами, связанными со службой. (https://docs.docker.com/engine/reference/commandline/service_logs/ )
  3. Журнал Docker по умолчанию содержит идентификатор контейнера, который добавляется драйвером ведения журнала. Мы можем настроить его с помощью параметров журнала (https://docs.docker.com/engine/admin/logging/log_tags/)
  4. Для обмена данными между контейнерами, такими как база данных, если контейнеры находятся на одном хосте, мы можем использовать тома на основе хоста. Это не будет работать между узлами, так как нет автосинхронизации. Для совместного использования данных контейнера между узлами мы можем использовать общую файловую систему (например, nfs, ceph, gluster) или плагины тома Docker (ebs, gce).
person Sreeni    schedule 13.06.2017
comment
Спасибо @Sreeni (+1) - относительно вашего первого пункта выше о регистрации драйверов: я думаю, что я мог бы использовать драйвер syslog и настроить syslog на хосте. Но я полагаю (пожалуйста, поправьте меня, если я ошибаюсь!), это потребует от меня изменения моего приложения для входа в STDOUT или STDERR, верно? Как настроить syslog для контейнеров Docker, внутренние приложения которых должны записывать в файл? Например, если мне нужен Dockerized FTP-сервер такой как этот, я ничего не могу сказать о том, как этот FTP-сервер ведет журнал. - person smeeb; 13.06.2017
comment
Например, в этом конкретном образе Docker ведение журнала настроено здесь., установив xferlog_file для указания на файл журнала. Итак, как я могу использовать драйверы Docker для сбора журналов из этих контейнеров FTP-сервера? Просто любопытно! Спасибо еще раз! - person smeeb; 13.06.2017
comment
Вы можете сделать символическую ссылку следующим образом: /path/to/ftp.log -> /dev/stdout и ваш ftp будет думать, что это запись в файл. Или напрямую скажите ему записать в /dev/stdout файл - person Robert; 13.06.2017
comment
Согласен с @Robert. Если вы посмотрите здесь (docs.docker.com/engine/admin/logging/view_container_logs), это также предлагаемый официальный подход. Фактически, такие контейнеры, как nginx и httpd, уже достигают этого, добавляя ссылки или настраиваемое местоположение в Dockerfile, как указано в ссылке. - person Sreeni; 13.06.2017