Docker & Devs
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á ;)
- Sistema Operacional
- Problemas com a Rede
- Pouca Memória
- docker-compose.yml
- 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!