Docker
Een container debuggen
Zoeken…
Syntaxis
- docker statistieken [OPTIES] [CONTAINER ...]
- docker-logboeken [OPTIES] CONTAINER
- docker top [OPTIONS] CONTAINER [ps OPTIONS]
Invoeren in een lopende container
Gebruik de opdracht docker exec
het docker exec
om bewerkingen in een container uit te voeren. Soms wordt dit "het binnengaan van de container" genoemd omdat alle opdrachten in de container worden uitgevoerd.
docker exec -it container_id bash
of
docker exec -it container_id /bin/sh
En nu heb je een schaal in je lopende container. Geef bijvoorbeeld bestanden in een map weer en verlaat de container:
docker exec container_id ls -la
U kunt de -u flag
gebruiken om de container met een specifieke gebruiker binnen te gaan, bijvoorbeeld uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
De uid en gid hoeven niet in de container te bestaan, maar de opdracht kan fouten veroorzaken. Als u een container wilt starten en meteen naar binnen wilt gaan om iets te controleren, kunt u
docker run...; docker exec -it $(docker ps -lq) bash
de opdracht docker ps -lq
voert alleen het ID uit van de laatste (de l in -lq
) container die is gestart. (dit veronderstelt dat je bash als tolk beschikbaar hebt in je container, je hebt misschien sh of zsh of een andere)
Gebruik van bronnen controleren
Het inspecteren van het gebruik van systeembronnen is een efficiënte manier om zich misdragende applicaties te vinden. Dit voorbeeld is een equivalent van de traditionele opdracht top
voor containers:
docker stats
Om de statistieken van specifieke containers te volgen, geeft u ze op de opdrachtregel op:
docker stats 7786807d8084 7786807d8085
Docker-statistieken tonen de volgende informatie:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
Standaard geeft docker stats
de id van de containers weer, en dit is niet erg handig, als u liever de namen van de container weergeeft, doet u gewoon
docker stats $(docker ps --format '{{.Names}}')
Bewakingsprocessen in een container
Het inspecteren van het gebruik van systeembronnen is een efficiënte manier om een probleem met een actieve toepassing te beperken. Dit voorbeeld is een equivalent van het traditionele ps
commando voor containers.
docker top 7786807d8084
Om de uitvoer te filteren of op te maken, voegt u ps
opties toe op de opdrachtregel:
docker top 7786807d8084 faux
Of, om de lijst met processen als root te krijgen, wat een potentieel schadelijke praktijk is:
docker top 7786807d8084 -u root
De opdracht docker top
vooral handig bij het oplossen van problemen met minimalistische containers zonder shell of de opdracht ps
.
Bevestig aan een lopende container
'Verbinding maken met een container' is het starten van een terminalsessie in de context waarin de container (en alle programma's daarin) wordt uitgevoerd. Dit wordt voornamelijk gebruikt voor het opsporen van fouten, maar kan ook nodig zijn als specifieke gegevens moeten worden doorgegeven aan programma's die in de container worden uitgevoerd.
De opdracht attach
wordt gebruikt om dit te doen. Het heeft deze syntaxis:
docker attach <container>
<container>
kan de container-ID of de containernaam zijn. Bijvoorbeeld:
docker attach c8a9cf1a1fa8
Of:
docker attach graceful_hopper
Mogelijk moet u sudo
de bovenstaande opdrachten, afhankelijk van de gebruiker en hoe havenarbeider is ingesteld.
Opmerking: Bij koppelen kan slechts één shell-sessie tegelijk aan een container worden gekoppeld.
Waarschuwing: alle toetsenbordinvoer wordt doorgestuurd naar de container. Ctrl-c raken zal je container doden .
Om los te koppelen van een bijgevoegde container, drukt u achtereenvolgens op Ctrl-p en vervolgens op Ctrl-q
Als u meerdere shell-sessies aan een container wilt koppelen, of gewoon als alternatief, kunt u exec
. De container-ID gebruiken:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
Gebruik de naam van de container:
docker exec -i -t graceful_hopper /bin/bash
exec
zal een programma uitvoeren binnen een container, in dit geval /bin/bash
(een shell, vermoedelijk een die de container heeft). -i
geeft een interactieve sessie aan, terwijl -t
een pseudo-TTY toewijst.
Opmerking: in tegenstelling tot attach , zal het raken van Ctrl-c alleen het commando exec beëindigen als het interactief wordt uitgevoerd.
Logboeken afdrukken
Het volgen van de logboeken is de minder ingrijpende manier om een live actieve toepassing te debuggen. Dit voorbeeld reproduceert het gedrag van de traditionele tail -f some-application.log
op container 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
Deze opdracht toont in principe de standaarduitvoer van het containerproces (het proces met pid 1).
Als uw logbestanden niet standaard tijdstempels bevatten, kunt u de vlag --timestamps
toevoegen.
Het is ook mogelijk om de logboeken van een gestopte container te bekijken
start de falende container met
docker run ... ; docker logs $(docker ps -lq)
zoek de container-ID of -naam met
docker ps -a
en toen
docker logs container-id
of
docker logs containername
omdat het mogelijk is om de logboeken van een gestopte container te bekijken
Docker container proces debuggen
Docker is gewoon een chique manier om een proces uit te voeren, geen virtuele machine. Daarom is het debuggen van een proces "in een container" ook mogelijk "op de host" door eenvoudigweg het lopende containerproces te onderzoeken als een gebruiker met de juiste machtigingen om die processen op de host te inspecteren (bijv. Root). Het is bijvoorbeeld mogelijk om elk "containerproces" op de host te vermelden door een eenvoudige ps
als root uit te voeren:
sudo ps aux
Alle momenteel actieve Docker-containers worden in de uitvoer vermeld.
Dit kan handig zijn tijdens het ontwikkelen van applicaties voor het debuggen van een proces dat in een container wordt uitgevoerd. Als een gebruiker met de juiste machtigingen kunnen typische hulpprogramma's voor foutopsporing worden gebruikt in het containerproces, zoals strace, ltrace, gdb, enz.