
Я пытался добавить в Docker (в Debian 8.2) сервер OpenVPN (да, я знаю, такие контейнеры уже есть), но что-то пошло не так внутри контейнера, и сервер не запустился.
Я решил проверить логи, но /var/log/syslog
(логи OpenVPN на моем хост-компьютере) внутри контейнера отсутствовали.
Я думал, что rsyslog
он не установлен и добавил его установку перед установкой OpenVPN в Dockerfile. Но это не дало эффекта, он syslog
все еще отсутствовал.
Мой Dockerfile:
FROM debian:8.2
USER root
EXPOSE 53/udp
EXPOSE 1194/udp
EXPOSE 443/tcp
RUN apt-get update
RUN apt-get install -y rsyslog
RUN apt-get install -y openvpn
# ...
# Some configuration stuff
# ...
ENTRYPOINT service openvpn start && sh
Вопросы следующие:
Почему OpenVPN регистрируется в
syslog
после установки по умолчанию на моем хосте Debian 8.2 и не делает этого внутри контейнера? Я ничего не настраивал на своей хост-машине, чтобы принудительно регистрировать OpenVPN вsyslog
. Это было поведение по умолчанию.Как настроить ведение журнала сервера OpenVPN, работающего внутри контейнера Docker?
решение1
OpenVPN не запустится с этим Dockerfile, потому что его не с чего запускать :-). Ваша точка входа — sh
; это все, что он запустит.
Если вы хотите запустить два демона внутри Docker, ваша точка входа должна быть программой, которая запускает их обоих. Многие используют supervisord
для этого. Обратите внимание, что Docker — относительно своевольное программное обеспечение, и запуск нескольких демонов в одном контейнере не считается идиоматичным.
Если это просто отладка, то нет проблем. Просто не запускайте openvpn
с --daemon
или --log
. Он будет писать в stdout (предположительно, хотя я не удивлюсь, если увижу stderr). Это отлично подходит для отладки, если вы запустите его вручную. Вы сразу увидите все сообщения журнала в терминале.
Если вы настроите точку входа и вручную запустите контейнер в интерактивном режиме — то же самое. Если вы запустите его как фоновый контейнер (простите за мою неопределенность), вывод будет захвачен для docker logs
. Это тот же метод, который предпочитают современные системы инициализации, такие как systemd (и система журналирования systemd "journal").
После того, как вы настроите демон нужным вам образом, вас могут заинтересовать более индивидуальные системы сбора журналов, такие как другие ответы.
Согласно man-странице для Docker, у него есть подключаемые драйверы журналирования docker logs
. Есть драйвер «syslog», который пишет в системный журнал хоста. Там написано, что это docker logs
не сработает, но я не думаю, что это станет для вас проблемой.
ПРЕДУПРЕЖДЕНИЕ: docker logs
работает, если вы используете драйвер журналирования journald. Однако, по-моему, в Debian по умолчанию это приведет к потере журналов при перезагрузке. Поскольку Debian не настраивает постоянный журнал. Но это несложно изменить, если это то, что вам нужно.
Другой драйвер логирования, который поддерживает docker logs
команду, называется "json-file". Я ожидаю, что это будет постоянно, но вы можете предпочесть одно из других решений.
Вопрос «почему»
Дело в том, что контейнеры Docker не обязательно работают так же, как и ОС, на которой они основаны. Docker — это не виртуализация ОС, как LXC
, systemd-nspawn
, или виртуальная машина. Хотя Docker произошел от LXC
, он был специально разработан для «контейнеров приложений», которые запускают одну программу.
(Текущие) серверные дистрибутивы разработаны как комбинация нескольких запущенных программ. Поэтому вы не можете взять пакет из них и ожидать, что он будет вести себя точно так же внутри одного из этих контейнеров приложений.
Связь с демоном регистрации — отличный пример. Ничего там не изменится, кроме того, что люди станут более знакомы с концепцией контейнеров приложений. И хотят ли они на самом деле использовать это :). Я подозреваю, что многим системным администраторам больше будет интересен мэшап LXC (контейнеры ОС) с чем-то вроде NixOS для обмена пакетами между контейнерами; насколько мне известно, он просто еще не написан. Или простолучше LXC.