{"id":1201,"date":"2021-07-07T07:00:00","date_gmt":"2021-07-07T10:00:00","guid":{"rendered":"https:\/\/www.erudio.com.br\/blog\/?p=1201"},"modified":"2021-07-01T09:30:09","modified_gmt":"2021-07-01T12:30:09","slug":"o-que-e-o-docker-compose","status":"publish","type":"post","link":"https:\/\/www.erudio.com.br\/blog\/o-que-e-o-docker-compose\/","title":{"rendered":"O que \u00e9 o Docker Compose?"},"content":{"rendered":"\n<p>Faaala pessoal beleza!<br>Nesse post vamos aprender o que \u00e9 o <strong>Docker Compose<\/strong>. Apesar de ser poss\u00edvel e relativamente simples conectarmos dois <strong>cont\u00eaineres Docke<\/strong>r atrav\u00e9s da linha de comando usando o comando <strong><em>docker run<\/em><\/strong> quando tentamos aplicar esses conceitos \u00e0 infraestruturas de cont\u00eaineres mais complexas isso tende a se tornar dif\u00edcil de manter. Especialmente por que precisamos subir cada um dos cont\u00eaineres em uma ordem predefinida. Caso essa ordem n\u00e3o seja corretamente executada haver\u00e3o falhas de comunica\u00e7\u00e3o.<\/p>\n\n\n\n<p>Esse \u00e9 o primeiro de uma s\u00e9rie de posts e nela n\u00f3s iremos inicializar um<strong> blog com WordPress<\/strong> e como voc\u00eas devem saber o <strong>WordPress<\/strong> precisa de um banco de dados <strong>MySQL<\/strong>. Logo precisaremos subir dois cont\u00eaineres um com o <strong>WordPress<\/strong> e outro com o <strong>banco de dados<\/strong> que ele ir\u00e1 usar. Poder\u00edamos perfeitamente adotar a estrat\u00e9gia de &#8220;lincar&#8221; <strong>cont\u00eaineres<\/strong> criando um <strong>source e um receiver<\/strong>. Mas eles n\u00e3o teriam uma comunica\u00e7\u00e3o autom\u00e1tica entre si. Cada cont\u00eainer \u00e9 por padr\u00e3o um processo isolado e por isso n\u00e3o possuem nenhuma comunica\u00e7\u00e3o um com o outro.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"830\" height=\"723\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose.png\" alt=\"Comunica\u00e7\u00e3o Cont\u00eaineres Docker\" class=\"wp-image-1212\" srcset=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose.png 830w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose-300x261.png 300w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose-768x669.png 768w\" sizes=\"(max-width: 830px) 100vw, 830px\" \/><\/figure>\n\n\n\n<p>Para garantirmos que haja algum tipo de comunica\u00e7\u00e3o entre o <strong>WordPress e o MySQL<\/strong> n\u00f3s precisamos definir alguma infraestrutura entre os dois. Atualmente n\u00f3s podemos fazer isso de duas formas. Podemos <em><strong>configurar tudo manualmente via Docker Client na linha de comando<\/strong><\/em> ou podemos <em><strong>usar o Docker Compose<\/strong><\/em>.<br>Com a primeira abordagem n\u00f3s precisaremos executar v\u00e1rios comandos em uma ordem espec\u00edfica e montar essa infraestrutura. Toda vez que precisarmos fazer isso precisaremos repetir esses mesmos comandos. E sinceramente quando o <strong>Docker<\/strong> surgiu as pessoas podem at\u00e9 ter feito isso mas atualmente acredito que ningu\u00e9m mais faz isso.<br>Normalmente eles usam uma ferramenta intermedi\u00e1ria pra fazer isso, no caso o <strong>Docker Compose.<\/strong><\/p>\n\n\n\n<p>O <strong>Docker Compose<\/strong> \u00e9 uma ferramenta separada do <strong>Docker<\/strong>. Em ambientes <strong>Linux<\/strong> voc\u00ea instala essa ferramenta separadamente j\u00e1 no <strong>Windows<\/strong> o <strong>Docker Desktop<\/strong> j\u00e1 traz ela e o <strong><em>Kubernetes<\/em><\/strong> por padr\u00e3o.<\/p>\n\n\n\n<p>Quando estamos come\u00e7ando a conhecer o <strong>Docker Compose<\/strong> \u00e9 meio confuso e voc\u00ea vai ficar na d\u00favida sobre quem est\u00e1 fazendo o qu\u00ea. Sempre vai bater a d\u00favida se \u00e9 o <strong>Docker Compose<\/strong> ou o <strong>Docker Client<\/strong> que est\u00e1 sendo executado. E eu posso te dizer que no fim das contas sempre \u00e9 o <strong>Docker Client<\/strong> \u00e0s vezes invocado diretamente e \u00e0s vezes pelo <strong>Docker Compose. <\/strong>Na verdade, <strong>o Docker Compose<\/strong> \u00e9 uma abstra\u00e7\u00e3o sobre <strong>o Docker Client<\/strong> que pode ser instalado junto com o <strong>Docker<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"338\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/abstracao_comando_docker_compose-1024x338.png\" alt=\"\" class=\"wp-image-1215\" srcset=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/abstracao_comando_docker_compose-1024x338.png 1024w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/abstracao_comando_docker_compose-300x99.png 300w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/abstracao_comando_docker_compose-768x253.png 768w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/abstracao_comando_docker_compose-1536x507.png 1536w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/abstracao_comando_docker_compose.png 1970w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Como vimos ele <em><strong>\u00e9 usado para inicializar m\u00faltiplos cont\u00eaineres Docker simultaneamente<\/strong><\/em>. Al\u00e9m disso ele automatiza e como podemos ver na imagem acima abstrai os comandos que n\u00f3s usamos no <strong>Docker Client<\/strong>. Mas o seu prop\u00f3sito vai al\u00e9m disso e visa principalmente <strong>facilitar a inicializa\u00e7\u00e3o de m\u00faltiplos cont\u00eaineres simultaneamente<\/strong> e prover comunica\u00e7\u00e3o entre eles de forma autom\u00e1tica. Na pr\u00e1tica o Docker Compose pega os comandos do Docker e abstrai todos eles em um arquivo de configura\u00e7\u00e3o no diret\u00f3rio do nosso projeto chamado <em><strong>docker-compose.yml<\/strong><\/em>. N\u00e3o \u00e9 simplesmente copiar esses comandos no arquivo como um script. Na verdade, todos esses comandos s\u00e3o simplificados e ganham uma nova sintaxe bem mais simples (veremos isso melhor em posts futuros). Quando criamos esse arquivo dizemos ao <strong>Docker Client<\/strong> como proceder. Ele ir\u00e1 processar esse arquivo e criar todos os diferentes cont\u00eaineres de acordo com cada uma das especifica\u00e7\u00f5es definidas nele.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"788\" height=\"1024\" src=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose2-788x1024.png\" alt=\"\" class=\"wp-image-1213\" srcset=\"https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose2-788x1024.png 788w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose2-231x300.png 231w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose2-768x997.png 768w, https:\/\/www.erudio.com.br\/blog\/wp-content\/uploads\/2021\/07\/arquitetura_docker_compose2.png 830w\" sizes=\"(max-width: 788px) 100vw, 788px\" \/><\/figure>\n\n\n\n<p>Na verdade, a estrutura do arquivo<strong> docker-compose.yml<\/strong> pode parecer complexa a princ\u00edpio, mas funciona mais ou menos assim. O diagrama acima mostra essencialmente como ser\u00e1 o nosso arquivo<strong> docker-compose.yml<\/strong>. No nosso exemplo \u00e9 como se diss\u00e9ssemos ao <strong>Docker Compose<\/strong> crie dois cont\u00eaineres pra mim um com o <strong>WordPress<\/strong> e outro com o <strong>MySQL<\/strong>. Cada um desses cont\u00eaineres \u00e9 chamado de <strong>service<\/strong> no <strong>Docker Compose<\/strong> falarei sobre isso melhor nos pr\u00f3ximos posts. E n\u00f3s definimos todos os detalhes sobre eles como qual <strong>base image<\/strong> usada, quais portas ser\u00e3o expostas, os <strong>volumes<\/strong> a serem montados, as vari\u00e1veis de ambiente coisas do tipo.<\/p>\n\n\n\n<p>A princ\u00edpio isso pode parecer bem estranho, mas na pr\u00e1tica \u00e9 bem mais simples do que parece. E se voc\u00ea quer conhecer mais sobre <strong>Docker <\/strong>e <strong>Docker Compose<\/strong> eu recomendo baixar <em>o meu e-Book gratuito<\/em> <strong>Docker um guia R\u00e1pido<\/strong> e dar uma conferida numa playlist sobre o tema no meu canal no Youtube.<\/p>\n\n\n<p><a href=\"https:\/\/pub.erudio.com.br\/guia-docker\" target=\"_blank\" rel=\"noopener\"><br \/><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\" \/><br \/><\/a><\/p>\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\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Docker para Iniciantes: Minicurso Gratuito Completo!\" width=\"648\" height=\"365\" src=\"https:\/\/www.youtube.com\/embed\/videoseries?list=PL18bbNo7xuh84zAeNjNejyzd1GASt8Q9x\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Bom por esse post \u00e9 isso no pr\u00f3ximo instalaremos o <strong>Docker Compose<\/strong> e vamos come\u00e7ar a entender tudo isso em detalhes. A gente se v\u00ea no pr\u00f3ximo post!!!<\/p>\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>Faaala pessoal beleza!Nesse post vamos aprender o que \u00e9 o Docker Compose. Apesar de ser poss\u00edvel e relativamente simples conectarmos dois cont\u00eaineres Docker atrav\u00e9s da linha de comando usando o comando docker run quando tentamos aplicar esses conceitos \u00e0 infraestruturas de cont\u00eaineres mais complexas isso tende a se tornar dif\u00edcil de manter. Especialmente por que [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1218,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[261,27,260,262],"tags":[265,151,263,264],"_links":{"self":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1201"}],"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=1201"}],"version-history":[{"count":13,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1201\/revisions"}],"predecessor-version":[{"id":1221,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/posts\/1201\/revisions\/1221"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media\/1218"}],"wp:attachment":[{"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erudio.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}