{"id":1284,"date":"2021-07-14T07:11:00","date_gmt":"2021-07-14T10:11:00","guid":{"rendered":"https:\/\/www.erudio.com.br\/blog\/?p=1284"},"modified":"2021-07-06T11:54:48","modified_gmt":"2021-07-06T14:54:48","slug":"configurando-uma-stack-wordpress-com-docker-e-docker-compose","status":"publish","type":"post","link":"https:\/\/www.erudio.com.br\/blog\/configurando-uma-stack-wordpress-com-docker-e-docker-compose\/","title":{"rendered":"Configurando uma stack WordPress com Docker e Docker Compose"},"content":{"rendered":"\n<p>Fala Pessoal beleza!<\/p>\n\n\n\n<p>Nesse post vamos inicializar uma stack <strong>WordPress<\/strong> com um <em>banco de dados<\/em> <strong>MySQL<\/strong> usando o <strong>Docker Compose<\/strong>. Pra isso crie um arquivo chamado <em><strong>docker-compose.yml<\/strong><\/em> (<strong>precisa ser exatamente isso ou n\u00e3o ir\u00e1 funcionar<\/strong>). Dentro dele iremos definir a vers\u00e3o do <strong>docker-compose.yml<\/strong> no nosso exemplo <strong>3.4<\/strong>. Em seguida adicione a propriedade <strong>services<\/strong>. \u00c9 nela que definimos os servi\u00e7os que a nossa stack ter\u00e1, simplificando muuuito podemos dizer que cada servi\u00e7o equivale a um cont\u00eainer. No nosso exemplo teremos os servi\u00e7os <strong>db<\/strong> e <strong>wordpress<\/strong> conforme o c\u00f3digo abaixo. Um detalhe muito importante \u00e9 n\u00e3o usar TABS, se n\u00e3o usarmos apenas espa\u00e7os e formatarmos corretamente o nosso arquivo n\u00e3o ser\u00e1 interpretado corretamente e por consequ\u00eancia n\u00e3o ir\u00e1 executar.<\/p>\n\n\n\n<h4>Definindo servi\u00e7os\/cont\u00eaineres no docker-compose.yml<\/h4>\n\n\n\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n version: '3.4'\n services:\n   db:\n   wordpress:\n<\/pre>\n\n\n\n<p>Agora vamos definir cada um dos nossos servi\u00e7os vamos come\u00e7ar pelo <strong>db<\/strong>. Primeiro vamos escolher a <strong>Docker image<\/strong> a partir da qual o servi\u00e7o\/cont\u00eainer ser\u00e1 inicializado no nosso caso o <strong>mysql:5.7.22<\/strong>. Poder\u00edamos definir apenas <strong>mysql<\/strong> sem uma vers\u00e3o e nesse caso o <strong>Docker Compose<\/strong> ir\u00e1 usar a tag <strong>latest<\/strong> (\u00faltima vers\u00e3o est\u00e1vel da <strong>Docker image<\/strong>). Se quis\u00e9ssemos poder\u00edamos usar qualquer vers\u00e3o do <strong>MySQL<\/strong> como por exemplo <strong>mysql:8.0<\/strong> que o <strong>Docker Compose<\/strong> faria o pull (download) da imagem apropriada. Depois iremos definir uma propriedade <strong>command<\/strong> que funciona de modo similar \u00e0 instru\u00e7\u00e3o <strong>COMMAND<\/strong> do <strong>Dockerfile<\/strong>, para entender mais sobre isso <a href=\"https:\/\/pub.erudio.com.br\/guia-docker\"><strong>baixe o meu e-Book Docker um guia R\u00e1pido<\/strong><\/a>. No nosso exemplo estamos usando o <strong>command<\/strong> para inicializar o <strong>MySQL<\/strong> no modo de autentica\u00e7\u00e3o nativo. Sem isso n\u00e3o conseguir\u00edamos logar no nosso <strong>SGBD MySQL<\/strong>.&nbsp;Em seguida vamos definir atrav\u00e9s de quais portas iremos acessar o <strong>MySQL<\/strong>. No meu caso <strong>3306 no cont\u00eainer e 3308 no host<\/strong>, escolhi a 3308 por que na minha m\u00e1quina eu tenho o <strong>MySQL<\/strong> instalado e se eu deixasse a 3306 ocorreria um conflito de portas.<\/p>\n\n\n\n<p>Por hora vamos manter o <strong>db<\/strong> assim e vamos configurar o servi\u00e7o do <strong>wordpress<\/strong>.&nbsp;Primeiro vamos especificar a <strong>Docker image<\/strong> no nosso caso <strong>wordpress:latest<\/strong>. Mesmo que omit\u00edssemos a TAG a latest seria baixada por padr\u00e3o. Se quis\u00e9ssemos poder\u00edamos especificar uma TAG espec\u00edfica. Em seguida definimos <strong>as portas<\/strong> que no caso ser\u00e1 a <strong>80 tanto no cont\u00eainer quanto no host<\/strong> (minha m\u00e1quina). No mesmo alinhamento de image e ports vamos adicionar uma nova propriedade chamada <strong>depends_on<\/strong>. Essa propriedade indica ao <strong>Docker Compose<\/strong> que o servi\u00e7o do <strong>wordpress<\/strong> depende do servi\u00e7o do <strong>db<\/strong> e por isso ele deve iniciar o <strong>db<\/strong> primeiro.<\/p>\n\n\n\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n version: '3.4'\n services:\n   db:\n     image: mysql:5.7.22\n     command: mysqld --default_authentication_plugin=mysql_native_password\n     ports:\n       - 3308:3306\n   wordpress:\n     image: wordpress:latest\n     ports:\n       - 80:80\n     depends_on:\n       - db\n <\/pre>\n\n\n\n<h4>Conhecendo <strong style=\"font-size: inherit;\">environment<\/strong><span style=\"font-size: inherit;\"> e <\/span><strong style=\"font-size: inherit;\">volumes no Docker Compose<\/strong><\/h4>\n\n\n\n<p><span style=\"font-size: inherit;\">Agora vamos avan\u00e7ar um pouco mais e vamos conhecer as propriedades <\/span><strong style=\"font-size: inherit;\">environment<\/strong><span style=\"font-size: inherit;\"> e <\/span><strong style=\"font-size: inherit;\">volumes<\/strong><span style=\"font-size: inherit;\">. <\/span><strong style=\"font-size: inherit;\">Environment<\/strong><span style=\"font-size: inherit;\"> como o pr\u00f3prio nome diz serve para definirmos valores de <\/span><strong style=\"font-size: inherit;\">vari\u00e1veis de ambiente dentro do cont\u00eainer<\/strong><span style=\"font-size: inherit;\">. A maioria das vari\u00e1veis s\u00e3o auto evidentes, mas algumas merecem uma explica\u00e7\u00e3o especial. A vari\u00e1vel <\/span><strong style=\"font-size: inherit;\">TZ<\/strong><span style=\"font-size: inherit;\"> serve para definirmos o <\/span><strong style=\"font-size: inherit;\">TimeZone<\/strong><span style=\"font-size: inherit;\"> em que o cont\u00eainer est\u00e1 sendo executado. Se voc\u00ea est\u00e1 <\/span><strong style=\"font-size: inherit;\">no Brasil<\/strong><span style=\"font-size: inherit;\"> com exce\u00e7\u00e3o de uns poucos estados seu timezone provavelmente <\/span><strong style=\"font-size: inherit;\">ser\u00e1 America\/Sao_Paulo<\/strong><span style=\"font-size: inherit;\">. A vari\u00e1vel <\/span><strong style=\"font-size: inherit;\">MYSQL_ROOT_PASSWORD<\/strong><span style=\"font-size: inherit;\"> \u00e9 obrigat\u00f3ria e sua stack n\u00e3o ir\u00e1 subir sem ela. Ela <\/span><strong style=\"font-size: inherit;\">\u00e9 usada para definirmos a senha do usu\u00e1rio root<\/strong><span style=\"font-size: inherit;\"> do MySQL. As demais acredito que sejam auto explicativas. Em seguida temos os <\/span><strong style=\"font-size: inherit;\">volumes<\/strong><span style=\"font-size: inherit;\"> que <\/span><strong style=\"font-size: inherit;\">sendo bem simplista<\/strong><span style=\"font-size: inherit;\">, \u00e9 como se fosse um <\/span><strong style=\"font-size: inherit;\">mapeamento de um diret\u00f3rio dentro de um cont\u00eainer com um diret\u00f3rio no host<\/strong><span style=\"font-size: inherit;\">. No nosso caso o servi\u00e7o do <\/span><strong style=\"font-size: inherit;\">MySQL<\/strong><span style=\"font-size: inherit;\"> n\u00e3o tem nenhum volume e o servi\u00e7o do <\/span><strong style=\"font-size: inherit;\">WordPress<\/strong><span style=\"font-size: inherit;\"> tem dois volumes.<\/span><\/p>\n\n\n\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n version: '3.4'\n services:\n   db:\n     image: mysql:5.7.22\n     command: mysqld --default_authentication_plugin=mysql_native_password\n     environment:\n       TZ: America\/Sao_Paulo\n       MYSQL_ROOT_PASSWORD: docker\n       MYSQL_USER: docker\n       MYSQL_PASSWORD: docker\n       MYSQL_DATABASE: wordpress\n     ports:\n       - 3308:3306\n   wordpress:\n     image: wordpress:latest\n     volumes:\n       - .\/config\/php.conf.uploads.ini:\/usr\/local\/etc\/php\/conf.d\/uploads.ini\n       - .\/wp-app:\/var\/www\/html\n     environment:\n       TZ: America\/Sao_Paulo\n       WORDPRESS_DB_HOST: db\n       WORDPRESS_DB_NAME: wordpress\n       WORDPRESS_DB_USER: root\n       WORDPRESS_DB_PASSWORD: docker\n     ports:\n       - 80:80\n <\/pre>\n\n\n\n<h4>Redes no Docker Compose<\/h4>\n\n\n\n<p>Apesar de o <strong>Docker Compose<\/strong> j\u00e1 criar uma rede default entre os cont\u00eaineres\/servi\u00e7os \u00e9 uma boa pr\u00e1tica nomearmos uma rede. Pra isso adicione a propriedade <strong>networks<\/strong> no mesmo alinhamento de services. O nome da nossa rede ser\u00e1 <strong>wordpress-network<\/strong> e ela ser\u00e1 inicializada em modo bridge. Feito isto basta adicionarmos a propriedade <strong>networks<\/strong> em cada servi\u00e7o. Essa propriedade deve ficar no mesmo alinhamento que <strong>ports<\/strong> e <strong>environment<\/strong> e nela podemos definir uma ou mais redes. No nosso caso teremos apenas a rede <strong>wordpress-network<\/strong>.<\/p>\n\n\n\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nversion: '3.4'\nservices:\n  db:\n    image: mysql:5.7.22\n    command: mysqld --default_authentication_plugin=mysql_native_password\n    environment:\n      TZ: America\/Sao_Paulo\n      MYSQL_ROOT_PASSWORD: docker\n      MYSQL_USER: docker\n      MYSQL_PASSWORD: docker\n      MYSQL_DATABASE: wordpress\n    ports:\n      - 3308:3306\n    networks:\n      - wordpress-network\n\n  wordpress:\n    image: wordpress:latest\n    volumes:\n      - .\/config\/php.conf.uploads.ini:\/usr\/local\/etc\/php\/conf.d\/uploads.ini\n      - .\/wp-app:\/var\/www\/html\n    environment:\n      TZ: America\/Sao_Paulo\n      WORDPRESS_DB_HOST: db\n      WORDPRESS_DB_NAME: wordpress\n      WORDPRESS_DB_USER: root\n      WORDPRESS_DB_PASSWORD: docker\n    ports:\n      - 80:80\n    networks:\n      - wordpress-network\n\nnetworks:\n    wordpress-network:\n      driver: bridge\n<\/pre>\n\n\n\n<p>Feito isto toda a nossa <strong>stack<\/strong> est\u00e1 <strong>configurada<\/strong> e j\u00e1 <strong>podemos execut\u00e1-la<\/strong>. E \u00e9 exatamente isso que faremos no pr\u00f3ximo post. E <strong><em>se voc\u00ea quer se tornar<\/em><\/strong> um verdadeiro <em><strong>ninja Docker<\/strong><\/em> e conhecer mais sobre <strong>Docker<\/strong> e <strong>Docker Compose<\/strong> eu recomendo <a href=\"https:\/\/pub.erudio.com.br\/guia-docker\"><strong><em>baixar o meu e-Book gratuito<\/em><\/strong> <strong>Docker um guia R\u00e1pido<\/strong><\/a> e dar uma conferida numa playlist sobre o tema <strong><a href=\"https:\/\/www.youtube.com\/c\/ErudioTraining\/videos\">no meu canal no Youtube<\/a><\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/06\/banner_inscricao_model3.png\" alt=\"Baixe o Guia Docker gr\u00e1tis\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/pub.erudio.com.br\/guia-docker\" target=\"_blank\" rel=\"noopener\"><br><br><\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"Docker para Iniciantes: Minicurso Gratuito Completo!\" src=\"https:\/\/www.youtube.com\/embed\/videoseries?list=PL18bbNo7xuh84zAeNjNejyzd1GASt8Q9x\" width=\"648\" height=\"365\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\">\n\t\t<\/iframe><\/div>\n<\/figure>\n\n\n\n<p><br>Bom por esse post \u00e9 isso a gente se v\u00ea no pr\u00f3ximo post!!!<\/p>\n\n\n\n\n<h2>Treinamentos relacionados com este post<\/h2>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker do 0 \u00e0 Maestria: Cont\u00eaineres Desmistificados mais 3 B\u00d4NUS\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/09-docker.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_docker_para_aws\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Docker para Amazon AWS Implante Apps Java e .NET com Travis CI\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/10-docker-to-aws.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_java\" target=\"_blank\" rel=\"noopener\">\n        <br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0  AWS com Spring Boot 3, Java e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/07-rest-spring-java.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_asp_net\" target=\"_blank\" rel=\"noopener\">\n        <br \/>\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0 Azure com ASP.NET Core 5 e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/01-rest-asp.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_rest_spring_kotlin\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"REST API's RESTFul do 0 \u00e0 AWS com Spring Boot 3, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/18-rest-spring-kotlin.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_microservices_java\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microservices do 0 com Spring Cloud, Spring Boot e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/14-microservices-java.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_microservices-dotnet\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Arquitetura de Microsservi\u00e7os do 0 com ASP.NET, .NET 6 e C#\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/15-microservices-dotnet.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_ms_kotlin\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Microsservi\u00e7os do 0 com Spring Cloud, Kotlin e Docker\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/22-ms-kotlin.png\" \/><br \/>\n    <\/a>\n<\/p>\n<p>\n    <a href=\"https:\/\/pub.erudio.com.br\/kr\/blog_kotlin\" target=\"_blank\" rel=\"noopener\">\n        <img decoding=\"async\" style=\"max-width: 100%;\" title=\"Kotlin para DEVs Java: Aprenda a Linguagem Padr\u00e3o do Android\" src=\"https:\/\/raw.githubusercontent.com\/leandrocgsi\/blog-images\/main\/20-kotlin.png\" \/><br \/>\n    <\/a>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal beleza! Nesse post vamos inicializar uma stack WordPress com um banco de dados MySQL usando o Docker Compose. Pra isso crie um arquivo chamado docker-compose.yml (precisa ser exatamente isso ou n\u00e3o ir\u00e1 funcionar). Dentro dele iremos definir a vers\u00e3o do docker-compose.yml no nosso exemplo 3.4. Em seguida adicione a propriedade services. \u00c9 nela [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1227,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[261,27,260,262,68,266],"tags":[265,151,263,196,267],"_links":{"self":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1284"}],"collection":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1284"}],"version-history":[{"count":52,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1284\/revisions"}],"predecessor-version":[{"id":1415,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1284\/revisions\/1415"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media\/1227"}],"wp:attachment":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}