도커 컨테이너가 종료되는 이유를 아는 방법은 무엇입니까?


99

1G RAM 호스트에서 실행되는 Docker 컨테이너가 있습니다 (동일한 호스트에서 실행되는 다른 컨테이너도 있음). 이 Docker 컨테이너의 애플리케이션은 메모리를 많이 소비 할 수있는 일부 이미지를 디코딩합니다.

때때로이 컨테이너는 종료됩니다. 나는 그것이 메모리 부족으로 인한 것인지 의심하지만 확실하지 않습니다. 근본 원인을 찾는 방법이 필요합니다. 이 컨테이너의 죽음에 어떤 일이 일어 났는지 알 수있는 방법이 있습니까?


5
를 통해 해당 컨테이너의 로그를 확인할 수 있습니다 docker logs <container-id>.
techtabu

2
하지만 컨테이너가 종료되었습니다. 더 이상 기록 할 수 없습니까?
리 빈

내 컴퓨터에서 시도했습니다. 컨테이너가 종료 된 경우에도 로그에 계속 액세스 할 수 있습니다.
사무엘 토

최소한 시도 했습니까?
techtabu

techtabu, 네, 했어요. 그것은 어쨌든 도움이되지 않습니다
리 빈에게

답변:


118

다른 사람들은 docker logs $container_id애플리케이션의 출력을보기 위해 언급 했습니다. 이것은 항상 확인해야 할 첫 번째 것입니다.

다음으로 a docker inspect $container_id를 실행 하여 상태에 대한 세부 정보를 볼 수 있습니다. 예 :

    "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"
    },

중요한 줄은 "OOMKilled"이며 컨테이너 메모리 제한을 초과하고 Docker가 앱을 종료하는 경우 참입니다. 앱에서 이탈의 원인을 식별하는지 확인하기 위해 종료 코드를 조회 할 수도 있습니다.

이것은 도커 자체가 프로세스를 종료하는지 여부를 나타내며 컨테이너에 메모리 제한을 설정해야합니다. Docker 외부에서 Linux 커널은 호스트 자체에 메모리가 부족한 경우 프로세스를 lol 할 수 있습니다. 이런 일이 발생하면 Linux는 종종 / var / log의 로그에 기록합니다. Windows 및 Mac의 Docker Desktop을 사용하면 Docker 설정에서 임베디드 Linux VM에 할당 된 메모리를 조정할 수 있습니다.


9
내 컨테이너가 사라졌기 때문에 "검사"가 어떻게 작동하는지 이해할 수 없습니다. 위의 논의에서 앱이 죽으면 컨테이너도 죽습니다. 동일한 이미지를 다시 시작한 다음 검사합니까?
리 빈

9
@LiBin 컨테이너는 죽었을 때 지워지지 않고 단순히 상태 = 중지 또는 종료와 같은 정지 상태에 도달합니다. '고정 표시기 추신 -a'를 직접 볼
사무엘 토

메모리 집약적 인 작업을 실행할 때마다 0 번 출구가 나오고 OOMKilled는 거짓이었습니다. 메모리를 늘리면 다시 작동합니다.
Andrei

1
이는 도커 엔진이 아닌 Linux 커널이 컨테이너의 프로세스를 종료하는 경우 발생할 수 있습니다. 호스트의 / var / log 아래에있는 OS 로그에서 종종 확인할 수 있습니다.
BMitch

5

로그를 읽어 컨테이너 내부의 프로세스가 OOMkilled되었는지 확인할 수 있습니다. OOMkill은 커널에 의해 시작되므로 발생할 때마다에서 여러 줄이 있습니다 /var/log/kern.log. 예 :

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

이 답변은 docker가 종료시 다시 시작할 컨테이너의 문제점을 찾는 데 도움이되었습니다 (docker inspect는 여기서별로 도움이되지 않습니다).
m90

0

받아 들여진 대답이 최선의 선택이지만, 때로는 저널의 내용도 호스트에서 검사하는 것이 유용 할 수 있습니다 (Linux에서).

다음을 입력하여 수행 할 수 있습니다.

sudo journalctl -u docker

또는 미행

sudo journalctl -u docker -f

또는 터미널 버퍼에 비해 너무 긴 경우 출력을 더 적게 파이프

journalctl -xn -u docker | less
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.