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:
  1. Inicialize o docker deamon (no windows basta abrir o Docker Desktop)

  2. 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"

  3. use o comando "docker exec -it <container_name> bash" para acessar o terminal dentro de um contêiner em execução

  4. no bash do container use o comando psql -U <POSTGRES_USER> -d <POSTGRES_DB> para abrir o terminal do psql

  5. 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