Como utilizar o Docker para fazer deploy de sua aplicação em alguns segundos.

Sempre que há migração de aplicação entre servidores ou a criação de um novo ambiente operacional, é preciso refazer toda a configuração em uma nova máquina virtual, exigindo uma quantidade de tempo e trabalho considerável. Devido a essas situações que por repetidas vezes ocorriam, uma das tecnologias que se tornaram muito populares nos últimos anos foi a de containers. Veremos algumas vantagens de adotar essa abordagem, que a princípio parece ser mais trabalhosa, entretanto, reduz o trabalho de reimplantação a próximo de zero. Veremos como construir uma aplicação web, utilizando PHP FastCGI e Nginx, além de instalar automaticamente o composer e seus pacotes.

Todos os arquivos utilizados neste post podem ser encontrados em: https://github.com/goodeath/absamPosts/tree/master/docker-app

Docker

É importante deixar claro que a tecnologia de containers e Docker são duas coisas distintas. Os containers se tratam de um tipo de virtualização. Já o Docker é uma implementação concreta dessa tecnologia. Esta opção foi escolhida por ser bastante popular, robusta e open source. Toda vez que utilizarmos o termo Docker trataremos do software .

Docker Compose

É uma ferramenta do docker, utilizada para construir e configurar múltiplos containers Docker simultaneamente. É possível iniciar todos os seus serviços através de um arquivo de configuração (docker-compose.yml) com apenas um comando. Pode ser utilizado em todos os ambientes: produção, testes, desenvolvimento, etc.

Dockerfile

Se trata de um arquivo de configuração, assim como o docker-compose.yml, utilizado para dar instruções durante a criação dos containers. Podemos utilizá-lo para baixar arquivos, instalar pacotes, executar comandos shell, etc.

Iniciando

Devemos instalar os pacotes do Docker. Basta executar o comando:

$ apt install docker.io docker-compose -y

uma vez instalado, podemos verificar a instalação do docker executando:

$ docker -v

A saída deve ser algo como: Docker version 18.09.7, build 2d0083d. Para verificar a instalação do Docker Compose, podemos executar:
$ docker-compose -v

A saída deve ser algo como: docker-compose version 1.17.1, build unknown. Caso haja problemas com a instalação dos pacotes, visite https://docs.docker.com/install/ para checar a instruções detalhadas para o seu sistema operacional.

Iremos aproveitar as imagens já construídas, disponíveis no Docker Hub (https://hub.docker.com). Vamos utilizar a imagem do PHP 7.2-fpm e a nginx:latest. Felizmente podemos utilizar o próprio docker compose para recuperar essas imagens, sem precisar necessariamente acessar o site.

Crie uma nova pasta para o seu projeto, e crie um arquivo chamado docker-compose.yml. O arquivo final vai ser parecido com este:

Vamos analisar cada um dos campos:

version – Indica qual a versão do compose que sendo utilizada. Neste caso a versão 3.
services – Define os serviços que serão iniciados pelo compose.
php | web – O identificador do serviço. Pode ser qualquer nome alfanumérico.
ports – Expõe portas do container. A sintaxe é feita de “{porta_de_origem}:{porta_de_destino}”
build – Campo que indica diretório onde está as configurações que serão aplicadas em tempo de build. Como utilizaremos os arquivos na mesma pasta, utilizamos o . (ponto) para indicar o diretório atual. Tal parâmetro é utilizado apenas no serviço do PHP, pois, o servidor nginx não exige configurações adicionais.
image – Indica o nome da imagem que será utilizada pelo serviço. Pode ser encontrado no Docker Hub.
container_name – Nome do container. É usado apenas como um identificador na hora de executar comandos no container.
volumes – Aqui podemos realizar um link de nossas pastas para dentro do container. Na forma de {origem}:{destino}. É importante notar que, os volumes (pastas, subpastas e arquivos) caso sejam alterados no host , vão refletir dentro do container e vice-versa. Caso deseje que sejam independentes, procurar pelo comando COPY no Dockerfile
depends_on – Lista os serviços pelos seus indicadores, pelo qual o serviço atual precisa esperar para começar a se iniciar.
links – Indica ao serviço, aos quais outros ele deve estabelecer uma conexão de rede. Neste caso o Nginx está linkado com o php pois precisa repassar as solicitações de arquivos php para o FastCGI. Perceba que o nginx solicita ao PHP e pega o retorno, mas, o php nunca faz uma solicitação direta ao nginx, sendo desnecessário estabelecer a conexão nas duas direções.
networks – Podemos estabelecer ou não uma rede e utilizá-las em um serviço. É ideal para manter os endereços constantes e não variar cada vez que um container novo é criado.

No Nginx utilizamos um arquivo site.conf, para realizar as devidas configurações de integração com o FastCGI. É importante não esquecer da indentação e dos hífens (-) para que não ocorra erro na hora do build.

site.conf

Vamos agora a criação do Dockerfile.

Vamos destacar apenas os pontos essenciais:

FROM php:7.2-fpm – Indica que todos os comandos abaixo dessa linha serão executados no container que possui a imagem php:7.2-fpm.

O que fazemos aqui é copiar nosso código fonte para a pasta /home, baixar e instalar o composer (poderíamos também utilizar a imagem pronta), instalar os pacotes do composer e setar a pasta padrão como /code. No final colocamos um script personalizado de execução, que fará a cópia da pasta /home/vendor para a /code/vendor.

Um dos motivos de utilizar um script personalizado, é que como estamos realizando um link da pasta com o host, se realizarmos a instalação de maneira direta, o link é feito depois da execução do Dockerfile, logo, todos os arquivos do vendor serão apagados. É possível superar essa dificuldade usando fases intermediárias de build no Docker, mas, não será nosso caso no momento.

Podemos colocar na raiz do nosso projeto um arquivo index.php:

<?php phpinfo(); ?>

Com toda a configuração realizada, basta executar dentro da pasta:

$ docker-compose up

E devemos ver a seguinte tela:

É possível que seja necessário executar os comandos com o docker em modo de administrador ou caso deseje executar no modo normal, veja este guia: https://github.com/sindresorhus/guides/blob/master/docker-without-sudo.md

Conclusão

Em resumo, a tecnologia Docker é uma abordagem mais granular, controlável e baseada em microsserviços que valoriza a eficiência. Uma vez que todo o processo (Dockerfile, docker-compose, scripts auxiliares) tenham sido completados, basta copiar os arquivos para o servidor, instalar o docker e executar o docker compose. Dessa forma, teremos todo o ambiente devidamente configurado e pronto para uso.

Links

PHP-FPM – https://hub.docker.com/_/php?tab=tags
Nginx – https://hub.docker.com/_/nginx
Dockerfile – https://docs.docker.com/engine/reference/builder/
Docker Compose – https://docs.docker.com/compose/
Página Oficial do Docker – https://www.docker.com/
Docker Compose Versão 3 – Referência – https://docs.docker.com/compose/compose-file/#build

Faça um comentário