{"id":161,"date":"2026-02-17T16:43:55","date_gmt":"2026-02-17T19:43:55","guid":{"rendered":"https:\/\/rdconsolo.com.br\/?p=161"},"modified":"2026-04-07T16:18:45","modified_gmt":"2026-04-07T19:18:45","slug":"docker-wordpress-com-mysql-compartilhado","status":"publish","type":"post","link":"https:\/\/rdconsolo.com.br\/?p=161","title":{"rendered":"Docker WordPress com MySQL compartilhado"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Vantagens desta configura\u00e7\u00e3o<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>MySQL \u00fanico<\/strong>: economiza recursos, mais f\u00e1cil de fazer backup<\/li>\n\n\n\n<li><strong>Isolamento<\/strong>: cada WordPress roda em container separado<\/li>\n\n\n\n<li><strong>Escalabilidade<\/strong>: adicionar novos sites \u00e9 r\u00e1pido<\/li>\n\n\n\n<li><strong>Seguran\u00e7a<\/strong>: containers n\u00e3o expostos diretamente (apenas localhost)<\/li>\n\n\n\n<li><strong>Manuten\u00e7\u00e3o<\/strong>: atualizar WordPress individualmente sem afetar outros<\/li>\n<\/ol>\n\n\n\n<p>Habilite os m\u00f3dulos necess\u00e1rios no Apache:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>a2enmod headers proxy proxy_http rewrite\nsystemctl restart apache2<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. MySQL compartilhado<\/h2>\n\n\n\n<p>Crie <code>\/opt\/mysql\/docker-compose.yml<\/code>:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>services:\n  mysql:\n    image: mysql:8.0\n    container_name: mysql-shared\n    restart: always\n    environment:\n      MYSQL_ROOT_PASSWORD: root_password_forte_aqui\n    volumes:\n      - .\/data:\/var\/lib\/mysql\n    ports:\n      - &quot;127.0.0.1:3306:3306&quot;\n    networks:\n      - shared-network\n\nnetworks:\n  shared-network:\n    name: shared-network\n    driver: bridge<\/code><\/pre><\/div>\n\n\n\n<p>Inicie o MySQL:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>cd \/opt\/mysql\ndocker compose up -d<\/code><\/pre><\/div>\n\n\n\n<p>Crie os bancos de dados para cada site:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>docker exec -it mysql-shared mysql -uroot -p<\/code><\/pre><\/div>\n\n\n\n<p>Dentro do MySQL:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-sql\" data-lang=\"SQL\"><code>CREATE DATABASE site1_wp;\nCREATE DATABASE site2_wp;\nCREATE DATABASE site3_wp;\n\nCREATE USER &#39;site1_user&#39;@&#39;%&#39; IDENTIFIED BY &#39;senha_site1&#39;;\nCREATE USER &#39;site2_user&#39;@&#39;%&#39; IDENTIFIED BY &#39;senha_site2&#39;;\nCREATE USER &#39;site3_user&#39;@&#39;%&#39; IDENTIFIED BY &#39;senha_site3&#39;;\n\nGRANT ALL PRIVILEGES ON site1_wp.* TO &#39;site1_user&#39;@&#39;%&#39;;\nGRANT ALL PRIVILEGES ON site2_wp.* TO &#39;site2_user&#39;@&#39;%&#39;;\nGRANT ALL PRIVILEGES ON site3_wp.* TO &#39;site3_user&#39;@&#39;%&#39;;\n\nFLUSH PRIVILEGES;\nEXIT;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">2. WordPress Site 1<\/h2>\n\n\n\n<p>Crie <code>\/opt\/wordpress\/site1\/docker-compose.yml<\/code>:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>services:\n  wordpress:\n    image: wordpress:latest\n    container_name: wp-site1\n    restart: always\n    ports:\n      - &quot;127.0.0.1:8081:80&quot;\n    environment:\n      WORDPRESS_DB_HOST: mysql-shared:3306\n      WORDPRESS_DB_NAME: site1_wp\n      WORDPRESS_DB_USER: site1_user\n      WORDPRESS_DB_PASSWORD: senha_site1\n    volumes:\n      - .\/html:\/var\/www\/html\n    networks:\n      - shared-network\n\nnetworks:\n  shared-network:\n    external: &lt;strong&gt;true&lt;\/strong&gt;<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>cd \/opt\/wordpress\/site1\ndocker compose up -d<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. WordPress Site 2<\/h2>\n\n\n\n<p>Crie <code>\/opt\/wordpress\/site2\/docker-compose.yml<\/code>:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>services:\n  wordpress:\n    image: wordpress:latest\n    container_name: wp-site2\n    restart: always\n    ports:\n      - &quot;127.0.0.1:8082:80&quot;\n    environment:\n      WORDPRESS_DB_HOST: mysql-shared:3306\n      WORDPRESS_DB_NAME: site2_wp\n      WORDPRESS_DB_USER: site2_user\n      WORDPRESS_DB_PASSWORD: senha_site2\n    volumes:\n      - .\/html:\/var\/www\/html\n    networks:\n      - shared-network\n\nnetworks:\n  shared-network:\n    external: &lt;strong&gt;true&lt;\/strong&gt;<\/code><\/pre><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">cd \/opt\/wordpress\/site2\ndocker compose up -d<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Apache &#8211; VirtualHosts separados<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Site 1: <code>\/etc\/apache2\/sites-available\/site1.conf<\/code><\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>&lt;VirtualHost *:80&gt;\n    ServerName site1.com.br\n    ServerAlias www.site1.com.br\n\n    ProxyPreserveHost On\n    ProxyRequests Off\n\n    ProxyPass        \/ http:\/\/127.0.0.1:8081\/\n    ProxyPassReverse \/ http:\/\/127.0.0.1:8081\/\n\n    RequestHeader set X-Forwarded-Proto &quot;http&quot;\n    RequestHeader set X-Forwarded-Host  &quot;%{HTTP_HOST}e&quot;\n\n    ErrorLog  ${APACHE_LOG_DIR}\/site1_error.log\n    CustomLog ${APACHE_LOG_DIR}\/site1_access.log combined\n&lt;\/VirtualHost&gt;<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Site 2: <code>\/etc\/apache2\/sites-available\/site2.conf<\/code><\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>&lt;VirtualHost *:80&gt;\n    ServerName site2.com.br\n    ServerAlias www.site2.com.br\n\n    ProxyPreserveHost On\n    ProxyRequests Off\n\n    ProxyPass        \/ http:\/\/127.0.0.1:8082\/\n    ProxyPassReverse \/ http:\/\/127.0.0.1:8082\/\n\n    RequestHeader set X-Forwarded-Proto &quot;http&quot;\n    RequestHeader set X-Forwarded-Host  &quot;%{HTTP_HOST}e&quot;\n\n    ErrorLog  ${APACHE_LOG_DIR}\/site2_error.log\n    CustomLog ${APACHE_LOG_DIR}\/site2_access.log combined\n&lt;\/VirtualHost&gt;<\/code><\/pre><\/div>\n\n\n\n<p>Ative os sites:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>a2ensite site1.conf\na2ensite site2.conf\napache2ctl configtest\nsystemctl reload apache2<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">5. SSL para m\u00faltiplos sites<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>certbot --apache -d site1.com.br -d www.site1.com.br\ncertbot --apache -d site2.com.br -d www.site2.com.br<\/code><\/pre><\/div>\n\n\n\n<p>O Certbot ajusta o VirtualHost automaticamente e adiciona o redirect HTTP\u2192HTTPS.<\/p>\n\n\n\n<p>Depois, atualize o <code>RequestHeader<\/code> para HTTPS:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>RequestHeader set X-Forwarded-Proto &quot;https&quot;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">6. Corrigir URLs do WordPress atr\u00e1s de proxy<\/h2>\n\n\n\n<p>No <code>wp-config.php<\/code> (dentro de <code>.\/html\/<\/code>) adicione antes de <code>\/* That's all *\/<\/code>:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>define(&#39;WP_HOME&#39;,    &#39;https:\/\/seudominio.com.br&#39;);\ndefine(&#39;WP_SITEURL&#39;, &#39;https:\/\/seudominio.com.br&#39;);\n\n\/\/ Necess\u00e1rio para que o WordPress reconhe\u00e7a o proxy\nif (isset($_SERVER[&#39;HTTP_X_FORWARDED_PROTO&#39;]) &amp;&amp; $_SERVER[&#39;HTTP_X_FORWARDED_PROTO&#39;] === &#39;https&#39;) {\n    $_SERVER[&#39;HTTPS&#39;] = &#39;on&#39;;\n}<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">7. Verifica\u00e7\u00e3o r\u00e1pida<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># Containers rodando?\ndocker compose ps\n\n# Porta 8080 escutando s\u00f3 no localhost?\nss -tlnp | grep 8080\n\n# Apache do host OK?\nsystemctl status apache2\ncurl -I http:\/\/seudominio.com.br<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Comandos \u00fateis<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># Ver todos os sites rodando\ndocker ps\n\n# Logs de um site espec\u00edfico\ndocker logs wp-site1\n\n# Parar\/iniciar um site\ncd \/opt\/wordpress\/site1\ndocker compose down\ndocker compose up -d\n\n# Backup do MySQL (todos os bancos)\ndocker exec mysql-shared mysqldump -uroot -p --all-databases &gt; backup-$(date +%F).sql<\/code><\/pre><\/div>\n\n\n\n<p>A edi\u00e7\u00e3o dos par\u00e2metros do PHP pode ser feita no arquivo .htaccess. Exemplo:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-php\" data-lang=\"PHP\"><code>php_value upload_max_filesize 64M\nphp_value post_max_size 64M\nphp_value memory_limit 128M\nphp_value max_execution_time 300\nphp_value max_input_time 300<\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vantagens desta configura\u00e7\u00e3o Habilite os m\u00f3dulos necess\u00e1rios no Apache: 1. MySQL compartilhado Crie \/opt\/mysql\/docker-compose.yml: Inicie o MySQL: Crie os bancos de dados para cada site: Dentro do MySQL: 2. WordPress Site 1 Crie \/opt\/wordpress\/site1\/docker-compose.yml: 3. WordPress Site 2 Crie \/opt\/wordpress\/site2\/docker-compose.yml: 4. Apache &#8211; VirtualHosts separados Site 1: \/etc\/apache2\/sites-available\/site1.conf Site 2: \/etc\/apache2\/sites-available\/site2.conf Ative os sites: 5. &hellip; <a href=\"https:\/\/rdconsolo.com.br\/?p=161\" class=\"more-link\">Continue lendo<span class=\"screen-reader-text\"> &#8220;Docker WordPress com MySQL compartilhado&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[17,25,8],"class_list":["post-161","post","type-post","status-publish","format-standard","hentry","category-devops","tag-docker","tag-mysql","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=161"}],"version-history":[{"count":9,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/161\/revisions"}],"predecessor-version":[{"id":191,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/161\/revisions\/191"}],"wp:attachment":[{"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rdconsolo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}