Apache in Docker: Jak „access.log”?

17

Właśnie zaczynam pracę z Dockerem i Richtem, teraz próbuję wymyślić, jak skonfigurować moje pierwsze dokowane środowisko Apache 2 / PHP. Do tej pory korzystałem z pełnych maszyn wirtualnych systemu Linux, w których korzystałem z plików dziennika zapisywanych w katalogu / var / log / apache2, a następnie korzystałem z polecenia „logrotate”, aby każdego dnia przeskakiwać do nowego pliku.

Pliki dziennika były używane głównie do natychmiastowego wykrywania błędów (tj. Zaloguj się na serwerze i używaj mniej do otwierania bieżących plików access.log i error.log) oraz do fail2ban.

Jeśli mam rację, nie jest to możliwe w środowisku Dockera - głównie dlatego, że zwykle nie można zalogować się do kontenerów, aby przejrzeć dzienniki. Również dzienniki zostaną utracone, jeśli pojemnik zostanie usunięty.

Więc: Jaka jest najczęstsza metoda pracy z / emulate / replace access.log / error.log w takiej sytuacji? Jakie są typowe rozwiązania dla środowisk produkcyjnych i programistycznych?

Moje dotychczasowe pomysły obejmują używanie udziału NFS (powolne i mogą powodować kolizje nazw plików, jeśli nie są ostrożne) i logstash (nie jesteś pewien, czy jest to warte wysiłku i wykonalności dla mniejszych witryn, a nawet środowisk deweloperskich ?), Ale jestem pewien, że mądrzy ludzie wymyśliłeś lepsze rozwiązania?

Nie jestem pewien, czy to robi różnicę, ale obecnie opieram swój obraz Dockera na php: 5.6-apache .

BlaM
źródło

Odpowiedzi:

13

Nadal możesz użyć docker exec -it <your container name> /bin/bashpolecenia, aby dostać się do kontenera i wykonywać swoją zwykłą pracę. A może możesz zmienić /bin/bashpolecenie lub skrypt .shpolecenia, aby je wykonać.

Aby wyciągnąć plik z kontenera, użyj docker cp <container name:/path/to/file> </your local machine/path/>

W codziennej pracy możesz użyć crontych poleceń do wykonania cronjob. Gorąco polecam mieć alias często używanych poleceń dokera. Dzięki temu mogę z radością korzystać z dokera z kilkoma kluczami.

docker logs <container name/id>Komenda jest do przeglądania dziennika z realizacją obrazu Döcker. Pokazuje wyjście przekierowania na standardowe wyjście.

Fony Lew
źródło
Ponadto docker attach <container name>jest to dobry sposób, aby zobaczyć standardowe wyjście ze swojego kontenera. Ale uwaga: jeśli zrobisz ctrl + d lub ctrl + c, to ZAKOŃCZY (sigkill) twoje bieżące zadanie. Musisz więc odłączyć go prawidłowo za pomocą klawisza Escape ctrl+p+q. Jeśli chcesz po prostu wykonać powłokę w kontenerze, wolę użyć execpowyższego polecenia.
Fony Lew
6

Co powiesz na zapisywanie dziennika dostępu i błędów na stderr i 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

Scentralizowane rejestrowanie za pomocą ELK pozwoliłoby jednak na bardziej proaktywne monitorowanie. Ale sam już o tym pomyślałeś.

JayMcTee
źródło
1

Do tej pory kilkakrotnie wymieniłem „ dzienniki dokerów ”.

Jestem absolutnym nowicjuszem Dockera, więc może to stanowić rozwiązanie mojego problemu - ale jak dotąd nie w pełni zrozumiałem koncepcję tego polecenia.

Wygląda na to, że Docker przechowuje wszystkie standardowe wyjścia w plikach JSON w / var / lib / docker / container / i daje mi szansę na dostęp do nich poprzez komendę logs.

Jak dotąd nie jestem pewien, jak właściwie wykorzystać dane wyjściowe.

BlaM
źródło
1

Być może ta funkcja nie istniała po zadaniu pytania, ale argumentem run -v można zamontować katalog na hoście na katalogu w kontenerze.

docker run -v [host_dir]:[container_dir]

W ten sposób pliki dziennika (lub inne) przetrwają po usunięciu kontenera i można uzyskać dostęp do plików tak, jakby apache był zainstalowany na hoście, a nie w kontenerze.

Alternatywnie, możesz w jakiś sposób wypchnąć zmodyfikowane pliki dziennika do centralnej lokalizacji. Aby to osiągnąć, stos Kibana używa bitów plików, ale powinno być możliwe niezależne uruchamianie bitów plików, jeśli nie obchodzi cię reszta stosu.

Erik Lievaart
źródło
1
Docker powiązał woluminy montowania trzy lata temu.
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:~ #

obraz dokera Wybrałem właśnie wszystkie pliki * .log do / dev / stdout i / dev / stderr, więc nie mogłem ich odczytać.

po usunięciu plików i ponownym uruchomieniu apache mogę pobrać dzienniki z / var / log / w oknie dokowanym.

docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"
Ohad Cohen
źródło
0

W pliku konfiguracyjnym apache możesz dodać:
CustomLog / dev / stdout
ErrorLog / dev / stderr

i aby zobaczyć dzienniki, użyj poniższego polecenia:
logi dokerów kontener_id

S.Bao
źródło