Docker
Debugowanie kontenera
Szukaj…
Składnia
- statystyki dokera [OPCJE] [POJEMNIK ...]
- dzienniki dokerów [OPCJE] POJEMNIK
- docker top [OPCJE] CONTAINER [ps OPCJE]
Wchodzenie do działającego kontenera
Aby wykonać operacje w kontenerze, użyj polecenia docker exec
. Czasami nazywa się to „wejściem do kontenera”, ponieważ wszystkie polecenia są wykonywane wewnątrz kontenera.
docker exec -it container_id bash
lub
docker exec -it container_id /bin/sh
A teraz masz powłokę w bieżącym pojemniku. Na przykład wyświetl listę plików w katalogu, a następnie pozostaw kontener:
docker exec container_id ls -la
Możesz użyć -u flag
aby wejść do kontenera z określonym użytkownikiem, np. uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
Uid i gid nie muszą istnieć w kontenerze, ale polecenie może powodować błędy. Jeśli chcesz uruchomić kontener i natychmiast wejść do środka, aby to sprawdzić, możesz to zrobić
docker run...; docker exec -it $(docker ps -lq) bash
docker ps -lq
polecenia docker ps -lq
wyświetla tylko identyfikator ostatniego uruchomionego kontenera (w l- -lq
). (oznacza to, że masz bash jako tłumacz dostępny w twoim kontenerze, możesz mieć sh lub zsh lub jakikolwiek inny)
Monitorowanie wykorzystania zasobów
Sprawdzanie wykorzystania zasobów systemowych to skuteczny sposób na znalezienie aplikacji o nieprawidłowym działaniu. Ten przykład jest odpowiednikiem tradycyjnego polecenia top
dla kontenerów:
docker stats
Aby śledzić statystyki określonych kontenerów, wypisz je w wierszu poleceń:
docker stats 7786807d8084 7786807d8085
Statystyki Docker wyświetlają następujące informacje:
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
Domyślnie docker stats
wyświetlają identyfikator kontenerów, a to nie jest bardzo pomocne, jeśli wolisz wyświetlać nazwy kontenera, po prostu zrób
docker stats $(docker ps --format '{{.Names}}')
Monitorowanie procesów w kontenerze
Sprawdzanie zużycia zasobów systemowych to skuteczny sposób na zawężenie problemu w działającej aplikacji. Ten przykład jest odpowiednikiem tradycyjnego polecenia ps
dla kontenerów.
docker top 7786807d8084
Aby filtrować formatowanie wyjścia, dodaj opcje ps
w wierszu polecenia:
docker top 7786807d8084 faux
Lub, aby uzyskać listę procesów działających jako root, co jest potencjalnie szkodliwą praktyką:
docker top 7786807d8084 -u root
docker top
polecenie docker top
jest szczególnie przydatne podczas rozwiązywania problemów z minimalistycznymi kontenerami bez powłoki lub polecenia ps
.
Dołącz do działającego kontenera
„Dołączanie do kontenera” polega na rozpoczęciu sesji terminalowej w kontekście uruchomionego kontenera (i wszelkich zawartych w nim programów). Jest to używane głównie do celów debugowania, ale może być również potrzebne, jeśli określone dane muszą zostać przekazane do programów działających w kontenerze.
Do tego celu służy polecenie attach
. Ma następującą składnię:
docker attach <container>
<container>
może być identyfikatorem kontenera lub nazwą kontenera. Na przykład:
docker attach c8a9cf1a1fa8
Lub:
docker attach graceful_hopper
Może być konieczne wykonanie sudo
powyższych poleceń, w zależności od użytkownika i konfiguracji dokera.
Uwaga: Opcja Dołącz pozwala tylko na dołączenie do kontenera pojedynczej sesji naraz.
Ostrzeżenie: wszystkie dane z klawiatury zostaną przesłane do kontenera. Wciśnięcie Ctrl-c zabije twój kontener.
Aby odłączyć się od dołączonego pojemnika, naciśnij kolejno Ctrl-p, a następnie Ctrl-q
Aby dołączyć wiele sesji powłoki do kontenera lub po prostu alternatywnie, możesz użyć exec
. Używając identyfikatora kontenera:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
Używając nazwy kontenera:
docker exec -i -t graceful_hopper /bin/bash
exec
uruchomi program w kontenerze, w tym przypadku /bin/bash
(powłoka, prawdopodobnie taka, którą ma kontener). -i
oznacza sesję interaktywną, a -t
przydziela pseudo-TTY.
Uwaga: W przeciwieństwie do dołączania , naciśnięcie Ctrl-c spowoduje przerwanie polecenia exec 'd tylko podczas działania interaktywnego.
Drukowanie dzienników
Śledzenie dzienników to mniej inwazyjny sposób debugowania działającej aplikacji. Ten przykład odtwarza zachowanie tradycyjnego tail -f some-application.log
na kontenerze 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
To polecenie zasadniczo pokazuje standardowe wyjście procesu kontenerowego (proces z pid 1).
Jeśli twoje dzienniki nie zawierają natywnie znaczników czasu, możesz dodać flagę --timestamps
.
Można także przeglądać dzienniki zatrzymanego kontenera
uruchom uszkodzony kontener z
docker run ... ; docker logs $(docker ps -lq)
znajdź identyfikator kontenera lub nazwę za pomocą
docker ps -a
i wtedy
docker logs container-id
lub
docker logs containername
ponieważ możliwe jest przeglądanie dzienników zatrzymanego kontenera
Debugowanie procesu kontenera Docker
Docker to tylko fantazyjny sposób na uruchomienie procesu, a nie maszyna wirtualna. Dlatego debugowanie procesu „w kontenerze” jest również możliwe „na hoście” poprzez po prostu sprawdzenie uruchomionego procesu kontenera jako użytkownika z odpowiednimi uprawnieniami do kontroli tych procesów na hoście (np. Root). Na przykład możliwe jest wyświetlenie listy każdego „procesu kontenera” na hoście, uruchamiając prosty ps
jako root:
sudo ps aux
Wszelkie aktualnie uruchomione kontenery Docker zostaną wymienione w danych wyjściowych.
Może to być przydatne podczas tworzenia aplikacji do debugowania procesu uruchomionego w kontenerze. Jako użytkownik z odpowiednimi uprawnieniami w procesie kontenera można używać typowych narzędzi do debugowania, takich jak strace, ltrace, gdb itp.