Lesen von Dateien und Standardinformationen aus einem laufenden Docker-Container

78

Wie würde ich vorgehen, um eine Anwendung auf meinem Host-Computer zu starten, um Dateien und Standarddaten aus einem laufenden Docker-Container zu lesen?

Im Wesentlichen möchte ich dies tun:

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

Wie würde ich das machen? Genauer gesagt, wohin ich damit gehen möchte; Ich möchte die Protokolle und die Standardausgabe eines Docker-Containers lesen und diese Protokolle an einer anderen Stelle verarbeiten lassen.

Ich bin auch bereit, einen anderen Docker-Container zu erstellen, der Dateien und Standarddaten aus einem anderen Container lesen kann, aber ich weiß nicht, ob dies möglich ist.

rexposadas
quelle

Antworten:

117

Die Standardausgabe des vom Docker-Container gestarteten Prozesses ist über den docker logs $containeridBefehl verfügbar (verwenden -fSie diese Option, um sie für immer am Laufen zu halten). Eine andere Möglichkeit wäre, die Protokolle direkt über die Docker-Remote-API zu streamen .

Für den Zugriff auf Protokolldateien (nur wenn Sie eine Protokollierung bei stdout oder einer anderen Standardlösung wie syslogd in Betracht ziehen müssen) besteht Ihre einzige Echtzeitoption darin, ein Volume zu konfigurieren (wie von Marcus Hughes vorgeschlagen), damit die Protokolle außerhalb des Containers gespeichert und für die Verarbeitung verfügbar sind vom Host oder einem anderen Container.

Wenn Sie keinen Echtzeitzugriff auf die Protokolle benötigen, können Sie die Dateien (im Tar-Format) mit exportierendocker export

Abel Muiño
quelle
1
Guter Fund. Es sieht so aus, als ob Tailing-Container-Protokolle in Version 1.1.0 eingeführt wurden
rexposadas
@rexposadas Die -fOption existiert schon sehr lange ( jedenfalls in der Zeitskala des Dockers ). Mindestens 7 Monate gemäß dieser Ausgabe: github.com/dotcloud/docker/issues/2997
Abel Muiño
Wir haben eine Cloudwatch eingerichtet, in der einige Protokolle einwandfrei gespeichert sind, in der jedoch keine Standardprotokolle gespeichert sind. Ihre Lösung hat funktioniert. Wir können diese Protokolle anzeigen, indem wir den Befehl docker logs ausführen. Wie können wir sie jedoch weiterhin an Cloudwatch senden?
Ondrej Tokar
1
@OndrejTokar Ich bin nicht mit Cloudwatch vertraut, aber Sie können den docker logsBefehl an eine Datei weiterleiten, um diese Datei zu überwachen, oder dies direkt im Container tun und die Protokolldatei als Volume verfügbar machen .
Abel Muiño
1
@OndrejTokar, ich denke, Sie verweisen auf das awslogs-Laufwerk ( docs.docker.com/engine/admin/logging/awslogs ). Poste hier, falls andere interessiert sind.
Wanghq
16

Um die Standardausgabe anzuzeigen, können Sie den Docker-Container mit starten -i. Dies ermöglicht es Ihnen natürlich nicht, den gestarteten Prozess zu verlassen und den Container zu erkunden.

docker start -i containerid

Alternativ können Sie das Dateisystem des Containers unter anzeigen

/var/lib/docker/containers/containerid/root/

Doch weder von diesen sind ideal. Wenn Sie Protokolle oder dauerhaften Speicher anzeigen möchten, sollten Sie bei Verwendung ein Volume an den -vSwitch anhängendocker run . Dies würde bedeuten, dass Sie Protokolldateien entweder auf dem Host überprüfen oder an einen anderen Container anhängen und dort überprüfen können.

Marcus Hughes
quelle
6

Ein bisschen spät, aber damit mache ich es journald. Es ist ziemlich mächtig.

Sie müssen Ihre Docker-Container auf einem Betriebssystem mit ausführen systemd-journald.

docker run -d --log-driver=journald myapp

Dies leitet die ganze Menge in den Journald des Hosts ein, der sich um Dinge wie das Bereinigen von Protokollen, das Speicherformat usw. kümmert und Ihnen einige coole Optionen zum Anzeigen bietet:

journalctl CONTAINER_NAME=myapp -f

welches es Ihrer Konsole zuführt, wenn es protokolliert wird,

journalctl CONTAINER_NAME=myapp > output.log

das gibt Ihnen die ganze Menge in einer Datei zum Mitnehmen, oder

journalctl CONTAINER_NAME=myapp --since=17:45

Außerdem können Sie die Protokolle weiterhin über docker logs ....anzeigen, wenn Sie dies bevorzugen.

Nicht mehr > my.logoder -v "/apps/myapp/logs:/logs"etc.

Adam
quelle
1
Dies ist die bessere Antwort von allen!
Basit Anwer
4

Das Teilen von Dateien zwischen einem Docker-Container und dem Host-System oder zwischen separaten Containern erfolgt am besten mithilfe von Volumes .

Die Ausführung Ihrer App in einem anderen Container ist wahrscheinlich die beste Lösung, da dadurch sichergestellt wird, dass Ihre gesamte Anwendung gut isoliert und einfach bereitgestellt werden kann. Was Sie versuchen, klingt sehr ähnlich zu dem in diesem ausgezeichneten Blog-Beitrag beschriebenen Setup. Schauen Sie mal rein!

Jules Olléon
quelle
Danke für den Vorschlag. Die Verwendung von Volumes ist wahrscheinlich keine Option. Ich möchte keinen Bildersteller anweisen müssen, seine Protokolle in einem bestimmten Volume / Verzeichnis zu speichern. Das Ziel war es, Protokolldateien überall dort zu lesen, wo der App-Ersteller sie schreibt.
Rexposadas
4

Sie können das Dateisystem des Containers unter anzeigen

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

und du kannst einfach

tail -f mylogfile.log
maestr0
quelle
2
Diese dirs sind für mich leer
cdmckay
Für OSX-Benutzer ist dieser Speicherort leer, da Docker in der boot2docker-VM ausgeführt wird und Sie diesen Speicherort auf der VM suchen müssen.
Michael Barton
Unter OSX können sich die Protokolle unter ~ / Library / Containers / com.docker.docker / Data / com.docker.driver.amd64-linux / log / docker.log befinden . Ich benutze Docker 1.12.3.
Wanghq
2
In meiner Situation fand ich das Protokoll unter: /var/lib/docker/containers/<containerID>/<containerID>-json.log
cs94njw