Apache в Docker: как мне «access.log»?

17

Я только начинаю работать с Docker и Richt и пытаюсь выяснить, как настроить мою первую докеризированную среду Apache 2 / PHP. До сих пор я использовал полноценные виртуальные машины Linux, где я использовал log-файлы, записываемые в / var / log / apache2, а затем использовал «logrotate» для перехода на новый файл каждый день.

Файлы журнала в основном использовались для немедленного обнаружения ошибок (т. Е. Войдите на сервер и используйте меньше для открытия текущих файлов access.log и error.log) и для fail2ban.

Если я прав, это невозможно в среде Docker - в основном потому, что вы обычно не можете войти в контейнеры, чтобы посмотреть журналы. Также логи будут потеряны, если контейнер будет удален.

Итак: Каков наиболее распространенный метод для работы с / emulate / replace access.log / error.log в этой ситуации? Каковы общие решения для среды производства и разработки?

Мои идеи до сих пор включают использование общего ресурса NFS (медленный и может привести к конфликтам имен файлов, если не соблюдать осторожность), и logstash (не уверен, стоит ли это усилий и возможно ли это для небольших сайтов или даже для сред разработки?), Но я уверен, что умные люди придумали лучшие решения?

Не уверен, что это имеет значение, но в настоящее время я основываю свой образ Docker на php: 5.6-apache .

Бламу
источник

Ответы:

13

Вы все еще можете использовать docker exec -it <your container name> /bin/bashкоманду, чтобы войти в свой контейнер и выполнять свою обычную работу. Или, может быть, вы можете изменить /bin/bashсвою команду или сценарий .shвашей команды, чтобы выполнить его.

Чтобы вытащить файл из контейнера docker cp <container name:/path/to/file> </your local machine/path/>

А для повседневной работы вы можете использовать cronэти команды. Я настоятельно рекомендую вам использовать псевдонимы для ваших часто используемых команд Docker. Так что я могу счастливо использовать докер с несколькими ключами.

Команда docker logs <container name/id>предназначена для просмотра журнала выполнения образа докера. Показывает перенаправление вывода на стандартный вывод.

Фони Лью
источник
Кроме того, docker attach <container name>это хороший способ увидеть стандартный вывод из вашего контейнера. Но, пожалуйста, имейте в виду, что если вы выполните ctrl + d или ctrl + c, это прекратит (sigkill) вашу текущую задачу. Таким образом, вы должны отсоединить его должным образом с помощью клавиши Escape ctrl+p+q. Если вы просто хотите вставить оболочку в свой контейнер, я предпочитаю использовать execкоманду выше.
Fony Lew
6

Как насчет записи доступа и журнала ошибок в stderr и stdout?

https://mail-archives.apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

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 позволило бы проводить более активный мониторинг. Но ты уже думал об этом сам.

JayMcTee
источник
1

До сих пор я обнаружил, что « журналы докера » упоминались несколько раз.

Я абсолютный новичок в Docker, так что это может помочь решить мою проблему - но до сих пор я не до конца понял концепцию этой команды.

Docker, похоже, сохраняет весь вывод stdout в JSON-файлах в / var / lib / docker / container / и дает мне возможность обработать их с помощью команды logs.

Пока я не уверен, как на самом деле использовать вывод.

Бламу
источник
1

Возможно, эта функция не существовала, когда задавался вопрос, но с помощью аргумента run -v вы можете смонтировать каталог на хосте в каталог в контейнере.

docker run -v [host_dir]:[container_dir]

Таким образом, файлы журнала (или другие файлы) сохранятся при удалении контейнера, и вы сможете получить доступ к файлам, как если бы apache был установлен на хосте, а не в контейнере.

Кроме того, вы можете как-то отправить измененные файлы журнала в центральное место. Стек Kibana использует filebeat для достижения этой цели, но должна быть возможность запуска filebeat независимо, если вы не заботитесь об остальной части стека.

Эрик Лиеваарт
источник
1
Докер три года назад связывал тома монтирования.
womble
0
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"
Охад Коэн
источник
0

В конфигурационном файле apache вы можете добавить:
CustomLog / dev / stdout
ErrorLog / dev / stderr

и для просмотра логов используйте команду ниже:
docker logs container_id

S.Bao
источник