Apache in Docker: Wie kann ich auf "access.log" zugreifen?

17

Ich fange gerade mit Docker an und versuche jetzt herauszufinden, wie ich meine erste dockerisierte Apache 2 / PHP-Umgebung einrichten kann. Bisher habe ich vollständige Linux-VMs verwendet, bei denen ich Protokolldateien verwendet habe, die in / var / log / apache2 geschrieben wurden, und dann "logrotate" verwendet habe, um jeden Tag auf eine neue Datei zu springen.

Protokolldateien wurden hauptsächlich zur sofortigen Fehlererkennung (dh Anmeldung am Server und weniger zum Öffnen der aktuellen Dateien access.log und error.log) und für fail2ban verwendet.

Wenn ich richtig liege, ist dies in einer Docker-Umgebung nicht praktikabel - hauptsächlich, weil Sie sich normalerweise nicht bei Containern anmelden können, um die Protokolle anzuzeigen. Auch Protokolle gehen verloren, wenn der Container entfernt wird.

Also: Welche Methode wird in dieser Situation am häufigsten verwendet, um mit /emulate / replace access.log / error.log zu arbeiten? Was sind gemeinsame Lösungen für Produktions- und Entwicklungsumgebungen?

Bisher habe ich die Idee , eine NFS-Freigabe zu verwenden (die langsam ist und möglicherweise zu Dateikonflikten führt , wenn man nicht aufpasst) und Logstash (nicht sicher, ob es sich für kleinere Sites oder sogar Entwicklungsumgebungen lohnt und praktikabel ist?), Aber ich bin mir sicher, dass es kluge Leute sind haben sich bessere lösungen ausgedacht?

Ich bin mir nicht sicher, ob es einen Unterschied macht, aber momentan basiere ich mein Docker-Image auf PHP: 5.6-Apache .

BlaM
quelle

Antworten:

13

Sie können den docker exec -it <your container name> /bin/bashBefehl weiterhin verwenden , um in Ihren Container zu gelangen und Ihre reguläre Arbeit zu erledigen. Oder Sie können /bin/bashden Befehl oder das Skript .shIhres Befehls ändern , um ihn auszuführen.

Um Ihre Datei aus dem Container zu bekommen, verwenden Sie docker cp <container name:/path/to/file> </your local machine/path/>

Und für Ihre tägliche Arbeit können Sie crondiese Befehle verwenden. Ich empfehle Ihnen dringend, einen Alias ​​für Ihre häufigen Docker-Befehle zu verwenden. Damit ich Docker mit ein paar Schlüsseln glücklich benutzen kann.

Der docker logs <container name/id>Befehl dient zum Anzeigen des Protokolls von der Ausführung des Docker-Images. Die Ausgabe wird auf stdout umgeleitet.

Fony Lew
quelle
Darüber hinaus docker attach <container name>ist dies der beste Weg, um stdout von Ihrem Container aus zu sehen. Aber bitte beachten Sie, dass, wenn Sie Strg + D oder Strg + C tun, es Ihre laufende Aufgabe BEENDET (Sigkill). Sie müssen es also ordnungsgemäß mit der Escape-Taste lösen ctrl+p+q. Wenn Sie nur in Ihren Container schälen möchten, bevorzuge ich die Verwendung des execobigen Befehls.
Fony Lew
6

Wie wäre es, Zugriffs- und Fehlerprotokolle in stderr und stdout zu schreiben?

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

Eine zentralisierte Protokollierung mit ELK würde jedoch eine proaktivere Überwachung ermöglichen. Aber daran haben Sie selbst schon gedacht.

JayMcTee
quelle
1

Bisher habe ich festgestellt, dass " Docker-Protokolle " mehrmals erwähnt wurden.

Ich bin ein absoluter Docker-Neuling, das könnte die Lösung für mein Problem sein - aber bisher habe ich das Konzept hinter diesem Befehl nicht vollständig verstanden.

Docker scheint die gesamte Standardausgabe in JSON-Dateien in / var / lib / docker / containern / zu behalten und gibt mir die Möglichkeit, über den Befehl logs auf sie zuzugreifen.

Bisher bin ich mir nicht sicher, wie ich die Ausgabe verwenden soll.

BlaM
quelle
1

Möglicherweise gab es diese Funktion nicht, als die Frage gestellt wurde, aber mit dem Argument -v von run können Sie ein Verzeichnis auf dem Host in ein Verzeichnis im Container mounten.

docker run -v [host_dir]:[container_dir]

Auf diese Weise bleiben die Protokolldateien (oder andere) erhalten, wenn der Container gelöscht wird, und Sie können auf die Dateien zugreifen, als ob Apache auf dem Host und nicht in einem Container installiert wäre.

Alternativ können Sie geänderte Protokolldateien an einen zentralen Speicherort verschieben. Der Kibana-Stapel verwendet dazu Filebeat. Es sollte jedoch möglich sein, Filebeat unabhängig auszuführen, wenn Sie den Rest des Stapels nicht berücksichtigen.

Erik Lievaart
quelle
1
Docker hatte vor drei Jahren Mount-Volumes gebunden.
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:~ #

Das Docker-Image, das ich ausgewählt habe, hat gerade alle * .log-Dateien mit / dev / stdout und / dev / stderr verknüpft, sodass ich sie nicht lesen konnte.

Nachdem ich die Dateien entfernt und Apache neu gestartet habe, kann ich die Protokolle aus / var / log / im Docker abrufen.

docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"
Ohad Cohen
quelle
0

In der Apache-Konfigurationsdatei können Sie
Folgendes hinzufügen: CustomLog / dev / stdout
ErrorLog / dev / stderr

Verwenden Sie den folgenden Befehl, um die Protokolle
anzuzeigen : docker logs container_id

S.Bao
quelle