Var förvarar Docker loggfiler?

0
124

Att felsöka de flesta Linux-program innebär vanligtvis att man kontrollerar loggfiler, vilket kan vara komplicerat bearbeta. När du kör i en containermiljö under Docker måste du dock använda mer specifika verktyg för att felsöka appar i produktionen.

Var lagras loggar ?

Det enkla svaret är att Docker lagrar containerloggar på sin huvudsakliga lagringsplats, /var/lib/docker/. Varje behållare har en logg som är specifik för deras ID (det fullständiga ID:t, inte det förkortade som vanligtvis visas) och du kan komma åt den så här:

/var/lib/docker/containers/ID/ID -json.log

Det är där de lagras, men eftersom de är i ett JSON-format är de inte lätta att läsa, och att behöva använda hela behållar-ID:t är irriterande. Docker tillhandahåller ett inbyggt kommando för att visa dem:

docker logs -f e4bd48ef3103

Här kommer -f-flaggan att hålla prompten öppen och “följ” eventuella nya poster i filen. Du kan också –sluta filen, eller använda –timestamps för att visa loggtiden, eller använda –till och –sedan för att filtrera baserat på tid.

Om du använder Docker Compose, du kan använda logkommandot från det för att enkelt visa alla loggar:

docker-compose logs Annons

Men en sak du kommer att märka är att detta är STDOUT och STDERR, som är användbara för många saker, men som bara visar dig konsolutgången för ingångspunkten som anges av “CMD” i Docker-filen. Många appar har sina egna dedikerade loggningssystem, som ofta loggar till filer som /var/log/nginx/access.log. Det är fortfarande möjligt att komma åt sådana här loggar från värdsidan via Docker.

Visa loggar från appar inuti behållare

Beroende på behållaren kanske detta inte är nödvändigt. Till exempel är standard NGINX-behållaren inställd för att skicka sina Docker-loggar till STDOUT för att göra loggkontrollen enklare. Den gör detta med en symbollänk från /dev/stdout till loggfilen, och du kan ställa in något liknande för dina behållare.

KÖR ln -sf /dev/stdout /var/log/nginx/access.log &amp ;& ln -sf /dev/stderr /var/log/nginx/error.log

Men om du vill kolla in specifika filer i en behållare kan du göra det. Docker tillhandahåller exec -it-kommandot så att du kan köra vilket kommando som helst i alla pågående Docker-processer. Med detta kan du avsluta en loggfil inuti en Docker-behållare:

docker exec -it e4bd48ef3103 tail -f log.txt

Eftersom detta låter dig köra vilket kommando som helst, kan du använda journalctl eller andra felsökningsstrategier du vill, så länge du inleder det med docker exec -it. Du kan till och med köra /bin/bash om du vill hoppa in och leta runt.

En mer permanent lösning som fungerar bättre med värdtjänster är att använda ett Docker-volymfäste. Du kan binda en katalog som /var/log/nginx till en volym som är synlig från värden. Skapa först en ny volym:

docker-volym skapa nginx-logs

Och kör behållaren med –mount:

docker run -d –name devtest –mount source=nginx-logs,target=/var/log/nginx nginx:latest

Om du använder Docker Compose kan processen automatiseras:

version: “3.0”-tjänster: webb: bild: nginx:senaste portarna: – “80:80” volymer: – nginx-logs:/var/log/nginx/volymer: nginx-logs: Annons

På detta sätt kommer loggfiler att vara direkt intagbara av alla loggaggregationstjänster på värddatorn.

Visa Docker Daemon-loggar

< p>Om du istället vill se loggar specifika för den övergripande Docker-tjänsten på din server, och inte någon specifik containerapp, vill du se journalctl-loggarna:

sudo journalctl -fu docker.service < p>Det är här det lagras på de flesta system, men det är på en annan plats på vissa:

  • Amazon Linux: /var/log/docker
  • CentOS/RHEL: /var/log/meddelanden | grep docker
  • macOS: ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
  • Windows: AppDataRoamingDockerlogvm dockerd.log