Comandos essenciais do Docker e monitoramento de containers

Neste post, quero compartilhar uma lista dos comandos mais importantes no dia-a-dia trabalhando com Docker. Além disso, vou mostrar três recursos para monitoramento de containers, dois deles que estão disponíveis com a última atualização do Docker (versão 1.5 - Fev/2015).


Mas peraí, o que é Docker?

Sem dúvidas, Docker é um dos assuntos mais falados (se não o mais falado) na comunidade de TI em todo o mundo. O Docker revolucionou com sua simples abordagem para containerização de aplicações. Várias grandes empresas já se tornaram parceiras, ofereceram serviços ou passaram a suportar o Docker. Uma das parcerias mais inesperadas foi a da Microsoft, que busca o suporte futuro do Docker ao Windows Server.

Uma figura bastante interessante, apresentada no mês passado em uma palestra do evento IBM Inter Connect 2015, mostra a explosão do Docker na comunidade:

docker grow


IMPORTANTE

Este post presume conhecimento prévio sobre Docker. Caso se interesse em aprender sobre, o amigo Leonardo Galani escreveu um ótimo post de introdução ao Docker, vale muito a pena conferir. No final do post do Galani, tem também o link para um vídeo introdutório, assista! :)

Outra excelente fonte para aprender sobre Docker é o livro The Docker Book, que possui até um site: http://dockerbook.com/. O livro é extremamente recomendado e foi por onde eu comecei a estudar o assunto.


Comandos essenciais do Docker

Vou listar os comandos que mais uso no dia-a-dia nesses últimos meses que tenho trabalhado com Docker. Recomendo ler a documentação caso surja alguma dúvida ou caso precise de algo que eu não tenha falado aqui.

 

Build de uma imagem
docker build -t <nome_da_imagem> <caminho_para_dockerfile>  

OBS: Lembre que as imagens são compostas de camadas (layers) e que o Docker usa caching para fazer o build somente das camadas que tiveram alguma mudança. Recentemente, o Docker publicou uma Image Specification, que explica como tudo isso funciona. Para buildar uma imagem sem utilizar caching, adicione a opção --no-cache ao comando.

OBS2: A opção -t cria uma tag para a imagem e é fortemente recomendada.

 

Executar um container

O comando run tem MUITOS parâmetros possíveis, vide documentação. No meu dia-a-dia, sempre coloco os containers para rodar em background. Com isso, o comando run que uso fica mais ou menos assim:

docker run -d -p <porta_host>:<porta_container> --name <nome_container> <nome_imagem>  

OBS: Nesse exemplo, eu estou fazendo um mapeamento de portas com a opção -p. Para mais detalhes, veja aqui a documentação desse tópico.

OBS2: Você pode adicionar links entre um ou mais containers usando a opção --link <nome_container>:<alias>.

Exemplo: Quero associar o container da minha aplicação app1 com um container do MySQL - --link mysqlcontainer:mysql. Ao informar esse parâmetro, o Docker irá criar uma entrada no arquivo /etc/hosts dentro do container, mapeando o endereço do container mysqlcontainer ao alias mysql. Além disso, o Docker também cria váriaveis de ambiente, dentre outras coisas, que você pode conferir com mais detalhes clicando aqui.

OBS3: Você pode adicionar explicitamente uma entrada ao arquivo de hosts do container através do parâmetro --add-host <nome_host>:<endereco_IP>.

 

Iniciar uma sessão bash em um container que esteja rodando
docker exec -it <nome_container> bash  

Esse comando é essencial quando precisamos entrar no container e ver o que está acontecendo. :)

 

Ver os logs de um container
docker logs <nome_container>  

OBS: Para acompanhar em tempo real os logs de um container que esteja rodando, basta adicionar o parâmetro -f.

 

Ver todas as imagens no host
docker images  

 

Ver todos os containers
docker ps -a  

 

Remover um container
docker rm -f <nome_container>  

 

Remover TODOS os containers
docker rm -f $(docker ps -a -q)  

 

Remover uma imagem
docker rmi -f <nome_imagem>  

OBS: Antes de remover uma imagem, remova todos os containers que a usem.

 

Remover dangling images
docker rmi $(docker images -q -f dangling=true)  

"Dangling images" são, basicamente, imagens sem uma tag. Se você alguma(s) vez(es) rodou um Dockerfile que falhou, provavelmente você deve ter uma ou mais imagens sem tags. Para removê-las, basta usar o comando acima.

 

Copiar um arquivo do container para o host
docker cp <nome_container>:/caminho/no/container /caminho/no/host  

Exemplo: docker cp app1:/home/ec2-user/log.txt /logs


Monitoramento de containers

Para monitorar os seus containers, vou indicar três possíveis recursos. Todos são muito simples de usar, sinta-se à vontade para escolher o que preferir. :)

Docker stats

A versão 1.5 do Docker trouxe a um comando e uma API de stats, que fornece dados dos containers, como % de uso da CPU, memória e de rede.

Para ver as estatísticas de um container, basta usar o seguinte comando:

docker stats <nome_container>  

Você verá um resultado como esse:
ex stats

OBS: Para ver as estatísticas de todos os containers rodando no host, use:

docker stats `docker ps | tail -n+2 | awk '{ print $NF }'`  

 

Docker-mon

Docker-mon é um projeto para monitoramento de containers baseado no blessed-contrib, que cria dashboards em terminais usando ASCII/ANSI art e JS. Ele exibe uma série de informações e gráficos para cada container rodando no host.

Para usá-lo, basta rodar diretamente o container com o comando abaixo, que irá baixar a imagem do projeto automaticamente no DockerHub:

docker run -ti -v /var/run/docker.sock:/var/run/docker.sock icecrime/docker-mon  

Após a execução do comando, você verá um dashboard como esse (imagem retirada do GitHub do projeto):
docker-mon

 

cAdvisor

O cAdvisor é um projeto criado pelo Google para monitoramento de containers, que coleta dados de uso de recursos e de performance dos seus containers. Inicialmente, o projeto era usado para containers lmctfy, mas desde o ano passado também começou a suportar containers do Docker.

Diferentemente do docker stats e docker-mon, o cAdvisor gera uma página HTML com vários gráficos e dados dos containers e do host. Para usá-lo, simplesmente rode o seguinte comando:

sudo docker run \  
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

OBS: Caso você esteja usando o Docker em um ambiente CentOs ou RHEL, o cAdvisor recomenda adicionar a opção --volume=/cgroup:/cgroup \.

Após a execução do comando, a página do cAdvisor estará disponível na porta 8080 do host. A página será parecida com essa (imagem retirada do excelente post "Using cAdvisor to Monitor Docker Containers":
cadvisor


E é isso! Como sempre, confira os links na seção de Referências. :)

Qualquer dúvida/crítica/sugestão, não hesite em comentar ou entrar em contato. Abraços e até o próximo post!


Referências

https://docs.docker.com/reference/commandline/cli/
http://dockerbook.com/
http://stackoverflow.com/questions/17665283/how-does-one-remove-an-image-in-docker
http://keeptesting.com.br/2014/11/25/seu-ambiente-de-teste-com-docker/
http://blog.docker.com/2015/02/docker-1-5-ipv6-support-read-only-containers-stats-named-dockerfiles-and-more/
https://github.com/icecrime/docker-mon
http://blog.tutum.co/2014/08/07/using-cadvisor-to-monitor-docker-containers/
https://github.com/google/cadvisor


Sobre o autor: Stefan Teixeira trabalha como QA Engineer e, desde o final de 2014, tem se aventurado no mundo DevOps. É Bacharel em Ciência da Computação pela UFRJ e MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ. Entusiasta de Testes Automatizados (e de tudo que possa ser automatizado!), Agile Testing e da cultura DevOps.

Contatos: stefanfk@gmail.com | Twitter | LinkedIn


comments powered by Disqus