Exemplo Prático: Configurando ambiente Docker
Criação e Configuração do Banco de Dados
services:
db:
image: postgres:15-alpine
container_name: postgres_db
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: root
POSTGRES_DB: postgres
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4:8.11.0
ports:
- 5050:80
environment:
- PGADMIN_DEFAULT_EMAIL=admin@mail.com
- PGADMIN_DEFAULT_PASSWORD=root
depends_on:
- db
volumes:
postgres_data:
-
Inicialize o docker deamon (no windows basta abrir o Docker Desktop)
-
No terminal do diretório raiz projeto (onde está localizado o docker-compose.yml) suba o container com o comando "docker-compose up --build -d"
-
use o comando "docker exec -it <container_name> bash" para acessar o terminal dentro de um contêiner em execução
-
no bash do container use o comando psql -U <POSTGRES_USER> -d <POSTGRES_DB> para abrir o terminal do psql
-
Copie o conteúdo do arquivo "db.sql" para o terminal do psql, que automaticamente serão criadas as tabelas do banco
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
phone VARCHAR(15) UNIQUE,
password_hash VARCHAR(255) NOT NULL,
username VARCHAR(255) NOT NULL,
bio TEXT
);
Services (Serviços)
Dentro de um arquivo docker-compose.yml, cada “service” representa um contêiner. Por exemplo:
- db na configuração acima representa um contêiner com banco de dados PostgreSQL.
- pgadmin representa um contêiner que roda a interface web pgAdmin.
Cada serviço define qual imagem Docker será usada, variáveis de ambiente, portas que serão expostas, volumes para persistência de dados e dependências de outros serviços.
Fazendo novamente uma analogia ao paradigma de orientação a objetos, o service "db" instancia a "classe" "postgres:15-alpine" e modifica seus "atributos": POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, ports, volumes.
Volumes
Volumes permitem que você mantenha os dados salvos entre reinicializações dos contêineres. Sem volumes, os dados seriam perdidos toda vez que o contêiner fosse parado ou recriado. Ao configurar “volumes”, o Docker mapeia um diretório interno do contêiner para uma pasta ou volume persistente na máquina host, garantindo que as informações sejam preservadas.
Docker no contexto do projeto
No docker-compose.yml:
• serviço “db”:
- Usa a imagem postgres:15-alpine (versão mais leve do PostgreSQL).
- Define variáveis de ambiente (usuário, senha e nome do banco).
- Expõe a porta 5432 para que outras aplicações possam fazer um bind nessa porta, e se conectar com o servidor do banco postgres.
- Suporta um volume para persistir os dados.
• serviço “pgadmin”:
- Usa a imagem dpage/pgadmin4 para gerenciar o banco via interface visual no navegador.
- Redireciona a porta 80 do contêiner para a 5050 no host, ou seja,
- Define variáveis de ambiente de login e senha do pgAdmin.
- Cria uma dependência com o serviço “db”, ou seja, o contêiner pgAdmin só sobe quando “db” estiver disponível.
Desse modo o banco de dados e a interface de gerenciamento são definidos em um único arquivo de configuração (YAML), facilitando a manutenção, escalabilidade e portabilidade do seu projeto.
Outra forma
Uma alternativa à configuração direta no docker-compose.yml é criar um Dockerfile para encapsular a aplicação e, em seguida, referenciá-lo no docker-compose.yml. Isso é útil quando você precisa personalizar a imagem Docker da aplicação.
Arquivo Dockerfile:
FROM php:5.6-apache
# instala as dependências do PHP: mbstring, pdo, pdo_mysql e pdo_pgsql
RUN apt-get update && apt-get install -y libpq-dev && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-install mbstring pdo pdo_mysql pdo_pgsql
# instala o módulo de reescrita de URL do Apache
RUN a2enmod rewrite
# copia o código-fonte da aplicação para o diretório raiz do servidor web
# fazer um COPY . /var/www/html/ necessitaria de um Dockerignore, pois copia arquivos desnecessários
COPY public/ /var/www/html/
COPY src/ /var/www/html/src/
COPY view/ /var/www/html/view/
# define o diretório raiz do servidor web
WORKDIR /var/www/html
# expõe a porta 80 do contêiner para o host (necessário para acessar a aplicação via navegador)
EXPOSE 80
# define o comando que será executado quando o contêiner for iniciado
CMD ["apache2-foreground"]
Arquivo docker-compose.yml:
php:
build: . # usa o Dockerfile do diretório atual
container_name: php
ports:
- "80:80"
volumes:
- ./src:/var/www/html
depends_on:
- db