Stefan Teixeira: Comandos essenciais do Docker e monitoramento de containers
17 de Março de 2015, 19:25 - sem comentários aindaNeste 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:
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:
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):
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":
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
Ricardo Martins: OpsWorks: Tutorial prático de implementação e uso – Parte II/III
12 de Março de 2015, 20:27 - sem comentários aindaContinuando o post anterior sobre o OpsWorks, vou mostrar neste post como criar uma instância com Nginx hospedando um site estático bem simples, apenas para teste e demonstração. Antes de começar, para entender um pouco mais sobre o conceito de cookbooks e recipes do OpsWorks, você pode dar uma lida aqui: http://docs.aws.amazon.com/opsworks/latest/userguide/gettingstarted-db-recipes.html O cookbook é […]
O post OpsWorks: Tutorial prático de implementação e uso – Parte II/III apareceu primeiro em Ricardo Martins.