1G RAM 호스트에서 실행되는 Docker 컨테이너가 있습니다 (동일한 호스트에서 실행되는 다른 컨테이너도 있음). 이 Docker 컨테이너의 애플리케이션은 메모리를 많이 소비 할 수있는 일부 이미지를 디코딩합니다.
때때로이 컨테이너는 종료됩니다. 나는 그것이 메모리 부족으로 인한 것인지 의심하지만 확실하지 않습니다. 근본 원인을 찾는 방법이 필요합니다. 이 컨테이너의 죽음에 어떤 일이 일어 났는지 알 수있는 방법이 있습니까?
1G RAM 호스트에서 실행되는 Docker 컨테이너가 있습니다 (동일한 호스트에서 실행되는 다른 컨테이너도 있음). 이 Docker 컨테이너의 애플리케이션은 메모리를 많이 소비 할 수있는 일부 이미지를 디코딩합니다.
때때로이 컨테이너는 종료됩니다. 나는 그것이 메모리 부족으로 인한 것인지 의심하지만 확실하지 않습니다. 근본 원인을 찾는 방법이 필요합니다. 이 컨테이너의 죽음에 어떤 일이 일어 났는지 알 수있는 방법이 있습니까?
답변:
다른 사람들은 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에 할당 된 메모리를 조정할 수 있습니다.
로그를 읽어 컨테이너 내부의 프로세스가 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
받아 들여진 대답이 최선의 선택이지만, 때로는 저널의 내용도 호스트에서 검사하는 것이 유용 할 수 있습니다 (Linux에서).
다음을 입력하여 수행 할 수 있습니다.
sudo journalctl -u docker
또는 미행
sudo journalctl -u docker -f
또는 터미널 버퍼에 비해 너무 긴 경우 출력을 더 적게 파이프
journalctl -xn -u docker | less
docker logs <container-id>
.