WordPress com Docker é a abordagem moderna para desenvolvimento e deployment de aplicações WordPress em 2026. Se você quer aprender como instalar wordpress docker e dominar containerização para seus projetos, este guia técnico cobrirá desde conceitos básicos até deploy em produção com best practices DevOps.

Docker transforma a forma como você desenvolve, testa e deploya WordPress. Com docker compose wordpress, você consegue replicar ambiente de produção localmente, compartilhar setup com sua equipe, e escalar infraestrutura sem dores de cabeça. Este artigo foi feito para desenvolvedores e DevOps engineers que buscam profissionalizar seu stack de WordPress.

WordPress + Docker em 30 segundos

  • Docker: Containerização isolada de aplicação
  • Docker Compose: Orquestra múltiplos containers (WordPress, MySQL, Nginx)
  • Vantagem: Ambiente consistente (dev = prod), fácil escala, isolamento
  • Requisito: Docker instalado + conhecimento básico de linha de comando
  • Tempo setup: ~10 minutos com docker-compose.yml pronto

O Que é Docker? Conceitos Fundamentais

Docker vs Máquina Virtual

  • VM: Sistema operacional completo virtualizado (2-4GB RAM)
  • Docker: Container leve compartilha kernel do host (~100MB)
  • Resultado: Docker é mais rápido, usa menos recurso, ideal para microserviços

Conceitos Principais

  • Image: Template/blueprint do container (como class em OOP)
  • Container: Instância rodando da image (como objeto)
  • Volume: Persiste dados entre container reinicializações
  • Network: Conecta containers para comunicação (WordPress → MySQL)

Passo 1: Instalar Docker

MacOS

  1. Acesse https://www.docker.com/products/docker-desktop
  2. Clique “Download for Mac”
  3. Abra DMG e arraste Docker.app para Applications
  4. Abra Docker.app (menu superior)
  5. Terminal: docker --version (verificar instalação)

Linux (Ubuntu/Debian)

# Instalar Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Adicionar seu usuário ao grupo docker
sudo usermod -aG docker $USER
newgrp docker

# Instalar Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# Verificar
docker --version
docker-compose --version
  

Windows

  1. Baixe Docker Desktop para Windows
  2. Execute instalador (.exe)
  3. Ative WSL 2 (Windows Subsystem for Linux)
  4. Reinicie computador
  5. Abra PowerShell: docker --version

Passo 2: Estrutura de Pastas e Arquivos

Organize seu projeto antes de escrever código:

wordpress-docker/
├── docker-compose.yml
├── .env
├── nginx/
│   └── default.conf
├── wordpress/
│   └── Dockerfile
├── mysql/
│   └── my.cnf
└── README.md
  

Criar Diretório

mkdir wordpress-docker
cd wordpress-docker
mkdir -p nginx mysql wordpress
  

Passo 3: Docker Compose Completo

O arquivo mais importante. Crie docker-compose.yml:

version: '3.9'

services:
  # Serviço MySQL - Banco de Dados
  db:
    image: mysql:8.0
    container_name: wordpress-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - wordpress-network
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  # Serviço PHP-FPM - Processador PHP
  wordpress:
    build:
      context: ./wordpress
      dockerfile: Dockerfile
    container_name: wordpress-app
    restart: always
    depends_on:
      db:
        condition: service_healthy
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_TABLE_PREFIX: ${WP_TABLE_PREFIX}
      WORDPRESS_CONFIG_EXTRA: |
        define('WP_MEMORY_LIMIT', '256M');
        define('WP_MAX_MEMORY_LIMIT', '512M');
        define('FS_METHOD', 'direct');
        define('DISALLOW_FILE_MODS', false);
        define('WP_DEBUG', false);
    volumes:
      - wordpress_data:/var/www/html
      - ./wordpress/php.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      - wordpress-network
    expose:
      - "9000"
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost"]
      timeout: 10s
      retries: 5

  # Serviço Nginx - Web Server
  nginx:
    image: nginx:alpine
    container_name: wordpress-nginx
    restart: always
    depends_on:
      wordpress:
        condition: service_healthy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - wordpress_data:/var/www/html:ro
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
    networks:
      - wordpress-network
    environment:
      - NGINX_HOST=${NGINX_HOST}
      - NGINX_PORT=80

volumes:
  db_data:
    driver: local
  wordpress_data:
    driver: local

networks:
  wordpress-network:
    driver: bridge
  

Passo 4: Arquivo .env (Variáveis de Ambiente)

Crie .env na raiz (não commitar ao Git):

# MySQL Configuration
DB_ROOT_PASSWORD=wordpress_root_secure_password_2026
DB_NAME=wordpress_db
DB_USER=wordpress_user
DB_PASSWORD=wordpress_secure_password_2026

# WordPress Configuration
WP_TABLE_PREFIX=wp_
WORDPRESS_ADMIN_USER=admin
WORDPRESS_ADMIN_PASSWORD=admin_secure_password_2026
WORDPRESS_ADMIN_EMAIL=seu@email.com.br

# Nginx Configuration
NGINX_HOST=localhost
NGINX_PORT=80

# Timezone
TZ=America/Sao_Paulo
  

Segurança .env

  1. Adicione .env ao .gitignore
  2. Gere senhas fortes: openssl rand -base64 32
  3. Mude padrão “wordpress” em produção
  4. Armazene .env em secret manager (AWS Secrets, Vault)

Passo 5: Dockerfile Customizado para WordPress

Crie wordpress/Dockerfile:

FROM php:8.3-fpm-alpine

# Instalar extensões PHP necessárias
RUN apk add --no-cache \
    curl \
    libpng-dev \
    libjpeg-turbo-dev \
    libzip-dev \
    libxml2-dev \
    freetype-dev \
    imagemagick-dev \
    mysql-client

# Compilar extensões PHP
RUN docker-php-ext-configure gd \
    --with-freetype \
    --with-jpeg && \
    docker-php-ext-install \
    gd \
    mysqli \
    zip \
    xml \
    curl \
    mbstring \
    bcmath

# Instalar Imagick
RUN apk add --no-cache imagemagick-dev && \
    pecl install imagick && \
    docker-php-ext-enable imagick

# Instalar Composer
RUN curl -sS https://getcomposer.org/installer | php -- \
    --install-dir=/usr/local/bin --filename=composer

# Instalar WP-CLI
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
    chmod +x wp-cli.phar && \
    mv wp-cli.phar /usr/local/bin/wp

# Configurar diretório
WORKDIR /var/www/html

# Download WordPress latest
RUN curl -O https://wordpress.org/latest.tar.gz && \
    tar -xzf latest.tar.gz --strip-components=1 && \
    rm latest.tar.gz && \
    chown -R www-data:www-data /var/www/html

# Copiar configuração PHP
COPY php.ini /usr/local/etc/php/conf.d/uploads.ini

EXPOSE 9000

CMD ["php-fpm"]
  

Arquivo php.ini Customizado

Crie wordpress/php.ini:

upload_max_filesize = 256M
post_max_size = 256M
max_execution_time = 300
max_input_time = 300
memory_limit = 512M
display_errors = Off
log_errors = On
error_log = /var/log/php-errors.log
disable_functions = exec, passthru, shell_exec, system, proc_open
  

Passo 6: Configuração Nginx

Crie nginx/default.conf:

upstream wordpress {
    server wordpress:9000;
}

server {
    listen 80;
    server_name localhost *.localhost;
    root /var/www/html;
    index index.php index.html;

    # Logging
    access_log /var/log/nginx/wordpress.access.log;
    error_log /var/log/nginx/wordpress.error.log;

    # Gzip compression
    gzip on;
    gzip_vary on;
    gzip_min_length 1000;
    gzip_types text/plain text/css text/xml text/javascript
               application/x-javascript application/xml+rss
               application/javascript;

    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # WordPress rewrite rules
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP handling
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass wordpress;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTP_PROXY "";
    }

    # Cache estático
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
    }

    # Bloquear acesso a arquivos sensíveis
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~ ~$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~ wp-config.php$ {
        deny all;
    }
}
  

Passo 7: Arquivo MySQL Customizado

Crie mysql/my.cnf:

[mysqld]
# Character set
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default_character_set=utf8mb4

# Performance
max_connections=100
max_allowed_packet=256M
innodb_buffer_pool_size=512M
innodb_log_file_size=100M

# Logging
log_error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

# Binlog (backup)
server-id=1
log_bin=mysql-bin
binlog_format=row
expire_logs_days=10

[client]
default-character-set=utf8mb4
  

Passo 8: .gitignore para Segurança

Crie .gitignore:

.env
.env.local
.env.*.local
*.log
.DS_Store
node_modules/
wordpress_data/
db_data/
nginx/ssl/*
!nginx/ssl/.gitkeep
.vscode/
.idea/
*.swp
*.swo
*~
  

Passo 9: Executar Containers

Build e Iniciar

# Build image customizada
docker-compose build

# Iniciar containers
docker-compose up -d

# Verificar status
docker-compose ps
  

Logs

# Ver todos os logs
docker-compose logs -f

# Ver logs específicos
docker-compose logs -f wordpress
docker-compose logs -f db
docker-compose logs -f nginx
  

Passo 10: Configuração Inicial WordPress

Acessar WordPress

Navegue para http://localhost

  1. Escolha idioma português
  2. Preencha dados de site
  3. Username/Password (anote em lugar seguro)
  4. Clique “Instalar WordPress”

Alternativa: WP-CLI (Automático)

# Executar comando dentro do container
docker-compose exec wordpress wp core install \
  --url=http://localhost \
  --title="Meu Blog WordPress" \
  --admin_user=admin \
  --admin_password=admin_secure_password \
  --admin_email=seu@email.com.br

# Verificar instalação
docker-compose exec wordpress wp core is-installed
  

Passo 11: Database Backups

Fazer Backup

# Backup completo do MySQL
docker-compose exec db mysqldump -u wordpress_user -pwordpress_password wordpress_db > backup.sql

# Backup com timestamp
docker-compose exec db mysqldump \
  -u ${DB_USER} \
  -p${DB_PASSWORD} \
  ${DB_NAME} > backups/wp_$(date +%Y%m%d_%H%M%S).sql
  

Restaurar Backup

docker-compose exec -T db mysql \
  -u wordpress_user \
  -pwordpress_password \
  wordpress_db < backup.sql
  

Passo 12: Deploy em Produção

Servidores Recomendados

  • AWS ECS: Container orchestration (escalável)
  • DigitalOcean App Platform: Simples, managed (R$60+/mês)
  • Heroku: PaaS, fácil deploy mas caro
  • VPS (Linode/AWS EC2): Máximo controle, mais complexo

Deploy DigitalOcean (Simplificado)

  1. Crie repositório GitHub com seu código
  2. No DigitalOcean, crie novo “App”
  3. Conecte GitHub e selecione repo
  4. Configure variáveis de ambiente (.env)
  5. Deploy automático a cada push

Checklist Produção

  • Ativar HTTPS/SSL com Let’s Encrypt
  • Definir senhas de banco muito fortes
  • Armazenar .env em secrets manager
  • Implementar backup automático diário
  • Configurar monitoramento e alertas
  • Implementar rate limiting no Nginx
  • Usar CDN para assets estáticos (Cloudflare)
  • Instalar Wordfence ou Sucuri Security

Passo 13: Otimização Performance Docker

Reduzir Tamanho da Image

# Usar Alpine (mais leve)
FROM php:8.3-fpm-alpine

# Limpar cache após apt
RUN apk add ... && apk cache clean

# Multi-stage builds para produção
FROM php:8.3-fpm-alpine AS builder
# ... build steps

FROM php:8.3-fpm-alpine
COPY --from=builder /app /app
  

Networking Otimizado

# Use nome de host interno (não localhost)
WORDPRESS_DB_HOST: db  # não db:3306 em network bridge
  

Volume Performance

  • Use volumes Docker (não bind mounts) em produção
  • Bind mounts mais lentos em Mac/Windows (OSXFS issue)
  • Volume driver delegated para desenvolvimento rápido

Troubleshooting Comum

ProblemaCausaSolução
Connection refused na porta 3306MySQL não pronto aindaAguarde ou aumente delay em depends_on
Permission denied /var/www/htmlPropriedade incorreta de arquivosdocker-compose exec wordpress chown -R www-data:www-data /var/www/html
504 Gateway TimeoutPHP lento ou Nginx timeout baixoAumentar fastcgi_read_timeout em nginx/default.conf
Disco cheioVolumes crescendo sem limitedocker system prune -a e monitorar tamanho

Perguntas Frequentes sobre WordPress Docker

Docker é necessário para WordPress profissional?

Não obrigatório, mas recomendado. Docker garante ambiente consistente dev=prod, facilita colaboração em time e escalabilidade. Para agência ou empresa, vale muito a pena.

Posso usar Docker Compose em produção?

Docker Compose é ideal para desenvolvimento e pequenos deploys. Para produção em escala, use Kubernetes ou ECS. Para servidor único, pode usar Docker Compose com swarm mode.

Como fazer CI/CD com Docker e WordPress?

Use GitHub Actions ou GitLab CI para: (1) rodar testes, (2) build image Docker, (3) push registry, (4) deploy. Ferramenta como Deployer automatiza pull/restart.

Devo usar volumes nomeados ou bind mounts?

Volumes Docker = produção, mais rápido. Bind mounts = desenvolvimento local, acesso fácil aos arquivos. Use volumes em prod, bind mounts em dev.

Como escalar múltiplos WordPress containers?

Use orquestradores como Docker Swarm ou Kubernetes. Load balancer distribui tráfego. Database separada (RDS). File storage compartilhado (S3, EFS).

Qual é o custo Docker vs hosting tradicional?

Docker reduz custo: servidor único roda múltiplos containers. Mas requer conhecimento DevOps. VPS barato (~R$25/mês) para um site. Mais sites = Docker + server poderoso economiza.

Conclusão

WordPress com Docker representa a evolução moderna da infraestrutura de aplicações web. Ao containerizar WordPress, você ganha portabilidade, escalabilidade e garantia de que o site roda igual no seu computador, staging e produção.

O setup apresentado neste artigo é production-ready com Nginx, PHP 8.3, MySQL 8.0, security headers, logging, health checks e otimizações de performance. Use como base para seus projetos.

Próximos passos: (1) adicionar CI/CD com GitHub Actions, (2) fazer deploy em DigitalOcean App Platform, (3) implementar Kubernetes para escala. Para mais sobre infraestrutura, confira nossos recursos sobre otimização de WordPress.