Implementação de ambiente para desenvolvimento de aplicação utilizando Docker
Tags: docker, apache, php, mysql
Published: 2019-10-25 18:53:28

1. Introdução

O ambiente que vai ser implementado e descrito a continuação é a base para um contexto de desenvolvimento e execução de testes de um sistema web de gestão acadêmica e econômica.

O sistema foi desenvolvido na linguagem PHP, com suporte do servidor Apache, e trabalha com um banco de dados relacional em MySQL. Adicionalmente, para ter uma gestão visual do banco de dados, se utiliza o gestor phpMyAdmin.

De acordo ao descrito, teríamos 3 containers (Ver Figura 1), os quais vão ser criados e gerenciados com apoio da ferramenta Docker. Vai se utilizar também, como orquestrador desses containers o Docker Compose.
Nas seguintes seções vai se descrever de maneira rápida a instalação do Docker e a Criação dos Containers.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/xsfnwdm57yovdfwfvf3r.jpg)

2. Instalação do Docker:

Vamos abordar brevemente os pontos importantes da instalação do Docker. Foi necessário fazer download do instalador do site do docker (https://www.docker.com/get-started). Utilizamos o Docker Desktop para Windows 10. 

Após o processo de instalação, acessamos ao cmd do Windows, com a finalidade de verificar que o Docker foi instalado com sucesso, então digitamos o comando “docker version” e deveríamos ter um resultado como na Figura 2.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/3vuuiokjmqemm5jv47ko.jpg)

3. Criação de Containers
3.1. PHP e Apache
Nesta seção vamos descrever passo a passo a criação dos containers. Trabalharemos com Docker Compose, que é uma ferramenta para definir e executar aplicativos Docker de vários containers. Se usa um arquivo com extensão YAML para fazer as configurações correspondentes [1].

Primeiro vamos criar a pasta onde teremos o projeto, no nosso caso foi chamada de “test_docker” e alocada no Desktop do Windows.

No site https://hub.docker.com/ procuramos as imagens que vamos utilizar para nosso ambiente. Primeiro vamos procurar a imagem de Apache com PHP, e escolhemos a imagem chamada “webdevops/php-apache” (Ver Figura 3). Esta imagem pode ser baixada em linha de comandos com o comando “docker pull webdevops/php-apache”.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/ji3p3p0oxdte3ufw6qbv.jpg)

No nosso caso vamos criar o arquivo chamado docker-compose.yaml na pasta do projeto e vamos a escrever as variáveis necessárias (Ver Figura 4). Para criação e edição do arquivo YAML vamos utilizar na ferramenta Visual Studio Code.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/b2ys14wtz3qer21wthiu.jpg)

Na Figura 4, no parâmetro image indicamos de onde vamos baixar a image, com o parâmetro ports indicaremos os portos que vai utilizar a aplicação. O parâmetro volumes indicará os caminhos de origem e destino de nossa pasta que vai chamar-se “www” e estará dentro da pasta do nosso projeto. Ambos caminhos são separados com o uso dos 2 pontos “:”.

Assim, dentro da pasta “www”, teremos os arquivos pertencentes a nossa aplicação PHP (Ver Figura 5). O aplicativo que será usado como teste para os containers, pois já foi desenvolvido com anterioridade.


![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/th4vpqhmlwrknkln3cz0.jpg)

Uma vez implementado o arquivo composse, vamos para o terminal e nos dirigimos a pasta do projeto. Uma vez aí digitamos o comando “docker composse up” e vamos ter o visualizado na Figura 6, temos que deixar que ele finalize.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/ucbl36ok2vf7povs95ax.jpg)

Ao executar o comando “docker composse up“ da Figura 6 vai-se procurar a imagem, e se for o caso de não achar a imagem, ela vai ser baixada e depois criado o container pertencente a aplicação Apache + PHP. Uma vez finalizada a execução, vamos abrir um novo terminal e verificar que o container existe e está sendo executado (Status: Up); para isso botamos no terminal o comando “docker ps” (ver Figura 7).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/ry8qxc6wonjir78aqkaq.jpg)

Estando tudo certo, continuamos como o teste daquela execução, então vamos a copiar na pasta “www” o aplicativo que já está implementado. Depois abrimos uma janela do navegador web e botamos o endereço: 192.168.99.100/4500 (Ver Figura 8). Assim verificamos que todo este certo. 

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/zuj7g1fgir5zc0jhgohk.jpg)

Com isso verificado, finalizamos a primeira parte.

3.2. MySQL

Agora, voltamos para a linha de comando e paramos a execução do container (esta parte é indispensável para poder rodar o próximo container). Logo disso, nos dirigimos ao site do Docker e procuramos a imagem para o MySQL. Utilizou-se a imagem oficial do mesmo nome “mysql” (Ver Figura 9).


![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/dxgawa19yy393z2tq1fb.jpg)

Uma vez achado, nos dirigimos a nosso arquivo docker-compose e adicionaremos os parâmetros para nossa imagem (Ver Figura 10). Com o parâmetro command, indicaremos que utilizaremos o método tradicional para autenticação, já que utilizamos a última versão do MySQL e ela bem com o método “caching_sha2_password” e pode nos ocasionar erros. Com o parâmetro restart: always, indicaremos que sempre vai se reiniciar. E com o parâmetro environment, indicaremos o password para o usuário root.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/3pfpazdqo5ejtpkd05l2.jpg)

Uma vez feito, salvamos o arquivo e no terminal digitamos novamente o comando “docker-compose up”. Esperamos ele terminar e verificar que esteja sendo executado (Ver Figura 11).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/vn6x8y34b8z2k6qx3xsr.jpg)

Com o comando anterior, vai ser baixada a imagem do MySQL e podemos ver também que tendo já no nosso arquivo YAML anteriormente a parte do servidor Apache e PHP, o Docker vai reconhecer que esse container já existe e vai reutilizar. Nesta execução se centrou só em aquelas partes que ainda não foram baixadas, sendo o caso do MySQL. 
Uma vez feito, vamos parar mais uma vez os dois containers (Ver Figura 12), para poder fazer a última parte.


![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/4if4s4jufkuvxpjlq1ok.jpg)

3.3. phpMyAdmin
Vamos buscar a imagem para o phpMyAdmin, e vamos utilizar o “phpmyadmin/phpmyadmin” (Ver Figura 13).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/hg0dbkcjm6wthtb4zhdv.jpg)

Nos dirigimos mais uma vez ao arquivo docker-compose e adicionamos nas ultimas linhas os parâmetros necessários para nosso último container (Ver Figura 14). Indicamos o password (MYSQL_ROOT_PASSWORD) que vai ser root e o parâmetro port indicando o porto com o que vai funcionar a aplicação.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/1348rgzv7z6wozt03qme.jpg)

Por fim, nosso arquivo final docker-compose.yaml, com tudo o feito fica como na Figura 15.

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/loheeadbc630sah193w1.jpg)

Nos dirigimos ao terminal e executamos mais uma vez o comando “docker-compose up” (Ver Figura 16) e neste caso vai adicionar o container do phpMyAdmin aos outros 2 já existentes (Apache+PHP e MySQL).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/yz4s7l9f0sqju4dw7c8m.jpg)

Uma vez finalizados os comandos pull e ver que esteja rodando os containers, verificamos a instalação na aba do navegador indicando o endereço: 192.168.99.100:8088 (Ver Figura 17 e Figura 18).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/vhwxvpoux6elx1rt8ix8.jpg)

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/tqelcttaqc9nkmcbx2o0.jpg)

Podemos verificar também, no outro terminal que temos aberto, que os containers estejam sendo executados com o comando “docker ps”, vemos o estado de Up a cada um deles (Ver Figura 19).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/rrgsw1xsps2wt0hvjkwy.jpg)

Uma vez, que temos os 3 containers feitos, podemos já carregar nossa base de dados, que neste caso se chama “colegiocarb”, com auxílio do phpMyAdmin (Ver Figura 20). 

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/acnp4myejnse7j154obn.jpg)

É importante sabes que temos que mudar a configuração da classe connection do nosso aplicativo php, já que se inicialmente utilizamos localhost ou o nome do servidor, neste caso temos que botar o nome do servidor que acabamos de criar como o Docker (Ver Figura 21).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/mzih1f9qmw8mq4bkqhlf.jpg)

Por fim, vamos verificar que o aplicativo esteja operativo e sem problemas. Sabendo que o aplicativo não acessaria se a conectividade entre o PHP e o bando de dados MySQL estivesse inexistente, mas verificamos que tudo foi certo no server 192.168.99.100:4500 (Ver Figura 22).

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/283pdd811970quc4mqk0.jpg)

Referencias:
1.	Overview of Docker Compose. Docker. Docker Docs, 2019. Pagina Inicial. Disponível em: https://docs.docker.com/compose/. Acesso em: 21 de out. de 2019.