29/05/2017 Larissa Bonifácio Roder

Container, DockerFile e Docker Compose

A manutenção em ambientes de Desenvolvimento, Homologação e Produção gera grande impacto no ciclo de vida de uma aplicação.  Para mitigar os riscos neste cenário são utilizadas tecnologias com o intuito de aumentar a produtividade e facilitar a criação dos ambientes citados anteriormente. A tecnologia que melhor atendia era a Máquina Virtual, porém atualmente o conceito de Container ganhou um enorme espaço.

Que conceito seria esse? Como funciona?

Este conceito existe desde 2008, porém se consolidou em 2013 quando o projeto open source Docker foi lançado.

Um Container é muito parecido com uma Máquina Virtual, porém criação e manutenção de uma Máquina Virtual exige um tempo maior e é mais complexo, pois consome uma quantidade grande de espaço em disco, memória e consiste em rodar diversos Sistemas Operacionais utilizando recursos de hardware compartilhados.

Já os containers compartilham de um mesmo Sistema Operacional e isolam alguns recursos por exemplo, processos, sistema de arquivos e entre outros, permitindo assim uma comunicação fácil entre diferentes containers, possibilitando a implantação de uma aplicação muito mais rápida e utilizando menos recursos. Sua utilização é muito incentivada pela cultura de DevOps.

Diante das vantagens a utilização de Containers, no caso o Docker vem aumentando consideravelmente no mundo do desenvolvimento, segundo informações da comunidade Docker um mês após o seu lançamento, em agosto de 2013 já haviam cerca de 10.000 downloads. Dentro de um ano, já possuía suporte comercial de empresas como a Red Hat e a Amazon.

O lançamento da primeira versão release aconteceu em junho de 2014 e até esse momento o Docker já possuía 2,75 milhões de downloads e atualmente esses números ultrapassam 100 milhões de downloads.

Entrando no mundo dos Containers

Sabe-se que um Container é executado utilizando uma imagem, mas o que seria isso?

Uma Imagem é composta por camadas e para a criação de uma imagem personalizada é acrescentado novas camadas à imagem base. Essa imagem personalizada é criada a partir de uma necessidade e pode ser compartilhada por várias máquinas. Por exemplo podemos criar uma imagem personalizada do Banco de Dados MySql.

Um Container possui um conjunto de instruções para ser executado, podemos dizer que um Container é uma instância em execução de uma imagem, por exemplo informar uma instrução que determine a porta em que a imagem do Banco de Dados MySql irá executar.

 

Colocando a mão na massa

Com o Docker temos uma Nuvem pública que chamamos de “Docker Hub”, nela você pode efetuar downloads de imagens e também efetuar uploads de imagens, compartilhando com a comunidade. O foco desse texto é mostrar como o container é utilizado na prática, portanto o primeiro ponto a ser levantado é o conhecido arquivo DockerFile.

DOCKERFILE

Um Dockerfile é um documento de texto que contém todos os comandos que um usuário utiliza em um terminal para montar uma imagem, como mostra o exemplo a seguir:

1 – FROM ubuntu

2 – RUN apt-get update && apt-get -y install apache2

3 – ADD app/ /var/www/html

4 – EXPOSE 80

5 – CMD [“/usr/sbin/apache2ctl”, “-D”, “FOREGROUND”]

 

Com o dockerFile acima temos:

  1. A imagem que estamos criando será baseada na imagem existente do ubuntu;
  2. Atualizar o apt-get e instale o apache2;
  3. Adiciona o que está no caminho app/ (caminho local) /var/www/html (dentro do docker);
  4. Expõe a porta utilizada pelo Container, caso não exponha, a porta será utilizada pelo container, porém não estará pública para que seja acessada externamente;
  5. Executa comandos dentro do container, nesse exemplo estamos dizendo que o apache irá rodar em primeiro plano, pois dentro do container não conseguimos executar processos em segundo plano como por exemplo o comando service no Linux.

Com o arquivo DockerFile pronto basta executar o comando:

$ docker build -t <informar o nome da nova imagem> <caminho do dockerFile>

Com isso  teremos uma nova imagem criada a partir da imagem original do ubuntu.

 

DOCKER COMPOSE

Antes de falar sobre o Docker Compose, vamos ver como faríamos para configurar e iniciar a execução dos containers. Como exemplo utilizaremos a imagem do Mysql:

 

$ docker run –name database -e MYSQL_ROOT_PASSWORD=teste123 -d mysql

 

  • O -e é a opção de enviroment, ou seja, definimos um valor para a variável de ambiente para o MySQL;
  • Rodamos o Container em background, para isso usamos a opção -d.

 

Para cada Container a ser colocado em execução seria necessário executar um comando no terminal informando as configurações necessárias para cada Container ser executado, por isso a importância do Docker Compose ele facilita muito esse serviço.

Um arquivo Compose configura serviços e com apenas um comando inicia-se todas as configurações que necessita fazer no Docker.

 

Exemplo docker-compose.yml para a imagem do Mysql:

1 – db:

2 – image: mysql

3 –  volumes:

– <caminho local>:/var/lib/mysql (local onde os dados são persistidos do Mysql)

4 – environment:

– MYSQL_ROOT_PASSWORD=test123

 

  1.  Determinando um nome para o serviço
  2. A partir de qual imagem serão feitas as configurações
  3. Mapeia diretórios do container para diretórios locais.
  4. Configuração das variáveis de ambiente.

 

Após o arquivo pronto basta executar o comando

$ docker-compose up -d

 

Se tivéssemos 100 serviços bastaria configurar uma vez no arquivo docker-compose.yml  e executar o comando anterior.


 

Esse foi um passo a passo da utilização do Docker mostrando que com DockerFile podemos preparar todo ambiente e gerar as imagens a partir de um script de execução e com Docker Compose podemos criar e executar múltiplos Containers com um único comando, é muito interessante para desenvolvimento, testes e homologação.

 

Referências:

https://docs.docker.com/

https://www.alura.com.br/

Livro: Descomplicando o Docker (Vitalino,  Jeferson Fernando Noronha / Castro,  Marcus André Nunes)

Tagged: , , , ,

Sobre o autor

Larissa Bonifácio Roder Larissa Roder é Desenvolvedora Java há quase três anos, Mestranda em Computação Aplicada pela UTFPR de Cornélio Procópio e possui certificação OCAJ7.