Como saber por que um contêiner docker sai?

99

Eu tenho um contêiner do Docker em execução em um host de 1G RAM (também há outros contêineres em execução no mesmo host). O aplicativo neste contêiner do Docker decodificará algumas imagens, o que pode consumir muito memória.

De vez em quando, esse contêiner sairá. Duvido que seja devido à falta de memória, mas não tenho muita certeza. Preciso de um método para encontrar a causa raiz. Então, há alguma maneira de saber o que aconteceu com a morte desse contêiner?

Li Bin
fonte
5
Você pode verificar os logs desse contêiner via docker logs <container-id>.
techtabu
2
mas o contêiner foi encerrado, acho que não consigo mais registrá-lo?
Li Bin
Acabei de experimentar na minha máquina. Você ainda pode acessar os registros, mesmo quando o contêiner for encerrado.
Samuel Toh
Você pelo menos tentou?
techtabu
techtabu, sim eu fiz. Não ajuda de qualquer maneira
Li Bin

Respostas:

118

Outros mencionaram docker logs $container_idpara ver a saída do aplicativo. Isso sempre seria minha primeira coisa a verificar.

Em seguida, você pode executar um docker inspect $container_idpara ver os detalhes do estado, por exemplo:

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

A linha importante é "OOMKilled", que será verdadeira se você exceder os limites de memória do contêiner e o Docker encerrar seu aplicativo. Você também pode consultar o código de saída para ver se ele identifica uma causa para a saída de seu aplicativo.

Observe que isso indica apenas se o próprio docker mata seu processo e requer que você defina um limite de memória em seu contêiner. Fora do docker, o kernel do Linux pode lol seu processo se o próprio host ficar sem memória. O Linux geralmente grava em um log em / var / log quando isso acontece. Com o Docker Desktop no Windows e Mac, você pode ajustar a memória alocada para a VM Linux incorporada nas configurações do docker.

BMitch
fonte
9
Eu não entendo aqui é que já que meu container acabou, como a "inspeção" vai funcionar? Da discussão acima, quando o aplicativo morre, o contêiner também morre. Quer dizer reiniciar a mesma imagem e depois inspecionar?
Li Bin
9
@LiBin um contêiner não é apagado quando ele morre, ele simplesmente chega a um estado de parada como status = parado ou encerrado. 'docker ps -a' e veja por si mesmo
Samuel Toh
Eu estava obtendo a saída 0 sempre que executava uma operação com uso intensivo de memória e OOMKilled era falso. Aumentar a memória o fez funcionar novamente.
Andrei
1
Isso pode acontecer se o kernel do Linux, em vez do mecanismo docker, matar processos no contêiner. Freqüentemente, você verá isso nos logs do sistema operacional em / var / log no host.
BMitch
5

Você pode descobrir se o processo dentro do contêiner foi OOMkilled lendo os logs. OOMkills são iniciados pelo kernel, então cada vez que acontece, há um monte de linhas /var/log/kern.log, por exemplo:

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
mosca de isopor
fonte
Essa resposta me ajudou a descobrir o que há de errado com um contêiner que o docker reiniciaria na saída (docker inspect não ajuda muito aqui).
m90
0

Embora a resposta aceita seja a melhor opção, às vezes pode ser útil inspecionar do host o conteúdo do periódico também (no Linux).

Você pode fazer isso digitando:

sudo journalctl -u docker

ou seguindo-o

sudo journalctl -u docker -f

ou canalizando a saída para menos se for muito longo para o buffer do terminal

journalctl -xn -u docker | less
Roberto Manfreda
fonte