Como criar um ambiente Docker com PHP, Apache, PostgreSQL e pgAdmin
Tags: php, docker, apache, postegres
Published: 2024-02-27 23:26:39

Neste post, vamos criar um ambiente Docker completo com PHP, Apache, PostgreSQL e pgAdmin. Esses componentes são fundamentais para o desenvolvimento web e administração de bancos de dados.

Vamos começar definindo os arquivos necessários: `docker-compose.yml`, `Dockerfile`, um arquivo de configuração do Apache e um arquivo `index.php` para testar a conexão com o banco de dados PostgreSQL.

**docker-compose.yml**
```yaml
version: '3'

services:
  php:
    build: .
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html

  postgres:
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: teste21
      POSTGRES_DB: postgres
    ports:
      - "5432:5432"

  pgadmin:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@example.com
      PGADMIN_DEFAULT_PASSWORD: teste21
    ports:
      - "8080:80"
```

**Dockerfile**
```Dockerfile
# Usando a imagem base do PHP com Apache
FROM php:8.3-apache

# Instalando extensões PHP necessárias para o PostgreSQL
RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo pdo_pgsql

# Copiando o arquivo de configuração do Apache
COPY apache-config.conf /etc/apache2/sites-available/000-default.conf

# Ativando mod_rewrite do Apache
RUN a2enmod rewrite

# Reiniciando o Apache
RUN service apache2 restart
```

**apache-config.conf** (arquivo de configuração do Apache)
```apacheconf
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```
**Crie o arquivo index para testar a conexão**

Crie um diretório src na raiz e dentro dele crie o arquivo 'index.php'

**index.php** (para testar a conexão com o banco)
```php
<?php 

// Dados de conexão do banco de dados
$dsn = 'pgsql:host=postgres;dbname=postgres;user=postgres;password=teste21';

try {
    // Cria uma nova conexão PDO
    $pdo = new PDO($dsn);

    // Configura o modo de erro do PDO para lançar exceções
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Exibe uma mensagem de sucesso
    echo "Conexão bem-sucedida via postgre!";
} catch(PDOException $e) {
    // Em caso de erro, exibe a mensagem de erro
    die("Erro na conexão: " . $e->getMessage());
}
```

Agora que temos todos os arquivos necessários, vamos explicar o que cada um faz:

- **docker-compose.yml**: Este arquivo define os serviços que serão executados no ambiente Docker. Ele especifica três serviços: PHP com Apache, PostgreSQL e pgAdmin. Cada serviço possui configurações específicas, incluindo portas mapeadas para acesso externo e variáveis de ambiente para configuração.

- **Dockerfile**: Este arquivo é usado para construir a imagem do contêiner PHP com Apache. Ele instala as extensões necessárias do PHP para trabalhar com o PostgreSQL, copia o arquivo de configuração do Apache e ativa o mod_rewrite.

- **apache-config.conf**: Este é o arquivo de configuração do Apache que define as configurações do servidor. Ele permite a sobreposição de configurações em diretórios específicos e habilita a reescrita de URL.

- **index.php**: Este script PHP tenta se conectar ao PostgreSQL usando as credenciais fornecidas no arquivo `docker-compose.yml`. Se a conexão for bem-sucedida, ele exibirá a mensagem "Conexão bem-sucedida via PostgreSQL!". Se ocorrer algum erro durante a conexão, ele exibirá a mensagem de erro correspondente.

Para iniciar o ambiente Docker, basta navegar até o diretório onde esses arquivos estão localizados e executar o comando `docker compose up -d`. Isso irá construir as imagens, criar os contêineres e iniciar os serviços.

Após iniciar os contêineres, você poderá acessar seu aplicativo PHP em `http://localhost` e o pgAdmin em `http://localhost:8080`. Certifique-se de que nenhum outro serviço esteja utilizando as portas especificadas para evitar conflitos.

Com este ambiente Docker, você tem uma solução completa para desenvolvimento web e administração de banco de dados PostgreSQL. Você pode personalizar ainda mais conforme necessário para atender aos requisitos do seu projeto.