Jak poznać przyczynę zamknięcia kontenera Dockera?

109

Mam kontener Docker działający na hoście 1G RAM (są też inne kontenery działające na tym samym hoście). Aplikacja w tym kontenerze Dockera będzie dekodować niektóre obrazy, które mogą zużywać dużo pamięci.

Od czasu do czasu ten pojemnik się opuści. Wątpię, czy jest to spowodowane brakiem pamięci, ale nie jestem pewien. Potrzebuję metody, aby znaleźć główną przyczynę. Czy jest jakiś sposób, aby dowiedzieć się, co się stało ze śmiercią tego pojemnika?

Li Bin
źródło
6
Możesz sprawdzić dzienniki tego kontenera za pośrednictwem docker logs <container-id>.
techtabu
2
ale kontener wyszedł, chyba nie mogę go już zalogować?
Li Bin
Właśnie wypróbowałem na moim komputerze. Nadal możesz uzyskać dostęp do dzienników, nawet po zamknięciu kontenera.
Samuel Toh
Czy przynajmniej próbowałeś?
techtabu
techtabu, tak, zrobiłem. To i tak nie pomaga
Li Bin

Odpowiedzi:

126

Inni wspominali docker logs $container_ido wyświetlaniu danych wyjściowych aplikacji. To zawsze będzie moja pierwsza rzecz do sprawdzenia.

Następnie możesz uruchomić, docker inspect $container_idaby wyświetlić szczegółowe informacje o stanie, np .:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    },

Ważnym wierszem jest „OOMKilled”, który będzie prawdziwy, jeśli przekroczysz limity pamięci kontenera, a Docker zabije Twoją aplikację. Możesz również wyszukać kod zakończenia, aby sprawdzić, czy identyfikuje on przyczynę wyjścia przez Twoją aplikację.

Uwaga, to wskazuje tylko wtedy, gdy sam docker zabija twój proces i wymaga ustawienia limitu pamięci w kontenerze. Poza dockerem jądro Linuksa może lolować twój proces, jeśli samemu hostowi zabraknie pamięci. Linux często zapisuje w dzienniku / var / log, kiedy tak się dzieje. Dzięki Docker Desktop w systemie Windows i Mac można dostosować pamięć przydzieloną do osadzonej maszyny wirtualnej z systemem Linux w ustawieniach platformy Docker.

BMitch
źródło
9
Nie rozumiem, skoro mój kontener zniknął, jak będzie działać funkcja „inspekcja”? Z powyższej dyskusji wynika, że ​​po śmierci aplikacji kontener również umrze. Masz na myśli ponowne uruchomienie tego samego obrazu, a następnie sprawdzenie?
Li Bin
10
@LiBin kontener nie jest usuwany po śmierci, po prostu przechodzi w stan zatrzymania, taki jak status = zatrzymany lub zakończony. „docker ps -a” i przekonaj się sam
Samuel Toh
Otrzymywałem wyjście 0 za każdym razem, gdy wykonywałem operację intensywnie wykorzystującą pamięć, a OOMKilled był fałszywy. Zwiększenie pamięci sprawiło, że znów działało.
Andrei
1
Może się tak zdarzyć, jeśli jądro Linuksa, a nie silnik dokera, zabija procesy w kontenerze. Często zobaczysz to w dziennikach systemu operacyjnego w katalogu / var / log na hoście.
BMitch
6

Możesz dowiedzieć się, czy proces wewnątrz kontenera zakończył się niepowodzeniem, czytając dzienniki. OOMkills są inicjowane przez jądro, więc za każdym razem, gdy to się dzieje, jest kilka linii /var/log/kern.log, na przykład:

python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB
mucha styropianowa
źródło
Ta odpowiedź pomogła mi dowiedzieć się, co jest nie tak z kontenerem, który docker uruchamia się ponownie przy zamykaniu (docker inspect niewiele tu pomaga).
m90
0

Chociaż zaakceptowana odpowiedź jest najlepszą opcją, czasami może być przydatne sprawdzenie zawartości czasopisma również od gospodarza (w systemie Linux).

Możesz to zrobić wpisując:

sudo journalctl -u docker

lub śledzenie go

sudo journalctl -u docker -f

lub potokiem wyjście do mniej, jeśli jest za długi dla twojego bufora terminala

journalctl -xn -u docker | less
Roberto Manfreda
źródło