Docker & Devs

Thiago Costa
DOT Insiders
Published in
6 min readMay 15, 2020

Muitas vezes fui procurado para auxiliar com problemas no uso do Docker. Principalmente quando temos muitos projetos diferentes e integrados em uma mesma infra de um único cliente. Pude perceber uma similaridade em boa parte dos casos, resolvi destacar alguns desses pontos e compartilhar com todos.

Vamos lá ;)

  1. Sistema Operacional
  2. Problemas com a Rede
  3. Pouca Memória
  4. docker-compose.yml
  5. Terminal & Logs

*Obviamente temos outros casos esporádicos que ocorrem, para focarmos, vamos conversar um pouco sobre os tópicos indicados acima.

1) Sistema Operacional

Cada desenvolvedor tem sua preferência e obviamente não é uma discussão que vamos tratar aqui. Quando conheci o Docker fiquei maravilhado com suas possibilidades, pois, permite quebrar tal paradigma. Não importa seu Sistema Operacional o projeto deve rodar igual em todos os ambientes de forma simples, objetiva e rápida.

Opa! Em todos os Ambientes? Sim, em todos!

(Principalmente em grandes times com muitos desenvolvedores e plataformas.)

Quando falamos de Windows a conversão de arquivos para Unix e Links Simbólicos, são um problema.

Alguns projetos necessitam executar scripts quando o Container é iniciado. Criação de pasta de Logs, Cache, Instalação de Dependências e outras necessidades. No Windows quando não efetuamos as devidas marcações no Instalador do GIT o Docker não reconhece os arquivos Unix (Muito usado na execução de scripts), indicando que ele não existe (Sim, Mesmo você observando que o arquivo está lá), ou ainda, ignorando Links Simbólicos que impede o Docker de reconhecer Volumes(Pastas Locais no Windows).

Para evitar isso devemos efetuar a seguinte marcação quando Instalar o GIT no Windows: Link para Download.

Windows:

Minha sugestão é usar o GIT Bash como Terminal do Windows. O PowerShell ou CMD nem sempre aceita comandos comuns rotineiros usados no Linux.

Lembre-se execute sempre como Administrador a abertura do Terminal. Isso é muito importante no Windows para garantir que os comandos executados tenham as suas devidas permissões para execução.

Atenção ao Firewall e Anti-Virus, fique atento para evitar bloqueio de portas ou de execuções dos serviços do Docker. As vezes desabilitar temporariamente para teste é uma opção, para ter certeza que o problema não possui referencia a esses dois fatores.

2) Problemas com a Rede

Nem sempre o comando $ docker-compose down funciona como esperado no Windows e no MacOS. É um fato!

Em muitas vezes a Rede persiste em ficar ativa mesmo após a execução do down. Isso pode ocorrer por diversos fatores. Um ou mais Container secundário dependente dele ou até mesmo por estar em uso. Hoje utilizo sempre o seguinte comando, executando uma vez só:

$ docker stop $(docker ps -aq) && docker rm $(docker ps -qa) && docker network prune -f

Caso você use o PowerShell ou o CMD esse comando não deve funcionar por não reconhecer “&&”. Você pode executar os blocos separadamente que deve funcionar, já no GitBash, iTerm2, Terminator, deve funcionar normalmente.

docker stop $(docker ps -aq) = Busca todos os Containers e Paraliza eles.

docker rm $(docker ps -qa) = Busca todos os Container e Remove eles.

docker network prune -f = Remove todas as redes ativas no Docker. ( -f = Force )

O último comando relacionado ao network, resolve grande parte dos problemas relacionados a rede. Para acompanhar a lista de redes ativas, execute o seguinte comando:

$ docker network ls

Atenção: Caso não derrube a rede, cada vez que tentar subir o projeto ele vai tentar subir a rede novamente, por já existir, ele ocasiona um conflito.

Em alguns casos tanto no Windows quanto no MacOS, somente o comando $ docker network prune -f não resolve a situação e a rede continua ativa. As vezes é necessário Reiniciar o Equipamento, ou, casos extremos Resetar o Docker ( digo isso pois já aconteceu comigo e com outros Desenvolvedores (Windows e Mac), mais de uma vez) com as configurações Default. Sim, não é a forma mais elegante mas resolve o problema.

3) Pouca Memória

Pessoal, nem tudo é culpa do Docker. Temos que olhar nossas aplicações, suas dependências e identificar o motivo do projeto/container não estar ativo ou restartando. Como assim?

Exemplo:

Tempos atrás percebi que aplicações PHP que utilizam Composer estouravam limite de memória, erros como esse:

PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted <...>

Segundo algumas pesquisas é um problema do Composer, pode ocorrer aleatoriamente, dependendo do comando executado como por exemplo:

php composer.phar update ...

Para resolver o problema é necessário efetuar o seguinte ajuste em sua aplicação:

php -d memory_limit=-1 composer.phar update ...

Os parâmetros “-d memory_limit=-1” adicionado junto a execução do composer.phar, vai indicar ao PHP que não deve ter limite de memória, resolvendo o problema temporariamente durante sua execução. Obviamente isso em ambientes de desenvolvimento, não devemos deixar isso em produção em!

Em alguns casos a inexistência do arquivo composer.lock pode ser a causa do problema. Fique atento!

Para mais informações sobre esse Bug, acesse o site do Composer clicando Aqui.

4) docker-compose.yml

Bom, esse tópico é curto mas é necessário ficar atento as variáveis de ambiente usadas no docker-compose.yml. Precisamos pensar SEMPRE, no próximo Desenvolvedor, ter a cultura e cuidado de manter atualizado os arquivos de desenvolvimento.

Alguns casos a culpa não é do Docker e sim de variáveis que podem estar ausentes, incorretas ou depreciadas no projeto.

DICA: É sempre bom conversar com alguém do Time para evitar tempo perdido.

5) Terminal & Logs

Boa parte do aprendizado é acompanhar o LOG do Container e da Aplicação. Temos que ter atenção, interpretar e entender o que ele está dito em tela.

Aqui vai alguns comandos para acompanhar o que o Docker nos diz:

Acessando Log de um determinado Container/Projeto, em execução:

docker logs -f CONTAINER

Obviamente troque a palavra CONTAINER para o ID ou nome do container. É possível inclusive usar apenas os 3 ou 4 primeiros números do Id. ;)

O parâmetro “-f” permite acompanhar em tempo de execução.

Listar todos os Containers:

docker ps

Listar imagens do Docker:

docker images

Como acessar dentro do Container?

docker exec -it CONTAINER bash

Esse comando é muito útil. Algumas vezes precisamos executar algum comando no Projeto/Container (Node, Yarn ou Composer) com a versão correta e com a permissão certa, ou alguma outra tarefa. Nem sempre temos a mesma versão instalada no equipamento, fique atento. Isso garante que você execute a versão correta instalada no projeto, sem comprometer o mesmo.

Complementar:

Quero deixar aqui algumas aplicações que uso para suporte e acompanhamento. Acho bacana e importante compartilhar, mesmo sendo algo tradicional para alguns, mas para os novos é importante conhecer em algum momento da vida. ;)

Terminal:

  • Terminator ou iTerm2 (Emuladores de Terminais)
  • CTOP (Infelizmente não tem para Windows, porém é possível acompanhar pela extensão do Docker via Visual Studio Code)
  • Oh My Zsh (Excelente para uso do GIT em terminal. Além de indicar a Branch Ativa, possui temas e recursos que facilitam nossas vidas)
  • HTOP (Por fim o tradicional htop, quando trabalhamos com muitos projetos e integrações os equipamentos sofrem…, tadinhos…, é importante monitorar e saber o que está consumindo para poder trabalhar em paz! rs)

Por fim,

Espero que esse conteúdo ajude quem precise e também nos leve a pensar um pouco mais sobre como estruturamos nossas aplicações, onde podemos melhorar e tornar elas mais híbridas em relação a Sistemas Operacionais, pensando sempre em times com alta diversidade, a final, o Docker está ai para nos ajudar a colocar a casa em ordem.

Muito obrigado pela leitura!

--

--