A depuração da maioria dos programas Linux geralmente envolve a verificação dos arquivos de log, o que pode ser um processo complexo. No entanto, ao executar em um ambiente em contêiner no Docker, você precisará usar ferramentas mais específicas para depurar aplicativos em produção.
Onde os registros são armazenados?
A resposta simples é que o Docker armazena logs de contêiner em seu local de armazenamento principal, /var/lib/docker/
. Cada contêiner tem um log específico para seu ID (o ID completo, não o abreviado que geralmente é exibido) e você pode acessá-lo da seguinte forma:
/var/lib/docker/containers/ID/ID-json.log
Isso é Onde eles estão armazenados, mas como estão no formato JSON, não são facilmente legíveis e ter que usar o ID completo do contêiner é irritante. O Docker fornece um comando integrado para visualizá-los:
docker logs -f e4bd48ef3103
Aqui o -f
flag irá manter o prompt aberto e “seguir” quaisquer novas entradas no arquivo. Você também pode --tail
o arquivo, ou use --timestamps
para exibir o tempo de registro, ou use --until
e --since
para filtrar com base no tempo.
Se você estiver usando o Docker Compose, poderá usar o comando log para visualizar todos os registros facilmente:
docker-compose logs
No entanto, uma coisa que você notará é que se trata de STDOUT e STDERR, que é útil para muitas coisas, mas só mostra a saída do console do ponto de entrada especificado por “CMD” no arquivo Docker. Muitos aplicativos têm seus próprios sistemas de registro dedicados, que muitas vezes registram em arquivos como /var/log/nginx/access.log
. O acesso a registros como esse ainda é possível do lado do host por meio do Docker.
Ver registros de aplicativos dentro de contêineres
Dependendo do contêiner, isso pode não ser necessário. Por exemplo, o contêiner NGINX padrão é configurado para enviar seus logs do Docker para STDOUT para tornar a verificação de log mais fácil. Ele faz isso com um link simbólico de /dev/stdout
ao arquivo de log e você pode configurar algo semelhante para seus contêineres.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Mas, se quiser fazer check-out de arquivos específicos dentro de um contêiner, você pode fazer isso. Docker fornece o exec -it
comando para permitir que você execute qualquer comando dentro de qualquer processo Docker em execução. Usando isso, você pode seguir um arquivo de log dentro de um contêiner do Docker:
docker exec -it e4bd48ef3103 tail -f log.txt
Como isso permite que você execute qualquer comando, você pode usar journalctl
ou qualquer outra estratégia de depuração que você deseja, contanto que você inicie com docker exec -it
. Você pode até correr /bin/bash
se você quiser entrar e dar uma espiada.
Uma solução mais permanente que funciona melhor com serviços de host é usar uma montagem de volume Docker. Você pode vincular um diretório como /var/log/nginx
para um volume que é visível do host. Primeiro, crie um novo volume:
docker volume create nginx-logs
E execute o contêiner com o --mount
:
docker run -d --name devtest --mount source=nginx-logs,target=/var/log/nginx nginx:latest
Se você estiver usando o Docker Compose, o processo pode ser automatizado:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
Dessa forma, os arquivos de log serão ingeridos diretamente por qualquer serviço de agregação de log na máquina host.
Ver registros do Docker Daemon
Se, em vez disso, você quiser ver os registros específicos do serviço Docker geral em seu servidor, e não qualquer aplicativo específico em contêiner, você vai querer ver o journalctl
Histórico:
sudo journalctl -fu docker.service
É onde ele é armazenado na maioria dos sistemas, mas está em um local diferente em alguns:
- Amazon Linux:
/var/log/docker
- CentOS / RHEL:
/var/log/messages | grep docker
- Mac OS:
~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
- Janelas:
AppDataRoamingDockerlogvmdockerd.log
0 Comments