Como Docker pode agilizar sua vida

Fuechter
Entria
Published in
5 min readSep 16, 2017

Em primeiro momento, Docker, pode parecer ser algo meio complexo ou que deve ser usado apenas em produção, porém uns dos objetivos dele é justamente aproximar o seu ambiente local o mais igual possível do ambiente de produção com suas devidas exceções, além de isolar configurações locais que depois de um tempo você já não sabe nem mais desfazer.

De repente sua equipe resolveu colocar um novo banco de dados que está na crista da onda, porém é muito difícil instalar e configurar ele. Se alguém com sabedoria tivesse configurado um Dockerfile , você poderia se atualizar para esse novo ambiente em questão de segundos, no máximo alguns minutos se a internet estiver lenta.

Sobre Docker

Resumindo de forma bem básica, Docker é como se fosse gerenciador de VM, onde você pode criar várias máquinas a partir de um arquivo chamado Dockerfile , com suas devidas configurações de forma bem isolada, porém com a capacidade delas poderem se comunicar entre si de forma bem prática. Apenas esclarecendo um conceito, Dockerfile apenas vai permitir que você crie uma imagem do seu servidor, como se fosse uma máquina pré-pronta para rodar, a partir da imagem, ele pode criar um container ou mais dependendo da sua necessidade, você vai entender isso melhor logo mais ;).

Um bom artigo para entender sobre o conceito de Docker é do FreeCodeCamp.

Como instalo Docker?

Simples, Mac, Windows e Ubuntu

But, but, but and now?

Agora que você tem os projetos em mão e quer saber como integrá-lo com Docker, tem que ter em mente primeiro o que o seu projeto exige para rodá-lo perfeitamente.

Vamos criar um projeto hipotético que tenha a seguinte exigências:

  • Node 8.0
  • O servidor roda na porta 5001 porém tenho que acessar pela porta 80
  • MongoDB
  • Redis

Okay, agora vamos criar o Dockerfile

Primeiramente, Dockerfile é o arquivo que define quais vão ser a exigência do seu servidor, quais arquivos precisa copiar

Certo, agora vamos tentar alguns comandos básicos

FROM <tag>:<version> Declara a partir de qual imagem pré-pronta você quer montar sua máquina. No caso estamos dizendo para o Docker que queremos uma imagem com Node 8.4.0 já instalado. Você pode publicar as suas imagens para o mundo ou procurar outras já existente no Docker Hub.

P.S: Essa imagem já vem com Yarn instalado.

RUN mkdir -p <path> Criar uma pasta dentro da máquina.

WORKDIR <path> Declara qual vai ser a pasta principal dentro do servidor, sempre que você tentar entrar no servidor, você irá cair direto nessa pasta declarada.

COPY <orig> <dest> Copia uma pasta/arquivo para dentro do servidor.

RUN <command> Roda o comando que você declarar enquanto estiver construindo a imagem.

EXPOSE <port> Isso faz com que a porta seja exposta para quem quiser acessar de fora do container.

CMD <command> Roda o comando que você quiser quando inicializar um container a partir da imagem, ou seja sempre que ligar o “servidor” irá executar um comando.

Okay, agora como faço para inicializar esse tal de container?

Primeiro você precisa construir a imagem do seu servidor, com o seguinte comando:

docker build -t myImage:1.0.0

Se rodar o comando docker images , irá ver todas as imagens criada na sua máquina local.

Agora para construi um container a partir da imagem, na raíz do seu projeto, com a condição de que você quer acessar pela porta 80 a porta 5001 , você pode executar o seguinte comando:

docker run -p 5001:80 myImage:1.0.0

But, onde está o Redis e MongoDB nessa história toda?

Bom, se você explorar um pouco o Docker Hub, já vai ver que existe imagens pré-pronta para esses dois serviços, então basta rodar os seguintes comandos, para inicializar:

docker run mongo:3.4.6 -n mongodb

docker run redis:3.2-alpine -n redis

A flag -n é apenas para dá um nome ao container, para facilitar na hora do container principal do seu projeto achar o outro container como a do MongoDB.

Certo, mas como faço o meu container principal achar os outros container?

Antes de criar o container do seu servidor principal, basta você criar os outros primeiros, que automaticamente por padrão o Docker irá colocar todas as máquinas na mesma rede, e o ip para acessar-lo é o próprio nome do container.

Caramba, mas é muito comando para executar

Existe um cara chamado docker-compose que é justamente para automatizar todo esse processo, onde você pode criar um docker-compose.yml com a seguinte configuração:

Se atente ao detalhe de que o depends_on apenas está dizendo ao docker-compose que não é para inicializar o container myProject sem ou antes do mongodb e redis .

E agora só ser feliz:

docker-compose build && docker-compose up

Algumas vantagens e desvantagens

Bom, nem tudo é um mar de rosas, mas é sempre bom está ciente de certos detalhes.

Contras

  • Espaço de disco.

Docker pode ocupar muito espaço do disco da sua máquina, as vezes será necessário criar uma versão de docker com uma distribuição mais enxuta como Alpine, que em sua maioria costumar ter apenas 150mb de tamanho.

  • Pode ser um pouco mais lento.

Por ser uma máquina virtualizada, mas acredito que isso você nem irá perceber, as vezes é questão de milisegundos, a não ser que seu objetivo seja de fato testar perfomance. Porém isso acontece mais em ambiente Windows e Mac, já que no Linux, o Docker não chega a criar uma máquina virtual, e sim compartilha dos mesmo recursos.

  • Pode produzir muito lixo.

Conforme você for rodando o docker-compose e re-buildando as imagens, por natureza, o docker não limpa as imagens anteriores, mas é bem simples de limpar de tempos e tempos pelo Docker Client.

Prós

  • É fácil de integrar o novo desenvolvedor ao ambiente do projeto.
  • Pode isolar as configurações maluca da sua máquina local.
  • Pode ficar mais próximo do ambiente de produção.
  • Diferente de recursos como Vagrant, VMWare… Docker não “virtualiza” em máquina com recursos alocado, se caso o mesmo seja um ambiente Linux, que geralmente é o mesmo ambiente de produção, isso acaba trazendo otimização de recursos. Aqui nesse link tem uma discussão legal sobre isso.

Considerações finais

Docker é uma ferramenta super poderosa e fácil de se aprender, onde em ambiente de produção é possível isolar cada serviço dentro de um mesmo servidor. Caso você queira descobrir mais sobre Docker, dá uma conferida nesse link.

Se você tem alguma conhecimento/opinião diferente, deixe nos comentários para a gente poder discutir sobre isso, não tenha medo de apontar se tiver algo errado ;)

o/

--

--