A utilização do docker é uma das formas mais simples de você realizar o deploy de sua aplicação num servidor. Neste artigo iremos entendeComo utilizar o Docker para fazer deploy de sua aplicação, criando o seu docker file.
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