Fala devs, vamos com a terceira e última parte? Este artigo faz parte de uma série onde escrevo sobre docker e mostro como é simples configurar um ambiente de desenvolvimento mínimo utilizando containers.
Série completa:
- Conceitos básicos, caso de uso, vantagens e instalação
- Criação de um ambiente PHP
- Servidor web e banco de dados
Para enriquecer o nosso ambiente de desenvolvimento docker iremos adicionar um container de banco de dados (MySQL) e um servidor web (Nginx), mas você pode adicionar containers conforme as necessidades do seu ambiente de desenvolvimento ou projeto seguindo este fluxo.
MySQL:
O conteúdo do arquivo docker-compose.yml
deverá ser modificado, pois iremos adicionar o novo container, ficando assim:
version: "3.7"
services:
php:
build:
context: .
image: phpdocker
container_name: php
ports:
- "9000:9000"
volumes:
- ".:/var/www/html/"
command: php -S 0.0.0.0:9000 -t public/
links:
- mysql
mysql:
image: mysql:5.7
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysql:/var/lib/mysql/
environment:
MYSQL_DATABASE: 'database'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '12345678'
MYSQL_ROOT_PASSWORD: '12345'
volumes:
mysql:
Nele, estamos declarando a utilização da imagem mysql:5.7
, definindo as credenciais de acesso, apontando a relação de dependência com o MySQL através da tag link
, bem como a porta em que será executado e o mapeamento de volumes. Este último faz com que não percamos o que foi persistido nos bancos de dados após “derrubarmos” o container.
Testando PHP + MySQL:
Para fins didáticos, modifique o arquivo public/index.php
e insira o seguinte conteúdo:
<?php
$pdo = null;
try {
$pdo = new PDO('mysql:host=mysql;dbname=database', 'root', '12345');
} catch (PDOException $e) {
print $e->getMessage();
die();
}
var_dump($pdo);
O código acima realiza uma conexão com a base dados database
que foi declarada como banco de dados padrão no container de MySQL.
Se tudo deu certo, você pode “subir” os containers com o comando e docker-compose up -d
e verificar se a conexão foi realizada com sucesso através do browser no seguinte endereço:
http://localhost:9000/
Nginx:
Será necessário criar um arquivo com as configurações do servidor web. Para isso, crie um diretório chamado webserver
e dentro dele, o arquivo nginx.conf
com o seguinte conteúdo:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /var/www/html/public/;
autoindex on;
index index.php;
location / {
try_files $uri $uri/ /index.php;
location = /index.php {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ \.php$ {
return 444;
}
}
}
O conteúdo do arquivo docker-compose.yml
deverá pela última vez ser modificado para adicionarmos o nosso container de servidor web, ficando assim:
version: "3.7"
services:
nginx:
image: nginx:1.17.3
container_name: nginx
ports:
- "8080:80"
volumes:
- ".:/var/www/html/"
- "./webserver/nginx.conf:/etc/nginx/nginx.conf"
links:
- php
- mysql
php:
build:
context: .
image: phpdocker
container_name: php
ports:
- "9000:9000"
volumes:
- ".:/var/www/html/"
# command: php -S 0.0.0.0:9000 -t public/
# links:
# - mysql
mysql:
image: mysql:5.7
container_name: mysql
ports:
- "3307:3306"
volumes:
- mysql:/var/lib/mysql/
environment:
MYSQL_DATABASE: 'database'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '12345678'
MYSQL_ROOT_PASSWORD: '12345'
volumes:
mysql:
Nele, estamos declarando a utilização da imagem nginx:1.17.3
, definindo o mapeamento dos volumes (diretório de trabalho e arquivo de configurações), a porta em que estará disponível e apontando as dependências, que agora não serão mais definidas no container de PHP, e é por isso que as linhas 24
e 25
foram comentadas.
Podemos observar que o comando que foi declarado na linha 25
também foi comentado, uma vez que a partir de agora nossa aplicação será executada pelo servidor web e não mais pelo servidor embutido do PHP.
Se tudo deu certo, você pode “subir” os containers com o comando e docker-compose up -d
e acessar a aplicação através do browser no seguinte endereço:
http://localhost:8080/
Conclusão:
Se você clonar este repositório terá o ambiente docker desenvolvido nessa série pronto para uso em sua máquina!
Sei que são infinitas as possibilidades quando falamos sobre a utilização de containers docker, mas o propósito deste grupo de artigos é mostrar como é simples trazer isso para o nosso dia a dia de forma tranquila e sem pesadelos.
Chegamos ao final da série “Criando um ambiente de desenvolvimento PHP mínimo com Docker” e eu espero que este conteúdo seja útil para a comunidade!
Obrigado e forte abraço!