Das Debuggen der meisten Linux-Programme beinhaltet normalerweise das Überprüfen von Protokolldateien, was ein komplexer Prozess sein kann. Bei der Ausführung in einer containerisierten Umgebung unter Docker müssen Sie jedoch spezifischere Tools verwenden, um Apps in der Produktion zu debuggen.
Wo werden Protokolle gespeichert?
Die einfache Antwort ist, dass Docker Containerprotokolle an seinem Hauptspeicherort /var/lib/docker/
speichert . Jeder Container hat ein spezifisches Protokoll für seine ID (die vollständige ID, nicht die verkürzte, die normalerweise angezeigt wird) und Sie können wie folgt darauf zugreifen:
/var/lib/docker/containers/ID/ID-json.log
Das ist wo Sie werden gespeichert, aber da sie im JSON-Format vorliegen, sind sie nicht leicht lesbar, und es ist ärgerlich, die vollständige Container-ID verwenden zu müssen. Docker bietet einen eingebauten Befehl, um sie anzuzeigen:
docker logs -f e4bd48ef3103
Hier das -f
flag hält die Eingabeaufforderung geöffnet und „folgt“ allen neuen Einträgen in der Datei. Sie können auch --tail
verwenden der Datei oder verwenden Sie --timestamps
um die Protokollzeit anzuzeigen, oder verwenden Sie --until
und --since
um nach Zeit zu filtern.
Wenn Sie Docker Compose verwenden, können Sie den log-Befehl daraus verwenden, um alle Protokolle einfach anzuzeigen:
docker-compose logs
Eine Sache, die Sie jedoch bemerken werden, ist, dass dies STDOUT und STDERR ist, was für viele Dinge nützlich ist, Ihnen aber nur die Konsolenausgabe des Einstiegspunkts zeigt, der durch „CMD“ in der Docker-Datei angegeben ist. Viele Apps haben ihre eigenen dedizierten Protokollierungssysteme, die häufig in Dateien wie /var/log/nginx/access.log
protokollieren . Der Zugriff auf Protokolle wie dieses ist weiterhin von der Hostseite über Docker möglich.
Anzeigen von Protokollen von Apps in Containern
Je nach Container ist dies möglicherweise nicht erforderlich. Beispielsweise ist der standardmäßige NGINX-Container so eingerichtet, dass er seine Docker-Protokolle an STDOUT sendet, um die Überprüfung der Protokolle zu vereinfachen. Dies geschieht mit einem Symlink von /dev/stdout
in die Protokolldatei, und Sie können etwas Ähnliches für Ihre Container einrichten.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Wenn Sie jedoch bestimmte Dateien in einem Container auschecken möchten, können Sie dies tun. Docker stellt das exec -it
bereit Befehl, damit Sie jeden Befehl in jedem laufenden Docker-Prozess ausführen können. Damit können Sie eine Protokolldatei in einem Docker-Container tailen:
docker exec -it e4bd48ef3103 tail -f log.txt
Da Sie damit jeden Befehl ausführen können, können Sie journalctl
verwenden oder andere Debugging-Strategien, die Sie möchten, solange Sie docker exec -it
voranstellen . Sie können sogar /bin/bash
ausführen wenn Sie einsteigen und herumstöbern möchten.
Eine dauerhaftere Lösung, die besser mit Hostdiensten spielt, ist die Verwendung eines Docker-Volume-Mounts. Sie können ein Verzeichnis wie /var/log/nginx
binden auf ein Volume, das vom Host aus sichtbar ist. Erstellen Sie zuerst ein neues Volume:
docker volume create nginx-logs
Und führen Sie den Container mit --mount
aus :
docker run -d --name devtest --mount source=nginx-logs,target=/var/log/nginx nginx:latest
Wenn Sie Docker Compose verwenden, kann der Prozess automatisiert werden:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
Auf diese Weise können Protokolldateien direkt von allen Protokollaggregationsdiensten auf dem Hostcomputer aufgenommen werden.
Anzeigen von Docker-Daemon-Protokollen
Wenn Sie stattdessen Protokolle anzeigen möchten, die für den gesamten Docker-Dienst auf Ihrem Server und nicht für eine bestimmte containerisierte Anwendung spezifisch sind, sollten Sie das journalctl
anzeigen Protokolle:
sudo journalctl -fu docker.service
Hier wird es auf den meisten Systemen gespeichert, aber auf einigen an einer anderen Stelle:
- Amazon Linux:
/var/log/docker
- CentOS/RHEL:
/var/log/messages | grep docker
- macOS:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Windows:
AppDataRoamingDockerlogvmdockerd.log