Я только начинаю работать с Docker и Richt, сейчас я пытаюсь понять, как настроить свою первую dockerized среду Apache 2 / PHP. До сих пор я использовал полные виртуальные машины Linux, где я использовал файлы журналов, записываемые в / var / log / apache2, а затем использую «logrotate» для перехода к новому файлу каждый день.
Файлы журнала в основном использовались для немедленного обнаружения ошибок (т. Е. Входа на сервер и использования меньшего количества для открытия текущих файлов access.log и error.log) и для fail2ban.
Если я прав, это нецелесообразно в среде Docker - в основном потому, что вы обычно не можете войти в контейнеры, чтобы просмотреть журналы. Также журналы будут потеряны, если контейнер будет удален.
Итак: Каков наиболее распространенный метод работы с / эмуляцией / заменой access.log / error.log в этой ситуации? Каковы общие решения как для производственной среды, так и для среды разработки?
Мои идеи до сих пор включают использование общего ресурса NFS (медленный и может вызвать конфликты имен файлов, если не осторожно) и logstash (не уверен, стоит ли это усилий и возможно ли это для небольших сайтов или даже для среды разработки?), но я уверен, что умные люди придумали лучшие решения?
Не уверен, что это имеет значение, но в настоящее время я основываю свой образ Docker на php: 5.6-apache.
Вы все еще можете использовать docker exec -it <your container name> /bin/bash
команда, чтобы попасть в ваш контейнер и выполнять свою обычную работу. Или, может быть, вы можете изменить /bin/bash
в вашу команду или скрипт .sh
вашей команды, чтобы выполнить его.
Чтобы получить файл из контейнера, используйте docker cp <container name:/path/to/file> </your local machine/path/>
А для повседневной работы вы можете использовать cron
для выполнения этих команд. Я настоятельно рекомендую вам иметь псевдоним для часто используемых команд докеров. Так что я могу с удовольствием использовать докер с несколькими ключами.
В docker logs <container name/id>
Команда предназначена для просмотра журнала выполнения образа докера. Он показывает перенаправление вывода на стандартный вывод.
Как насчет записи журнала доступа и ошибок в stderr и stdout?
https://gist.github.com/afolarin/a2ac14231d9079920864
RUN ln -sf / dev / stdout /var/log/nginx/access.log
RUN ln -sf / dev / stderr /var/log/nginx/error.log
Централизованное ведение журнала с ELK тем не менее, позволит более активный мониторинг. Но вы уже думали об этом сами.
В файле конфигурации apache вы можете добавить:
CustomLog / dev / stdout
Журнал ошибок / dev / stderr
и для просмотра журналов используйте команду ниже:
журналы докеров container_id
root@my_docker:~ # ls -l /var/log/apache2/
total 0
lrwxrwxrwx 1 root root 11 Jul 17 04:55 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 17 04:55 error.log -> /dev/stderr
lrwxrwxrwx 1 root root 11 Jul 17 04:55 other_vhosts_access.log -> /dev/stdout
root@my_docker:~ #
выбранный мной образ докера просто связал все файлы * .log с / dev / stdout и / dev / stderr, поэтому я не мог их прочитать.
после удаления файлов и перезапуска apache я могу получить журналы из / var / log / в докере.
docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"
Возможно, эта функция не существовала, когда был задан вопрос, но с аргументом run -v вы можете смонтировать каталог на хосте в каталог в контейнере.
docker run -v [host_dir]:[container_dir]
Таким образом, файлы журнала (или другие) сохранятся после удаления контейнера, и вы сможете получить доступ к файлам, как если бы apache был установлен на хосте, а не в контейнере.
В качестве альтернативы вы можете каким-то образом отправить измененные файлы журнала в центральное место. Стек Kibana использует для этого filebeat, но должна быть возможность запускать filebeat независимо, если вам не нужна остальная часть стека.
Пока я нашел "журналы докеров"упоминается несколько раз.
Я абсолютный новичок в Docker, так что это может помочь решить мою проблему, но пока я не полностью понял концепцию этой команды.
Docker, похоже, сохраняет весь вывод stdout в Файлы JSON в / var / lib / docker / container / и дает мне возможность получить к ним доступ через команду logs.
Пока я не уверен, как на самом деле использовать вывод.