Como instalar WordPress em VPS com Docker

Instalar WordPress em VPS com Docker é a forma mais prática de ter controle total sobre o seu site: você define os recursos, gerencia as atualizações e paga apenas pela VPS. A stack mínima precisa de três serviços, WordPress (PHP-FPM), MariaDB e Nginx (proxy reverso), configurados em um único docker-compose.yml.

Pré-requisitos

Você precisa de uma VPS com Ubuntu 22.04+, Docker instalado e um domínio apontando para o IP da VPS. Confirme que o ambiente está pronto:

bash
docker --version          # 24.x ou superior
docker compose version    # v2.x ou superior
# Porta 80 e 443 liberadas no firewall
ufw allow 80 && ufw allow 443

docker-compose.yml completo para WordPress

Crie o diretório /opt/wordpress e salve o arquivo abaixo. A stack usa PHP-FPM (mais leve que a imagem Apache) e volumes nomeados para persistência:

yaml
services:
  db:
    image: mariadb:11
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    image: wordpress:6-php8.3-fpm-alpine
    restart: always
    depends_on:
      db:
        condition: service_healthy
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html

  nginx:
    image: nginx:alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - wp_data:/var/www/html:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - certbot_conf:/etc/letsencrypt
      - certbot_www:/var/www/certbot
    depends_on:
      - wordpress

  certbot:
    image: certbot/certbot
    volumes:
      - certbot_conf:/etc/letsencrypt
      - certbot_www:/var/www/certbot

volumes:
  db_data:
  wp_data:
  certbot_conf:
  certbot_www:

Configuração do Nginx

Crie o arquivo nginx.conf para proxy reverso com suporte a PHP-FPM. Primeiro em HTTP para o desafio do Certbot, depois adicione HTTPS:

nginx
server {
    listen 80;
    server_name seudominio.com.br www.seudominio.com.br;
    root /var/www/html;
    index index.php;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    client_max_body_size 64M;
}

Subir e gerar o certificado SSL

Com os arquivos prontos, suba o stack e gere o certificado Let's Encrypt:

bash
cd /opt/wordpress

# Subir todos os containers
docker compose up -d

# Aguardar containers ficarem saudáveis
docker compose ps

# Gerar certificado SSL
docker compose run --rm certbot certonly \
  --webroot --webroot-path=/var/www/certbot \
  --email seu@email.com --agree-tos --no-eff-email \
  -d seudominio.com.br -d www.seudominio.com.br

Renovação automática do certificado

Certificados Let's Encrypt expiram em 90 dias. Configure um cron para renovar automaticamente:

bash
# Adicionar ao crontab do root (crontab -e)
0 3 * * * cd /opt/wordpress && docker compose run --rm certbot renew --quiet && docker compose exec nginx nginx -s reload

Não quer configurar manualmente?

Implante o WordPress em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

WordPress.com é SaaS com limitações de plugins e temas. WordPress self-hosted (wordpress.org) roda no seu servidor, você instala qualquer plugin/tema, acessa o banco diretamente e tem controle total. Na VPS, o custo é apenas o servidor sem taxas por domínio ou plugins premium.

Para site simples: 1 GB é suficiente. Com WooCommerce ou tráfego moderado: 2 GB recomendados. O MariaDB consome 200–400 MB, o PHP-FPM cresce com tráfego. Com múltiplos sites: 4 GB+.

Backup completo requer dois componentes: dump do banco (docker compose exec db mysqldump -u wp -psenha wordpress > backup.sql) e os arquivos do WordPress (docker run --rm -v wordpress_wp_data:/data -v $(pwd):/out alpine tar czf /out/wp-files.tar.gz /data). Automatize com cron e envie para S3 ou outro armazenamento remoto.

Pelo painel /wp-admin é o jeito mais simples. Via linha de comando use WP-CLI: docker compose exec wordpress wp plugin install nome-do-plugin --activate --allow-root.

Os ganhos mais rápidos são: ativar OPcache PHP, adicionar Redis Object Cache e habilitar gzip no Nginx. Veja o artigo dedicado sobre WordPress lento na VPS com os passos detalhados.