{"id":49796,"date":"2026-01-19T17:01:46","date_gmt":"2026-01-19T20:01:46","guid":{"rendered":"\/pt\/tutoriais\/docker-tutorial"},"modified":"2026-03-10T12:59:23","modified_gmt":"2026-03-10T15:59:23","slug":"docker-tutorial","status":"publish","type":"post","link":"\/pt\/tutoriais\/docker-tutorial","title":{"rendered":"Docker: tutorial completo para executar containers"},"content":{"rendered":"<p>Docker &eacute; uma plataforma aberta criada para simplificar o desenvolvimento, a distribui&ccedil;&atilde;o e a execu&ccedil;&atilde;o de aplica&ccedil;&otilde;es. Ele torna a entrega de software mais eficiente ao usar a <strong>containeriza&ccedil;&atilde;o<\/strong> &ndash; uma tecnologia que empacota a aplica&ccedil;&atilde;o e todas as suas depend&ecirc;ncias em unidades isoladas e prontas para rodar, chamadas de <strong>containers<\/strong>. Assim, o software se comporta da mesma forma em qualquer ambiente, do computador local ao servidor de produ&ccedil;&atilde;o.<\/p><p>Na pr&aacute;tica, o Docker funciona a partir de alguns conceitos fundamentais: <strong>Docker Engine<\/strong>, <strong>Docker Hub<\/strong>, <strong>imagens<\/strong>, <strong>containers<\/strong>, <strong>Dockerfiles<\/strong> e <strong>Docker Compose<\/strong>. Entender como cada um desses elementos se conecta &eacute; essencial para criar, implantar e gerenciar aplica&ccedil;&otilde;es em containers com mais controle e seguran&ccedil;a.<\/p><p>Voc&ecirc; pode usar o Docker principalmente pela linha de comando (CLI), executando comandos espec&iacute;ficos, mas a plataforma tamb&eacute;m oferece uma vers&atilde;o desktop com interface gr&aacute;fica. O processo de instala&ccedil;&atilde;o muda de acordo com a op&ccedil;&atilde;o escolhida: a vers&atilde;o desktop funciona como um aplicativo comum (<strong>.dmg<\/strong> no macOS ou <strong>.exe<\/strong> no Windows), enquanto a CLI costuma ser instalada por meio de gerenciadores de pacotes, como <strong>APT<\/strong> ou <strong>Homebrew<\/strong>.<\/p><p>Ao trabalhar com o ecossistema Docker, &eacute; normal se deparar com erros em diferentes camadas &ndash; seja na imagem, no Dockerfile ou no pr&oacute;prio container. Como esses problemas podem comprometer todo o ambiente de containeriza&ccedil;&atilde;o, &eacute; importante entender quais s&atilde;o os erros mais comuns, por que eles acontecem e como resolv&ecirc;-los. Vamos abordar esses pontos mais adiante, depois de passar pelos conceitos essenciais deste<strong> <\/strong>tutorial.<\/p><p>\n\n\n\n<\/p><h2 class=\"wp-block-heading\" id=\"h-what-is-containerization\"><strong>O que &eacute; containeriza&ccedil;&atilde;o?<\/strong><\/h2><p>Containeriza&ccedil;&atilde;o &eacute; uma forma de virtualiza&ccedil;&atilde;o em n&iacute;vel de sistema operacional que empacota aplica&ccedil;&otilde;es para rodarem em espa&ccedil;os isolados chamados containers.<\/p><div class=\"wp-block-image\"><figure data-wp-context='{\"imageId\":\"69f42c811c710\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"\/br\/tutoriais\/wp-content\/uploads\/sites\/53\/2026\/01\/uma-visualizacao-de-como-um-container-funciona-em-comparacao-com-uma-maquina-virtual.png\" alt=\"Uma visualiza&ccedil;&atilde;o de como os cont&ecirc;ineres funcionam em compara&ccedil;&atilde;o com as m&aacute;quinas virtuais tradicionais.\" class=\"wp-image-52754\"><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Ampliar\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p>Em termos pr&aacute;ticos, um container re&uacute;ne tudo o que a aplica&ccedil;&atilde;o precisa para funcionar &ndash; c&oacute;digo, bibliotecas do sistema, depend&ecirc;ncias e arquivos de configura&ccedil;&atilde;o &ndash; criando um ambiente isolado e previs&iacute;vel para a execu&ccedil;&atilde;o do software.<\/p><p>Diferentemente das m&aacute;quinas virtuais (VMs), os containers s&atilde;o mais leves porque compartilham o mesmo kernel do sistema operacional do host. Isso reduz o consumo de recursos e elimina a depend&ecirc;ncia de uma infraestrutura espec&iacute;fica, permitindo que a aplica&ccedil;&atilde;o rode da mesma forma em ambientes diferentes.<\/p><p>Os principais benef&iacute;cios da containeriza&ccedil;&atilde;o incluem:<\/p><ul class=\"wp-block-list\">\n<li><strong>Portabilidade.<\/strong> Containers funcionam de forma consistente em qualquer ambiente &ndash; do computador local a um servidor remoto, como os oferecidos pela Hostinger. Isso evita problemas comuns de compatibilidade ao mover aplica&ccedil;&otilde;es entre sistemas ou equipes.<\/li>\n\n\n\n<li><strong>Efici&ecirc;ncia.<\/strong> Enquanto VMs exigem um sistema operacional completo e um hipervisor, os containers n&atilde;o precisam disso. O resultado &eacute; uma virtualiza&ccedil;&atilde;o mais leve, r&aacute;pida e econ&ocirc;mica em recursos.<\/li>\n\n\n\n<li><strong>Isolamento.<\/strong> Cada container executa seus processos de forma isolada, com seu pr&oacute;prio software, configura&ccedil;&otilde;es, rede e vari&aacute;veis de ambiente. Isso aumenta a seguran&ccedil;a e reduz conflitos entre aplica&ccedil;&otilde;es.<\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-why-should-i-use-docker\"><strong>Por que usar Docker?<\/strong><\/h3><p>Voc&ecirc; deve usar <a href=\"\/pt\/tutoriais\/o-que-e-docker\">o Docker<\/a> porque ele oferece uma maneira confi&aacute;vel, eficiente e padronizada de criar, compartilhar e executar aplicativos. Ele resolve diversos problemas reais de desenvolvimento e implanta&ccedil;&atilde;o de software:<\/p><ul class=\"wp-block-list\">\n<li><strong>Funciona em qualquer m&aacute;quina<\/strong> Com Docker, a aplica&ccedil;&atilde;o roda exatamente da mesma forma para todos os desenvolvedores e em todas as etapas do projeto. Isso elimina bugs causados por diferen&ccedil;as de ambiente.<\/li>\n\n\n\n<li><strong>Desenvolvimento e deploy mais r&aacute;pidos.<\/strong> O Docker facilita a cria&ccedil;&atilde;o de ambientes reproduz&iacute;veis. D&aacute; para integrar recursos como mapas ou gateways de pagamento sem precisar configurar tudo do zero, o que acelera o trabalho.<\/li>\n\n\n\n<li><strong>Escalabilidade e portabilidade.<\/strong> Com ferramentas como o Docker Compose, voc&ecirc; define uma aplica&ccedil;&atilde;o completa, com v&aacute;rios containers, em um &uacute;nico arquivo. Isso torna mais f&aacute;cil compartilhar o setup com o time, manter consist&ecirc;ncia e escalar servi&ccedil;os quando necess&aacute;rio.<\/li>\n\n\n\n<li><strong>Uso eficiente de recursos.<\/strong> Como os containers s&atilde;o leves e compartilham o kernel do sistema operacional do host, eles consomem menos recursos do que m&aacute;quinas virtuais tradicionais.<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-what-are-the-core-docker-concepts\"><strong>Quais s&atilde;o os conceitos fundamentais do Docker?<\/strong> <\/h2><p>O Docker organiza a ideia de containeriza&ccedil;&atilde;o em um conjunto de componentes centrais que se conectam entre si. Juntos, esses elementos formam uma plataforma capaz de gerenciar todo o ciclo de vida de uma aplica&ccedil;&atilde;o em containers &ndash; desde a cria&ccedil;&atilde;o da estrutura inicial at&eacute; a execu&ccedil;&atilde;o de aplica&ccedil;&otilde;es completas com v&aacute;rios servi&ccedil;os.<\/p><h3 class=\"wp-block-heading\" id=\"h-docker-engine\"><strong>Docker Engine<\/strong> <\/h3><p>O Docker Engine &eacute; o n&uacute;cleo da tecnologia Docker e a base para criar e executar aplica&ccedil;&otilde;es em containers. Ele funciona com uma arquitetura cliente&ndash;servidor e &eacute; respons&aacute;vel por gerenciar todos os objetos do Docker, como imagens, containers, redes e volumes.<\/p><p>O Docker Engine &eacute; composto por tr&ecirc;s partes principais:<\/p><ol class=\"wp-block-list\">\n<li><strong>Servidor. <\/strong>Um processo em segundo plano (o daemon, chamado dockerd) que cuida das tarefas essenciais, como criar, iniciar e remover containers.<\/li>\n\n\n\n<li><strong>APIs.<\/strong> Interfaces que permitem que outros programas &ndash; incluindo o Docker CLI &ndash; se comuniquem com o daemon e enviem instru&ccedil;&otilde;es.<\/li>\n\n\n\n<li><strong>Cliente CLI.<\/strong> A ferramenta de linha de comando do Docker, que &eacute; a principal forma de intera&ccedil;&atilde;o do usu&aacute;rio com a plataforma.<\/li>\n<\/ol><p>Para facilitar o entendimento, d&aacute; para imaginar o <strong>Docker Engine<\/strong> como um restaurante:<\/p><ul class=\"wp-block-list\">\n<li>O <strong>servidor (dockerd)<\/strong> &eacute; o <strong>chef<\/strong>, respons&aacute;vel por preparar os pratos &ndash; ou seja, executar os containers.<\/li>\n\n\n\n<li>As <strong>APIs<\/strong> funcionam como <strong>o card&aacute;pio e os pedidos<\/strong>, dizendo ao chef o que precisa ser feito.<\/li>\n\n\n\n<li>O <strong>Docker CLI<\/strong> &eacute; o <strong>gar&ccedil;om<\/strong>, que recebe seus comandos e os leva at&eacute; a cozinha.<\/li>\n<\/ul><p>Para verificar se o Docker Engine est&aacute; em execu&ccedil;&atilde;o e se o cliente est&aacute; conectado corretamente, basta rodar um comando simples no terminal, como este:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker ps<\/pre><p>Esse comando pede ao <strong>Docker Daemon<\/strong> que liste <strong>todos os containers em execu&ccedil;&atilde;o no momento<\/strong>. Se o Docker estiver funcionando corretamente, voc&ecirc; ver&aacute; a lista dos containers ativos.<\/p><h3 class=\"wp-block-heading\" id=\"h-docker-hub\"><strong>Docker Hub<\/strong> <\/h3><p><strong>O Docker Hub<\/strong> &eacute; o registro p&uacute;blico padr&atilde;o do Docker &ndash; um servi&ccedil;o de armazenamento e distribui&ccedil;&atilde;o de imagens Docker. Ele hospeda imagens oficiais para softwares populares como <strong>nginx<\/strong>, <strong>node<\/strong> e <strong>python<\/strong>, e permite que os usu&aacute;rios criem reposit&oacute;rios privados para suas imagens personalizadas.<\/p><p>Ao criar um container, voc&ecirc; precisa instalar diversos pacotes de software a partir de imagens. O Docker Hub simplifica o processo, permitindo que voc&ecirc; baixe imagens de um reposit&oacute;rio centralizado.<\/p><p>O Docker Hub usa <strong>tags <\/strong>para rotular e identificar imagens, que denotam uma vers&atilde;o espec&iacute;fica do pacote de software, como <strong>latest<\/strong>. Isso mant&eacute;m a consist&ecirc;ncia e a funcionalidade do cont&ecirc;iner em diferentes ambientes.<\/p><p>Uma boa forma de entender o Docker Hub &eacute; pensar nele como uma <strong>biblioteca comunit&aacute;ria de receitas<\/strong>. Ela guarda receitas prontas de pratos comuns que qualquer pessoa pode baixar e usar. Voc&ecirc; tamb&eacute;m pode adicionar suas pr&oacute;prias receitas &ndash; seja para compartilhar com outros ou manter como backup privado.<\/p><p>Voc&ecirc; pode interagir com o Docker Hub usando o comando Docker. Por exemplo, use o seguinte comando para baixar uma imagem do registro:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull &lt;nome&gt;:&lt;tag&gt;<\/pre><p>Por exemplo, para baixar a imagem oficial mais recente do Ubuntu:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull ubuntu:latest<\/pre><h3 class=\"wp-block-heading\" id=\"h-docker-images\"><strong>Docker images<\/strong><\/h3><p>Uma Docker image &eacute; um modelo somente leitura que cont&eacute;m tudo o que &eacute; necess&aacute;rio para criar um container. Ela inclui o c&oacute;digo da aplica&ccedil;&atilde;o, arquivos de configura&ccedil;&atilde;o, bibliotecas do sistema e at&eacute; os arquivos b&aacute;sicos do sistema operacional usados como base.<\/p><p>As imagens s&atilde;o criadas a partir de um Dockerfile. Cada instru&ccedil;&atilde;o nesse arquivo gera uma camada independente e imut&aacute;vel, que define o que a imagem cont&eacute;m ou executa. Esse modelo em camadas ajuda no reaproveitamento e torna o processo mais eficiente.<\/p><p>De forma simples, a imagem funciona como o projeto de uma m&aacute;quina. Ela descreve exatamente como o ambiente final deve ser, mas n&atilde;o pode ser alterada depois de criada. Quando esse projeto &eacute; usado, o resultado &eacute; um container Docker em execu&ccedil;&atilde;o.<\/p><p>Para listar as imagens que voc&ecirc; j&aacute; tem baixadas localmente, execute:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker images<\/pre><p>J&aacute; o comando abaixo cria uma imagem no diret&oacute;rio atual com base no Dockerfile presente ali. Se a imagem base ainda n&atilde;o estiver no seu sistema, o Docker faz o download automaticamente a partir do Docker Hub:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker build -t nome-da-sua-imagem:latest.<\/pre><p>A melhor pr&aacute;tica ao usar imagens &eacute; utilizar uma <a href=\"https:\/\/docs.docker.com\/build\/building\/base-images\/\" target=\"_blank\" rel=\"noopener\">imagem base<\/a> m&iacute;nima para reduzir o tamanho e minimizar a superf&iacute;cie de ataque potencial, geralmente introduzida por pacotes ou componentes desnecess&aacute;rios.<\/p><h3 class=\"wp-block-heading\" id=\"h-docker-containers\"><strong>Docker containers<\/strong><\/h3><p>Um Docker container &eacute; a inst&acirc;ncia em execu&ccedil;&atilde;o de uma imagem. &Eacute; dentro dele que a aplica&ccedil;&atilde;o roda, junto com suas configura&ccedil;&otilde;es, depend&ecirc;ncias e os pacotes de software necess&aacute;rios para funcionar.<\/p><p>Quando um container &eacute; criado, o Docker adiciona uma camada grav&aacute;vel sobre as camadas somente leitura da imagem. Isso permite fazer altera&ccedil;&otilde;es no sistema de arquivos do container sem modificar a imagem original.<\/p><p>Os containers s&atilde;o pensados para serem tempor&aacute;rios (stateless). Isso significa que podem ser iniciados, parados, removidos e recriados com facilidade, sem grandes ajustes. Containers individuais costumam ser gerenciados via Docker CLI, enquanto ambientes com v&aacute;rios containers s&atilde;o administrados com ferramentas como <strong>Docker Compose<\/strong> ou solu&ccedil;&otilde;es de orquestra&ccedil;&atilde;o, como o Kubernetes.<\/p><p>Seguindo a mesma analogia usada antes, o container &eacute; a m&aacute;quina em funcionamento, constru&iacute;da a partir do projeto (a imagem). Ao criar um container Docker, voc&ecirc; est&aacute; montando e ligando essa m&aacute;quina para executar os processos definidos na imagem.<\/p><p><a href=\"\/pt\/tutoriais\/container-docker\">Para criar um container<\/a> e rodar um comando dentro dele, use o comando run:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -it ubuntu \/bin\/bash<\/pre><p>Esse comando inicia um container a partir da imagem <strong>Ubuntu<\/strong>, abre uma sess&atilde;o interativa e executa o shell <strong>\/bin\/bash<\/strong>.<\/p><h3 class=\"wp-block-heading\" id=\"h-dockerfiles\"><strong>Dockerfiles<\/strong> <\/h3><p>Um <strong>Dockerfile<\/strong> &eacute; um arquivo de texto simples que cont&eacute;m instru&ccedil;&otilde;es passo a passo para criar uma Docker image. Ele define todo o ambiente da aplica&ccedil;&atilde;o &ndash; desde a imagem base do sistema operacional at&eacute; vari&aacute;veis de ambiente, depend&ecirc;ncias e o c&oacute;digo da aplica&ccedil;&atilde;o.<\/p><figure data-wp-context='{\"imageId\":\"69f42c811e154\"}' data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"\/br\/tutoriais\/wp-content\/uploads\/sites\/53\/2026\/01\/um-fluxo-de-construcao-de-um-container-a-partir-de-um-dockerfile-2.png\" alt=\"Um fluxograma que mostra o processo de constru&ccedil;&atilde;o de um cont&ecirc;iner Docker a partir de um Dockerfile.\" class=\"wp-image-52755\"><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Ampliar\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><p>Abaixo est&atilde;o algumas das instru&ccedil;&otilde;es mais comuns em um Dockerfile e para que elas servem:<\/p><ul class=\"wp-block-list\">\n<li><strong>FROM.<\/strong> Define a imagem base usada no in&iacute;cio do build.<\/li>\n\n\n\n<li><strong>RUN.<\/strong> Executa comandos durante o processo de cria&ccedil;&atilde;o da imagem.<\/li>\n\n\n\n<li><strong>COPY<\/strong> ou <strong>ADD.<\/strong> Copia arquivos do contexto de build para dentro da imagem.<\/li>\n\n\n\n<li><strong>CMD<\/strong> ou <strong>ENTRYPOINT.<\/strong> Define o comando executado quando o container &eacute; iniciado.<\/li>\n\n\n\n<li><strong>ENV.<\/strong> Define vari&aacute;veis de ambiente dispon&iacute;veis durante o build e em tempo de execu&ccedil;&atilde;o.<\/li>\n\n\n\n<li><strong>WORKDIR.<\/strong> Define o diret&oacute;rio de trabalho usado pelas instru&ccedil;&otilde;es seguintes, como RUN, CMD, ENTRYPOINT, COPY e ADD.<\/li>\n<\/ul><p>Algumas dessas instru&ccedil;&otilde;es criam <strong>camadas<\/strong> na imagem &ndash; cada camada representa um passo no processo de build. J&aacute; instru&ccedil;&otilde;es voltadas apenas para configura&ccedil;&atilde;o ou metadados, como <strong>WORKDIR<\/strong>, n&atilde;o geram camadas.<\/p><p>Veja abaixo um exemplo simples de Dockerfile:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">FROM python:3.9-slim\nWORKDIR \/app\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\nCOPY . .\nCMD [\"python\", \"app.py\"]<\/pre><h3 class=\"wp-block-heading\" id=\"h-docker-compose\"><strong>Docker Compose<\/strong> <\/h3><p><strong>O Docker Compose<\/strong> &eacute; uma ferramenta que simplifica a defini&ccedil;&atilde;o e o gerenciamento de <strong>aplica&ccedil;&otilde;es com m&uacute;ltiplos cont&ecirc;ineres<\/strong> usando um &uacute;nico arquivo de configura&ccedil;&atilde;o, geralmente chamado <strong>docker-compose.yml<\/strong>.<\/p><p>Nesse arquivo, voc&ecirc; define todos os containers, redes e volumes necess&aacute;rios para montar uma aplica&ccedil;&atilde;o completa. Depois disso, &eacute; poss&iacute;vel iniciar, parar e gerenciar todos os containers &mdash; chamados de services no contexto do Docker Compose &mdash; com apenas um comando.<\/p><p>Sem o Docker Compose, seria necess&aacute;rio configurar cada container manualmente e gerenci&aacute;-los individualmente via Docker CLI. Em aplica&ccedil;&otilde;es formadas por v&aacute;rios servi&ccedil;os interligados, esse processo rapidamente se torna trabalhoso e dif&iacute;cil de manter.<\/p><p>Seguindo a analogia anterior, se um container &eacute; um &uacute;nico eletrodom&eacute;stico, o Docker Compose funciona como o esquema el&eacute;trico de uma cozinha inteira. Ele define como o forno, a geladeira e a torradeira se conectam e s&atilde;o ligados juntos, tudo com um &uacute;nico bot&atilde;o.<\/p><p>Veja abaixo um exemplo de arquivo Docker Compose:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  web:\n    build: .\/web  # Cria a imagem a partir do Dockerfile no diret&oacute;rio .\/web\n    ports:\n      - \"8000:8000\"  # Mapeia a porta 8000 do host para a porta 8000 do container\n    depends_on:\n      - db     # Aguarda o servi&ccedil;o db iniciar\n      - redis  # Aguarda o servi&ccedil;o redis iniciar\n\n  db:\n    image: postgres:15  # Usa a imagem oficial do PostgreSQL 15\n    environment:\n      POSTGRES_USER: myuser\n      POSTGRES_PASSWORD: mypassword\n      POSTGRES_DB: mydb\n    volumes:\n      - db-data:\/var\/lib\/postgresql\/data  # Persiste os dados do banco em um volume nomeado\n\n  redis:\n    image: redis:alpine  # Usa uma imagem leve do Redis para cache\n\nvolumes:\n  db-data:  # Define um volume nomeado para armazenar os dados do banco<\/pre><p>Para construir e iniciar todos os servi&ccedil;os definidos no seu arquivo <strong>docker-compose.yml<\/strong> em segundo plano, execute o comando com a flag <strong>-d<\/strong> ou detached:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose up -d<\/pre><p>Existem outros comandos <strong>do Docker Compose<\/strong> que permitem gerenciar todos os cont&ecirc;ineres simultaneamente ao longo do ciclo de vida da aplica&ccedil;&atilde;o.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-install-docker\"><strong>Como instalar o Docker<\/strong> <\/h2><p>O processo de instala&ccedil;&atilde;o do Docker varia conforme a vers&atilde;o que voc&ecirc; pretende usar. Se optar pelo Docker Desktop, basta baixar o instalador no site oficial e seguir o mesmo procedimento de qualquer outro aplicativo no seu sistema.<\/p><p>Entretanto, voc&ecirc; pode <a href=\"\/pt\/tutoriais\/instalar-docker-ubuntu\">instalar o Docker CLI<\/a> com comandos usando o gerenciador de pacotes do seu sistema, como o APT do Ubuntu ou o Homebrew do macOS. Consulte a documenta&ccedil;&atilde;o oficial para saber mais sobre os comandos para <a href=\"https:\/\/docs.docker.com\/engine\/install\/\" target=\"_blank\" rel=\"noopener\">configurar o Docker<\/a> no seu sistema operacional.<\/p><p>Observe que o Docker CLI n&atilde;o inclui certos recursos, como o Docker Compose, o que significa que voc&ecirc; precisa instal&aacute;-los separadamente. Se voc&ecirc; utiliza a solu&ccedil;&atilde;o <a href=\"\/pt\/docker-hosting\">de hospedagem Docker<\/a> da Hostinger, n&atilde;o precisa configur&aacute;-la separadamente, pois nosso recurso integrado de Gerenciador Docker possui funcionalidade Compose.<\/p><figure class=\"wp-block-image size-large\"><a href=\"\/pt\/alojamento-vps\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/blog.hostinger.io\/pt-tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-1024x300.png\" alt=\"\" class=\"wp-image-32923\" srcset=\"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1.png 1024w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-300x88.png 300w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-150x44.png 150w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-768x225.png 768w, https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-content\/uploads\/sites\/26\/2023\/02\/BR-VPS-hosting_in-text-banner-1-1536x450.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><h3 class=\"wp-block-heading\" id=\"h-understanding-basic-docker-commands\"><strong>Entendendo os comandos b&aacute;sicos do Docker<\/strong> <\/h3><p>Utilize a CLI do Docker para interagir com o Docker Engine e gerenciar seus cont&ecirc;ineres. Aqui est&atilde;o alguns dos <strong>comandos Docker<\/strong> mais essenciais para diferentes tarefas:<\/p><ul class=\"wp-block-list\">\n<li><strong>docker ps -a. <\/strong> <strong><\/strong>Lista todos os cont&ecirc;ineres, incluindo aqueles que est&atilde;o parados.<\/li>\n\n\n\n<li><strong>docker pull &lt;nome&gt;:&lt;tag&gt;. <\/strong>Faz o download de uma imagem do registro para o seu computador.<\/li>\n\n\n\n<li><strong>docker rmi &lt;imagem&gt;. <\/strong>Exclui uma imagem local.<\/li>\n\n\n\n<li><strong>docker stop &lt;container&gt;. <\/strong>Interrompe corretamente um cont&ecirc;iner em execu&ccedil;&atilde;o.<\/li>\n\n\n\n<li><strong>docker rm &lt;container&gt;. <\/strong>Exclui um cont&ecirc;iner.<\/li>\n<\/ul><p>Para obter uma refer&ecirc;ncia completa dos comandos mais usados para imagens, cont&ecirc;ineres, volumes e muito mais, confira nosso <a href=\"\/pt\/tutoriais\/docker-cheat-sheet\">guia de refer&ecirc;ncia r&aacute;pida do Docker<\/a>.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-manage-docker-volumes\"><strong>Como gerenciar volumes do Docker<\/strong> <\/h2><p>Os <strong>volumes<\/strong> s&atilde;o o principal mecanismo do Docker para garantir persist&ecirc;ncia de dados. Eles permitem que as informa&ccedil;&otilde;es continuem dispon&iacute;veis mesmo depois que um container &eacute; removido.<\/p><p>Isso &eacute; essencial porque, ao longo do ciclo de vida de uma aplica&ccedil;&atilde;o, &eacute; comum parar, recriar ou substituir containers para atualiza&ccedil;&otilde;es e manuten&ccedil;&atilde;o. Se o container executa algo cr&iacute;tico, como um banco de dados, configurar volumes corretamente &eacute; indispens&aacute;vel para n&atilde;o perder dados.<\/p><p>O Docker oferece tr&ecirc;s tipos principais de armazenamento:<\/p><ul class=\"wp-block-list\">\n<li><strong>Volumes.<\/strong> Armazenam dados persistentes em uma &aacute;rea gerenciada pelo Docker, geralmente localizada em \/var\/lib\/docker\/volumes\/ no host.<\/li>\n\n\n\n<li><strong>Bind mounts.<\/strong> Mapeiam diretamente um arquivo ou diret&oacute;rio do sistema host para dentro do container.<\/li>\n\n\n\n<li><strong>tmpfs mounts.<\/strong> Mant&ecirc;m os dados na mem&oacute;ria do host; tudo &eacute; perdido quando o container &eacute; interrompido.<\/li>\n<\/ul><p>A seguir est&atilde;o os passos b&aacute;sicos para criar e gerenciar um volume persistente:<\/p><ol class=\"wp-block-list\">\n<li>Crie um volume nomeado usando o seguinte comando. Por exemplo, isso criar&aacute; um volume chamado <strong>my-database-data:<\/strong> <\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker volume create my-database-data<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Inicie o container usando o volume. Use a flag <strong>-v <\/strong>para mapear o volume para o diret&oacute;rio interno onde os dados ser&atilde;o armazenados:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \n  --name my-database \n  -e MYSQL_ROOT_PASSWORD=senhasegura \n  -v my-database-data:\/var\/lib\/mysql \n  mysql:latest<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>Para verificar os detalhes e a localiza&ccedil;&atilde;o do volume no host, execute o seguinte comando:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker volume inspect my-database-data<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Para remover volumes n&atilde;o utilizados que n&atilde;o estejam associados a nenhum cont&ecirc;iner e liberar espa&ccedil;o em disco, utilize:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker volume prune -a<\/pre><p>Em vez de usar comandos, voc&ecirc; tamb&eacute;m pode declarar e montar volumes diretamente no arquivo YAML do Docker Compose. Isso facilita o controle de quais volumes cada servi&ccedil;o utiliza, especialmente em aplica&ccedil;&otilde;es com m&uacute;ltiplos containers.<\/p><p>Por exemplo, o arquivo abaixo recria o mesmo cen&aacute;rio usando Docker Compose:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  my-database:\n    image: mysql:latest\n    container_name: my-database\n    environment:\n      MYSQL_ROOT_PASSWORD: securepassword\n    volumes:\n      - my-database-data:\/var\/lib\/mysql\n\nvolumes:\n  my-database-data:<\/pre><h2 class=\"wp-block-heading\" id=\"h-how-to-create-a-docker-network\"><strong>Como criar uma rede Docker<\/strong> <\/h2><p>As redes do Docker garantem isolamento entre containers e permitem a comunica&ccedil;&atilde;o tanto entre servi&ccedil;os quanto com sistemas externos. Por padr&atilde;o, todo container &eacute; conectado a uma <strong>rede do tipo bridge<\/strong>. No entanto, para aplica&ccedil;&otilde;es com v&aacute;rios servi&ccedil;os, o ideal &eacute; criar uma bridge personalizada.<\/p><p>O Docker usa redes para permitir que containers conversem entre si e com o ambiente externo. Quando voc&ecirc; inicia um container sem nenhuma configura&ccedil;&atilde;o extra, ele &eacute; conectado &agrave; <strong>default bridge network<\/strong>, que permite comunica&ccedil;&atilde;o b&aacute;sica com o host. O problema &eacute; que essa rede padr&atilde;o tem recursos limitados e n&atilde;o funciona bem em cen&aacute;rios com m&uacute;ltiplos containers interdependentes.<\/p><p>Em aplica&ccedil;&otilde;es com v&aacute;rios servi&ccedil;os, a boa pr&aacute;tica &eacute; criar uma rede bridge definida pelo usu&aacute;rio. Esse tipo de rede permite que os containers se comuniquem usando o nome do servi&ccedil;o, o que facilita a descoberta entre eles, melhora o controle da comunica&ccedil;&atilde;o e reduz interfer&ecirc;ncias entre aplica&ccedil;&otilde;es.<\/p><p>A forma mais simples de usar uma rede personalizada &eacute; declar&aacute;-la diretamente no arquivo YAML do Docker Compose, usando a diretiva <strong>networks<\/strong>. Veja um exemplo:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  my-database:\n    image: mysql:latest\n    container_name: my-database\n    environment:\n      MYSQL_ROOT_PASSWORD: senhasegura\n    volumes:\n      - my-database-data:\/var\/lib\/mysql\n    networks:\n      - my-app-network  # rede criada para a aplica&ccedil;&atilde;o<\/pre><p>Outra op&ccedil;&atilde;o &eacute; criar a rede manualmente via Docker CLI. O comando abaixo cria uma rede bridge chamada <strong>my-app-network<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker network create my-app-network<\/pre><p>Depois disso, voc&ecirc; pode iniciar um container e conect&aacute;-lo a essa rede usando a flag <strong>&ndash;network<\/strong>. O exemplo abaixo tamb&eacute;m define o nome do servi&ccedil;o com <strong>&ndash;name<\/strong>:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \n  --name my-database \n  --network my-app-network \n  -e MYSQL_ROOT_PASSWORD=senhasegura \n  -v my-database-data:\/var\/lib\/mysql \n  mysql:latest<\/pre><p>Para adicionar outro container &agrave; mesma rede, basta repetir o processo com os ajustes necess&aacute;rios. No exemplo a seguir, a flag <strong>-p <\/strong>publica a porta interna <strong>80<\/strong> do container na porta <strong>8080<\/strong> do host, permitindo acesso externo:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \n  --name my-webapp \n  --network my-app-network \n  -p 8080:80 \n  my-web-app-image:latest<\/pre><h2 class=\"wp-block-heading\" id=\"h-troubleshooting-common-docker-issues\"><strong>Solucionando problemas comuns do Docker<\/strong><\/h2><p>Ao trabalhar com Docker, os pontos de falha mais comuns costumam estar ligados ao sistema em camadas da plataforma &mdash; imagens, containers, volumes e redes. A seguir, voc&ecirc; vai ver alguns problemas recorrentes e o que fazer para resolv&ecirc;-los.<\/p><h3 class=\"wp-block-heading\" id=\"h-container-exits-immediately\"><strong>O container encerra imediatamente<\/strong><\/h3><p>Um container pode parar logo ap&oacute;s ser iniciado quando o processo principal, definido por <strong>CMD<\/strong> ou <strong>ENTRYPOINT<\/strong> no Dockerfile, termina a execu&ccedil;&atilde;o ou falha. Isso acontece com frequ&ecirc;ncia quando o Docker tenta rodar um servi&ccedil;o que deveria permanecer ativo sem usar o modo detached.<\/p><p>Veja algumas formas de solucionar esse problema:<\/p><ul class=\"wp-block-list\">\n<li><strong>Verifique os logs.<\/strong> Use <strong>docker logs &lt;nome_do_container&gt;<\/strong> para analisar as sa&iacute;das padr&atilde;o (<strong>stdout<\/strong> e <strong>stderr<\/strong>) e identificar a causa do encerramento.<\/li>\n\n\n\n<li><strong>Revise o Dockerfile.<\/strong> Confirme se o arquivo cont&eacute;m as diretivas <strong>CMD<\/strong> ou <strong>ENTRYPOINT<\/strong> e se elas iniciam um processo de longa dura&ccedil;&atilde;o. Um servidor web, por exemplo, precisa continuar rodando para atender requisi&ccedil;&otilde;es.<\/li>\n\n\n\n<li><strong>Use o modo detached.<\/strong> Se a aplica&ccedil;&atilde;o deve rodar em segundo plano, execute o container com a flag <strong>-d<\/strong> ou <strong>&ndash;detach<\/strong> ao usar <strong>docker run<\/strong> ou <strong>docker compose run<\/strong>.<\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-image-layer-caching-issues\"><strong>Problemas com cache de camadas de imagem<\/strong><\/h3><p>Se mudan&ccedil;as no Dockerfile &mdash; como a atualiza&ccedil;&atilde;o de um pacote &mdash; n&atilde;o parecem surtir efeito, &eacute; bem prov&aacute;vel que voc&ecirc; esteja lidando com o cache de camadas do Docker. Esse mecanismo reaproveita camadas j&aacute; constru&iacute;das para acelerar o processo de build, em vez de recriar tudo do zero.<\/p><p>Isso melhora o desempenho, mas pode causar confus&atilde;o quando altera&ccedil;&otilde;es s&atilde;o feitas nas primeiras instru&ccedil;&otilde;es do Dockerfile. Nesses casos, o Docker pode reutilizar camadas antigas, fazendo com que etapas posteriores usem vers&otilde;es desatualizadas, mesmo ap&oacute;s a modifica&ccedil;&atilde;o do arquivo.<\/p><p>A solu&ccedil;&atilde;o mais simples para esse problema &eacute; for&ccedil;ar uma reconstru&ccedil;&atilde;o completa e ignorar o cache de camadas. Fa&ccedil;a isso adicionando o <strong>par&acirc;metro &ndash;no-cache. <\/strong>op&ccedil;&atilde;o ao iniciar o processo de compila&ccedil;&atilde;o, como neste comando:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker build --no-cache -t my-app:latest .<\/pre><p>Ao instalar pacotes usando um Dockerfile, inclua tamb&eacute;m explicitamente um comando que impe&ccedil;a o gerenciador de pacotes de reutilizar camadas antigas com listas de pacotes desatualizadas. Em distribui&ccedil;&otilde;es baseadas em Debian, voc&ecirc; pode fazer isso combinando <strong>`apt-get update`<\/strong> e <strong>`apt-get install -y &ndash;no-install-recommend`<\/strong> no mesmo <strong>comando RUN. <\/strong>declara&ccedil;&atilde;o como esta:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends<\/pre><h3 class=\"wp-block-heading\" id=\"h-registry-authentication-failure\"><strong>Falha de autentica&ccedil;&atilde;o no registry<\/strong><\/h3><p>Se ao enviar uma imagem para um registry &mdash; como o Docker Hub &mdash; voc&ecirc; receber um erro do tipo <strong>&ldquo;denied: requested access to the resource is denied&rdquo;<\/strong>, isso indica que o Docker CLI n&atilde;o est&aacute; autenticado no servidor do registry.<\/p><p>Para resolver, &eacute; preciso fazer login e autenticar sua conta. Siga os passos abaixo:<\/p><ol class=\"wp-block-list\">\n<li>Fa&ccedil;a login no registro usando o seguinte comando, sendo <strong>my-registry-example.com<\/strong> o endere&ccedil;o real do registro. Se voc&ecirc; quiser enviar imagens para o Docker Hub, pode omitir o endere&ccedil;o:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker login my-registry.example.com<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Digite seu nome de usu&aacute;rio e senha quando solicitado. <\/li>\n\n\n\n<li>Antes de enviar a imagem, marque-a corretamente com o host do registro, o reposit&oacute;rio e a tag usando este comando:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker tag my-local-image:latest my-registry.example.com\/my-repo\/my-local-image:latest<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Envie a imagem para o registro executando este comando:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker push my-registry.example.com\/my-repo\/my-local-image:latest<\/pre><h2 class=\"wp-block-heading\" id=\"h-what-are-the-next-steps-to-master-docker\"><strong>Quais s&atilde;o os pr&oacute;ximos passos para dominar o Docker?<\/strong> <\/h2><p>Para realmente dominar o Docker e us&aacute;-lo em cen&aacute;rios reais de produ&ccedil;&atilde;o, &eacute; preciso ir al&eacute;m do uso de um &uacute;nico container e de comandos b&aacute;sicos. Os pr&oacute;ximos passos envolvem aprender t&eacute;cnicas mais avan&ccedil;adas para implantar e gerenciar aplica&ccedil;&otilde;es complexas, escal&aacute;veis e com alta disponibilidade.<\/p><p>Al&eacute;m do <strong>Docker Compose<\/strong>, vale aprofundar o estudo em ferramentas de <strong>orquestra&ccedil;&atilde;o<\/strong>, como <strong>Docker Swarm<\/strong> e <strong>Kubernetes<\/strong>. Elas permitem gerenciar v&aacute;rios containers distribu&iacute;dos em um cluster de m&aacute;quinas, facilitando o balanceamento de carga, a escalabilidade e a automa&ccedil;&atilde;o do deploy.<\/p><p>Outro ponto importante &eacute; entender melhor os <strong>drivers de rede<\/strong> do Docker. Um exemplo &eacute; o <strong>Overlay Network Driver<\/strong>, usado no modo Swarm para conectar containers que rodam em hosts diferentes. Fazer essa conex&atilde;o manualmente com a rede padr&atilde;o do Docker &eacute; complexo, enquanto as redes overlay simplificam e automatizam a comunica&ccedil;&atilde;o entre m&aacute;quinas de forma confi&aacute;vel.<\/p><p>Por fim, explore diferentes casos de uso do Docker. Ver exemplos pr&aacute;ticos ajuda a entender como aplicar a containeriza&ccedil;&atilde;o em tarefas reais de desenvolvimento e implanta&ccedil;&atilde;o, al&eacute;m de mostrar como essa ferramenta se encaixa em fluxos modernos de trabalho.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker &eacute; uma plataforma aberta criada para simplificar o desenvolvimento, a distribui&ccedil;&atilde;o e a execu&ccedil;&atilde;o de aplica&ccedil;&otilde;es. Ele torna a entrega de software mais eficiente ao usar a containeriza&ccedil;&atilde;o &ndash; uma tecnologia que empacota a aplica&ccedil;&atilde;o e todas as suas depend&ecirc;ncias em unidades isoladas e prontas para rodar, chamadas de containers. Assim, o software se [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/pt\/tutoriais\/docker-tutorial\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":356,"featured_media":49797,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"rank_math_title":"","rank_math_description":"Aprenda Docker do zero e avance para produ\u00e7\u00e3o: containers, imagens, redes, volumes e boas pr\u00e1ticas para rodar aplica\u00e7\u00f5es com confian\u00e7a.","rank_math_focus_keyword":"docker tutorial","footnotes":""},"categories":[4915],"tags":[],"class_list":["post-49796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vps"],"hreflangs":[{"locale":"pt-BR","link":"https:\/\/www.hostinger.com\/br\/tutoriais\/docker-tutorial","default":1},{"locale":"pt-PT","link":"https:\/\/www.hostinger.com\/pt\/tutoriais\/docker-tutorial","default":0}],"acf":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts\/49796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/users\/356"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/comments?post=49796"}],"version-history":[{"count":0,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/posts\/49796\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/media\/49797"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/media?parent=49796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/categories?post=49796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/pt\/tutoriais\/wp-json\/wp\/v2\/tags?post=49796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}