<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Docker - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Docker - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 19 May 2026 20:02:32 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/docker/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Docker simplificado: um guia prático para quem está iniciando ]]>
                </title>
                <description>
                    <![CDATA[ Caso você esteja planejando iniciar sua carreira em DevOps (ou mesmo se já estiver nela), se você já não tem o Docker em seu currículo, sem dúvida é hora de pensar nele, pois é uma das habilidades fundamentais para qualquer um que esteja na área de DevOps. Neste artigo, vou ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/</link>
                <guid isPermaLink="false">65c3cfc792adff049778b4e7</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marina Falcão ]]>
                </dc:creator>
                <pubDate>Mon, 27 May 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_8TdTKJ6wtOoX7hZEbNFK-A.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/docker-simplified-96639a35ff36/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Docker Simplified: A Hands-On Guide for Absolute Beginners</a>
      </p><p>Caso você esteja planejando iniciar sua carreira em DevOps (ou mesmo se já estiver nela), se você já não tem o Docker em seu currículo, sem dúvida é hora de pensar nele, pois é uma das habilidades fundamentais para qualquer um que esteja na área de DevOps.</p><p>Neste artigo, vou tentar explicar o Docker da maneira mais simples possível.</p><p>Antes de examinarmos o assunto com mais profundidade e de começarmos a explorar o Docker, vamos dar uma olhada nos tópicos que cobriremos como parte deste guia para iniciantes.</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">O que é o Docker?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">O problema que o Docker soluciona</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Vantagens e Desvantagens de usar Docker</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Componentes principais do Docker</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Terminologia do Docker</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">O que é Docker Hub?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Docker Editions</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Instalando o Docker</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Alguns comandos essenciais do Docker para começar</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/docker-simplificado-um-guia-pratico-para-quem-esta-comecando/">Conclusão</a></li></ul><h3 id="vamos-come-ar-entendendo-o-que-docker"><strong>Vamos começar entendendo: o que é Docker?</strong></h3><p>Em termos simples, o Docker é uma plataforma de software que simplifica o processo de criação, execução, gerenciamento e distribuição de aplicações. Ele faz isso virtualizando o sistema operacional do computador no qual ele está instalado e rodando.</p><p>A primeira edição do Docker foi lançada em 2013.</p><p>O Docker é desenvolvido usando a linguagem de programação GO.</p><blockquote>Tendo em conta o rico conjunto de funcionalidades que o Docker tem para oferecer, ele tem sido amplamente utilizado para executar e gerir as aplicações de algumas das principais organizações e universidades do mundo, como a <strong>Visa, PayPal, Universidade de Cornell e Universidade de Indiana</strong> (só para citar algumas).</blockquote><h3 id="agora-vamos-tentar-entender-o-problema-e-a-solu-o-que-o-docker-pode-oferecer-"><strong>Agora vamos tentar entender o problema e a solução que o Docker pode oferecer. </strong></h3><h4 id="o-problema"><strong>O problema</strong></h4><p>Digamos que você tem três aplicações diferentes baseadas em Python que planeja hospedar em um único servidor (que pode ser uma máquina física ou virtual).</p><p>Cada uma dessas aplicações utiliza uma versão diferente do Python, assim como as bibliotecas e dependências associadas, que diferem de uma aplicação para outra.</p><p>Por não podermos ter diferentes versões do Python instaladas na mesma máquina, não conseguimos hospedar as três aplicações no mesmo computador.</p><h4 id="a-solu-o"><strong>A solução</strong></h4><p>Vamos ver sugestões para resolver esse problema sem usar o Docker. Nesse cenário, poderíamos usar três máquinas físicas, ou somente uma única máquina física poderosa o bastante para hospedar e executar três máquinas virtuais nela.</p><p>Ambas as opções nos permitiriam instalar diferentes versões do Python em cada uma dessas máquinas, juntamente com suas dependências associadas.</p><p>Independentemente da solução que escolhermos, os custos associados à aquisição e manutenção do hardware são bastante caros.</p><p>Agora, vamos ver como o Docker pode ser uma solução eficiente e econômica para esse problema.</p><p>Para entender isso, precisamos analisar exatamente como o Docker funciona.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_MbxLUFB2HRPmLAn60tQKZA.png" class="kg-image" alt="1_MbxLUFB2HRPmLAn60tQKZA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_MbxLUFB2HRPmLAn60tQKZA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_MbxLUFB2HRPmLAn60tQKZA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="320" loading="lazy"></figure><p>A máquina na qual o Docker está instalado e em execução é geralmente chamada de Docker Host ou Host em termos simples.</p><p>Então, quando você planeja implantar uma aplicação no host, ele cria uma entidade lógica para hospedar essa aplicação. Na terminologia do Docker, chamamos essa entidade lógica de <em>container</em> ou <em>Docker Container</em>, para ser mais preciso.</p><p>Um <em>Docker Container</em>, ou contêiner do Docker (em português), não tem nenhum sistema operacional instalado e em execução nele. Ele, no entanto, tem uma cópia virtual da tabela de processos, da(s) interface(s) de rede e do(s) ponto(s) de montagem do sistema de arquivos. Tudo isso foi herdado do sistema operacional do host no qual o contêiner está hospedado e em execução.</p><p>Enquanto isso, o kernel do sistema operacional do host é partilhado por todos os contêineres que estão rodando nele.</p><p>Isso permite que cada contêiner seja isolado dos outros no mesmo host. Sendo assim, vários contêineres com diferentes requisitos e dependências de aplicações podem ser executados no mesmo host, desde que tenham os mesmos requisitos de sistema operacional.</p><p>Para entender como o Docker tem sido benéfico na resolução desse problema, é necessário consultar a próxima seção, que discute as vantagens e desvantagens da utilização do Docker.</p><p>Em resumo, o Docker virtualiza o sistema operacional do host no qual está instalado e em execução em vez de virtualizar os componentes de hardware.</p><h3 id="vantagens-e-desvantagens-do-uso-do-docker"><strong>Vantagens e desvantagens do uso do Docker</strong></h3><h4 id="vantagens-do-uso-do-docker"><strong>Vantagens do uso do Docker</strong></h4><p>Alguns dos principais benefícios do uso do Docker são:</p><ul><li>O Docker suporta várias aplicações com diferentes requisitos e dependências, a serem hospedadas em conjunto no mesmo host, desde que tenham os mesmos requisitos de sistema operacional.</li><li>Armazenamento otimizado: um grande número de aplicações pode ser alojado no mesmo host, uma vez que os contêineres têm normalmente poucos megabytes de tamanho e consomem muito pouco espaço em disco.</li><li>Robustez: um contêiner não tem um sistema operacional instalado. Assim, consome muito pouca memória em comparação com uma máquina virtual (que teria um sistema operacional completo instalado e em execução). Isto também reduz o tempo de instalação para apenas alguns segundos, em comparação com alguns minutos necessários para subir uma máquina virtual.</li><li>Custos reduzidos: o Docker é menos exigente sobre o hardware necessário para executá-lo.</li></ul><h4 id="desvantagens-da-utiliza-o-do-docker"><strong>Desvantagens da utilização do Docker</strong></h4><ul><li>As aplicações com diferentes requisitos de sistema operacional não podem ser alojadas em conjunto no mesmo Docker Host. Por exemplo, digamos que temos 4 aplicações diferentes, das quais 3 requerem um sistema operacional baseado em Linux e a outra aplicação requer um sistema operacional baseado em Windows. Neste cenário, as 3 aplicações que requerem um sistema operacional baseado em Linux podem ser alojadas num único Docker Host, enquanto a aplicação que requer um sistema operacional baseado em Windows tem de ser alojada num Docker Host diferente.</li></ul><h3 id="componentes-principais-do-docker"><strong>Componentes principais do Docker</strong></h3><p><strong><strong>Docker Engine</strong></strong> é um dos principais componentes do Docker. Ele é responsável pelo funcionamento geral da plataforma do Docker.</p><p><strong><strong>Docker Engine</strong></strong> é uma aplicação baseada em <em>client</em>-servidor e consiste em 3 componentes principais.</p><ol><li>Servidor</li><li>API REST</li><li>Client</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_MYX0ClbWoitxS0RNUVvj8A.png" class="kg-image" alt="1_MYX0ClbWoitxS0RNUVvj8A" width="600" height="400" loading="lazy"><figcaption>Fonte: <a href="https://docs.docker.com">https://docs.docker.com</a></figcaption></figure><p>O <strong>s<strong>erv</strong>idor</strong> executa um <em>daemon</em>, conhecido como <strong><strong>dockerd</strong></strong> <strong><strong>(Docker Daemon)</strong></strong>, que nada mais é do que um processo. Ele é responsável por criar e gerenciar imagens, contêineres, redes e volumes do Docker na plataforma do Docker.</p><p>A <strong>API R<strong>EST</strong></strong> especifica como as aplicações podem interagir com o servidor e instruí-lo para realizar o seu trabalho.</p><p>O <strong><em>c<strong>lient</strong></em></strong> nada mais é do que uma interface de linha de comandos, que permite aos utilizadores interagir com o Docker utilizando os comandos.</p><h3 id="terminologia-do-docker"><strong>Terminologia do Docker</strong></h3><p>Vamos dar uma olhada rápida em algumas das terminologias associadas ao Docker.</p><p><strong>As imagens e os contêineres do <strong>Docker</strong> </strong>são as duas coisas essenciais que você encontrará diariamente ao trabalhar com o <strong><strong>Docker</strong></strong>.</p><p>Em termos simples, uma <strong>imagen do D<strong>ocker </strong></strong>é um modelo que contém a aplicação e todas as dependências necessárias para executar essa aplicação no Docker.</p><p>Por outro lado, como dito anteriormente, um <strong>c<strong>ont</strong>ê<strong>ine</strong>r do Docke<strong>r</strong></strong> é uma entidade lógica. Em termos mais precisos, é uma instância em execução da imagem do Docker.</p><h4 id="o-que-o-docker-hub"><strong>O que é o Docker Hub?</strong></h4><p>O <strong><strong>Docker Hub</strong></strong> é o repositório oficial on-line onde se encontram todas as imagens do Docker disponíveis para utilização.</p><p>O <strong><strong>Docker Hub</strong></strong> também nos permite armazenar e distribuir as nossas imagens personalizadas, se assim desejarmos. Podemos também torná-las públicas ou privadas, com base nos nossos requisitos.</p><p>Observação: podemos manter somente uma imagem do Docker como privada sendo usuários do plano gratuito. Se quisermos manter mais de uma imagem do Docker privada, precisamos de um plano pago.</p><h3 id="docker-editions"><strong>Docker Editions</strong></h3><p>O Docker está disponível em 2 edições diferentes, conforme listadas abaixo:</p><ul><li><strong><strong>Community Edition (CE)</strong></strong></li><li><strong><strong>Enterprise Edition (EE)</strong></strong></li></ul><p>A <strong><strong>Community Edition</strong></strong> é adequada para programadores individuais e pequenas equipes. Oferece funcionalidades limitadas, em comparação com a Enterprise Edition.</p><p>A <strong><strong>Enterprise Edition, </strong></strong>por outro lado, é adequada para grandes equipes e para a utilização do Docker em ambientes de produção.</p><p>A Enterprise Edition é ainda categorizada em três edições diferentes, conforme listadas abaixo:</p><ul><li><strong><strong>Basic </strong></strong></li><li><strong><strong>Standard </strong></strong></li><li><strong><strong>Advanced </strong></strong></li></ul><h3 id="instala-o-do-docker"><strong>Instalação do Docker</strong></h3><p>Uma última coisa que precisamos saber antes de prosseguirmos e mergulharmos no Docker é como instalá-lo.</p><p>Abaixo você verá os links para os guias oficiais de instalação do Docker CE (em inglês). Recomendo seguir estes guias para instalar o Docker na sua máquina, pois são simples e diretos.</p><ul><li><a href="https://docs.docker.com/install/linux/docker-ce/centos/" rel="noopener">CentOS Linux</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/debian/" rel="noopener">Debian Linux</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/fedora/" rel="noopener">Fedora Linux</a></li><li><a href="https://docs.docker.com/install/linux/docker-ce/ubuntu/" rel="noopener">Ubuntu Linux</a></li><li><a href="https://docs.docker.com/docker-for-windows/install/" rel="noopener">Microsoft Windows</a></li><li><a href="https://docs.docker.com/docker-for-mac/install/" rel="noopener">MacOS</a></li></ul><h4 id="quer-pular-a-instala-o-e-ir-direto-para-a-pr-tica-do-docker"><strong>Quer pular a instalação e ir direto para a prática do Docker?</strong></h4><p>Caso não queira instalar o Docker, ou não tenha recursos suficientes disponíveis no seu computador, não precisa se preocupar – aqui está a solução para o seu problema.</p><p>Você pode usar o <a href="https://labs.play-with-docker.com/" rel="noopener">Play with Docker</a>, que é um <em>playground</em> on-line para o Docker. Com ele, você pode praticar comandos do Docker imediatamente, sem ter que instalar nada na sua máquina. A melhor parte é que é simples de usar e está disponível gratuitamente.</p><h3 id="comandos-do-docker"><strong>Comandos do Docker</strong></h3><p>Agora é hora de praticar os comandos do Docker, pelos quais todos nós temos esperado até agora.</p><h4 id="docker-create"><strong>docker create</strong></h4><p>O primeiro comando que vamos analisar é o <strong><strong>docker create</strong></strong>.</p><p>Esse comando é usado pra criar um contêiner.</p><p>A sintaxe para esse comando é mostrada abaixo:</p><pre><code>docker create [opções] IMAGEM [comandos] [argumentos]</code></pre><p>Observação: tudo o que estiver entre colchetes é opcional. Isso é aplicável a todos os comandos que você verá neste guia.</p><p>Alguns dos exemplos de uso desse comando são mostrados abaixo:</p><pre><code>$ docker create fedora</code></pre><pre><code>02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03</code></pre><p>No exemplo acima, o comando <em>docker create</em> criaria um contêiner utilizando a imagem mais recente do Fedora.</p><p>Antes de criar o contêiner, ele verificará se a imagem oficial mais recente do Fedora está disponível no Docker Host ou não. Se a imagem mais recente não estiver disponível no Docker Host, baixará a imagem do Fedora do Docker Hub antes de criar o contêiner. Se a imagem do Fedora já estiver presente no Docker Host, ele usará essa imagem e criará o contêiner.</p><p>Se o contêiner for criado com sucesso, o Docker retornará o ID do contêiner. Por exemplo, no exemplo acima, 02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03 é o ID do contêiner devolvido pelo Docker.</p><p>Cada contêiner tem um ID de contêiner único. Utilizamos o ID de contêiner para efetuar várias operações no contêiner, tais como iniciar, parar, reiniciar etc.</p><p>Agora, vamos ver um outro exemplo do comando <em>docker create</em>, que tem opções e comandos sendo passados para ele.</p><pre><code>$ docker create -t -i ubuntu bash</code></pre><pre><code>30986b73dc0022dbba81648d9e35e6e866b4356f026e75660460c3474f1ca005</code></pre><p>No exemplo acima, o comando <em>docker create</em> cria um contêiner utilizando a imagem do Ubuntu (como referido anteriormente, se a imagem não estiver disponível no Docker Host, este transferirá a imagem mais recente do Hub Docker antes de criar o contêiner). </p><p>As opções -t e -i instruem o Docker a alocar um terminal ao contêiner para que o usuário possa interagir com o contêiner, além de instruir o Docker a executar o comando bash sempre que o contêiner for iniciado.</p><h4 id="docker-ps"><strong>docker ps</strong></h4><p>O próximo comando que veremos é o <strong><strong>docker ps</strong></strong>.</p><p>O comando <strong>docker ps</strong> nos permite visualizar todos os contêineres que estão em execução no Docker Host.</p><pre><code>$ docker ps</code></pre><pre><code>CONTAINER ID IMAGE  COMMAND CREATED        STATUS            PORTS NAMES
30986b73dc00 ubuntu "bash"  45 minutes ago Up About a minute                 elated_franklin</code></pre><p>Ele apenas apresenta os contêineres que estão atualmente em execução no Docker Host.</p><p>Se você quiser ver todos os contêineres que foram criados nesse Docker Host, independentemente de seu status atual, então você precisa incluir a opção -a, que exibe todos os contêineres que foram criados nesse Docker Host.</p><pre><code>$ docker ps -a</code></pre><pre><code>CONTAINER ID IMAGE  COMMAND     CREATED           STATUS       PORTS NAMES 30986b73dc00 ubuntu "bash"      About an hour ago Up 29 minutes elated_franklin
02576e880a2c fedora "/bin/bash" About an hour ago Created hungry_sinoussi</code></pre><p>Antes de prosseguirmos, vamos tentar decodificar e compreender a saída do comando <strong>docker ps</strong>.</p><p><strong><strong>CONTAINER ID:</strong></strong> uma string única composta por caracteres alfanuméricos, associada a cada contêiner (neste caso, 30986b73dc00 para o primeiro e 02576e880a2c para o segundo).</p><p><strong><strong>IMAGE:</strong></strong> nome da imagem do Docker usada para criar esse contêiner (ubuntu e fedora, respectivamente).</p><p><strong><strong>COMMAND:</strong></strong> qualquer comando específico da aplicação que precise ser executado quando o contêiner é iniciado ("bash" e "/bin/bash").</p><p><strong><strong>CREATED:</strong></strong> mostra o tempo decorrido desde que este contêiner foi criado (em ambos os casos, "About an hour ago" – há cerca de uma hora).</p><p><strong><strong>STATUS:</strong></strong> mostra o estado atual do contêiner, juntamente com o tempo decorrido, no seu estado atual (no primeiro caso, "Up 29 minutes" – em execução há 29 minutos, e, no segundo caso, "Created" – criado) .</p><p>Se o contêiner estiver em execução, será apresentado como "Up", juntamente com o tempo decorrido (por exemplo, "Up" há cerca de uma hora ou "Up" há 3 minutos).</p><p>Se o contêiner estiver parado, será apresentado como "Exited" seguido do código de estado de saída entre colchetes, juntamente com o tempo decorrido (por exemplo, Exited (0) há 3 semanas ou Exited (137) há 15 segundos, onde 0 e 137 são os códigos de saída).</p><p><strong><strong>PORTS:</strong></strong> mostra o mapeamento das portas definidas para o contêiner.</p><p><strong><strong>NAMES:</strong></strong> para além do CONTAINER ID, a cada contêiner também é atribuído um nome único. Podemos referir-nos a um contêiner utilizando o seu ID de contêiner ou o seu nome único. O Docker atribui automaticamente um nome único a cada contêiner que cria, mas se você quiser especificar o seu próprio nome para o contêiner, pode fazê-lo incluindo a opção <code>--name</code> (nome com duplo hífen) no comando <em>docker create</em> ou <em>docker run</em> (veremos o comando <em>docker run</em> mais adiante). </p><p>Espero que isso dê a você uma melhor compreensão da saída do comando <em>docker ps</em>.</p><h4 id="docker-start"><strong>docker start</strong></h4><p>O próximo comando que veremos é o comando <strong><strong><em>docker start</em></strong></strong>.</p><p>Esse comando inicia qualquer contêiner que estiver parado.</p><p>A sintaxe para esse comando é mostrada abaixo:</p><pre><code>docker start [opções] CONTAINER ID/NAME [CONTAINER ID/NAME…]</code></pre><p>Podemos iniciar um contêiner especificando os primeiros caracteres únicos do seu ID de contêiner ou especificando o seu nome.</p><p>Alguns dos exemplos de utilização desse comando são mostrados abaixo:</p><pre><code>$ docker start 30986</code></pre><p>No exemplo acima, o Docker inicia o contêiner que começa com o ID de contêiner 30986.</p><pre><code>$ docker start elated_franklin</code></pre><p>Nesse exemplo, o Docker inicia o contêiner chamado "elated_franklin".</p><h4 id="docker-stop"><strong>docker stop</strong></h4><p>O próximo comando da lista é o comando <strong><strong><em>docker stop</em></strong></strong>.</p><p>Este comando paralisa qualquer contêiner em execução.</p><p>A sintaxe para esse comando é mostrada abaixo:</p><pre><code>docker stop [opções] CONTAINER ID/NAME [CONTAINER ID/NAME…]</code></pre><p>É semelhante ao comando <em>docker start</em>.</p><p>Podemos parar o contêiner especificando os primeiros caracteres únicos do seu ID de contêiner ou especificando o seu nome. </p><p>Alguns dos exemplos de uso desse comando são mostrados abaixo:</p><pre><code>$ docker stop 30986</code></pre><p>No exemplo acima, o Docker interromperá a execução do contêiner que começa com o ID de contêiner 30986.</p><pre><code>$ docker stop elated_franklin</code></pre><p>Nesse exemplo, o Docker interromperá a execução do contêiner chamado "elated_franklin".</p><h4 id="docker-restart"><strong>docker restart</strong></h4><p>O próximo comando que veremos é o comando <strong><strong><em>docker restart</em></strong></strong>.</p><p>Esse comando reinicia qualquer contêiner em execução.</p><p>A sintaxe para esse comando é mostrada abaixo:</p><pre><code>docker restart [opções] CONTAINER ID/NAME [CONTAINER ID/NAME…]</code></pre><p>Podemos reiniciar o contêiner especificando os primeiros caracteres únicos do seu ID de contêiner ou especificando o seu nome.</p><p>Alguns dos exemplos de utilização desse comando são mostrados abaixo:</p><pre><code>$ docker restart 30986</code></pre><p>No exemplo acima, o Docker reiniciará o contêiner começando com o ID do contêiner 30986.</p><pre><code>$ docker restart elated_franklin</code></pre><p>Nesse exemplo, o Docker reiniciará o container chamado "elated_franklin".</p><h4 id="docker-run"><strong>docker run</strong></h4><p>O próximo comando que veremos é o comando <strong><strong>docker run</strong></strong>.</p><p>Esse comando primeiro cria o contêiner e, em seguida, o inicia. Em resumo, esse comando é uma combinação dos comandos <em>docker create</em> e <em>docker start</em>.</p><p>A sintaxe desse comando é mostrada abaixo:</p><pre><code>docker run [opções] IMAGEm [comandos] [argumentos]</code></pre><p>Ele tem uma sintaxe semelhante à do comando <em>docker create</em>.</p><p>Alguns dos exemplos de uso desse comando são mostrados abaixo:</p><pre><code>$ docker run ubuntu</code></pre><pre><code>30fa018c72682d78cf168626b5e6138bb3b3ae23015c5ec4bbcc2a088e67520</code></pre><p>No exemplo acima, o Docker criará o contêiner usando a imagem mais recente do Ubuntu e, em seguida, iniciará o contêiner imediatamente.</p><p>Se executássemos o comando acima, ele iniciaria o contêiner e o pararia imediatamente – não teríamos nenhuma chance de interagir com o contêiner.</p><p>Se quisermos interagir com o contêiner, então precisamos especificar as opções: -it (hífen seguido de i e t) para o comando <em>docker run</em> mostrar o terminal, com o qual podemos interagir com o contêiner escrevendo os comandos apropriados. Veja o exemplo abaixo.</p><pre><code>$ docker run -it ubuntu</code></pre><pre><code>root@e4e633428474:/#</code></pre><p>Para sair do contêiner, é necessário escrever <em>exit</em> no terminal.</p><h4 id="docker-rm"><strong>docker rm</strong></h4><p>Vamos passar para o próximo comando – se quisermos apagar um contêiner, usamos o comando <strong><strong>docker rm</strong></strong>.</p><p>A sintaxe desse comando é a mostrada abaixo: </p><pre><code>docker rm [opções] CONTAINER ID/NAME [CONTAINER ID/NAME...]</code></pre><p>Alguns dos exemplos de uso desse comando são mostrados abaixo:</p><pre><code>$ docker rm 30fa elated_franklin</code></pre><p>No exemplo acima, estamos instruindo o Docker para excluir 2 contêineres com um único comando. O primeiro contêiner a ser eliminado é especificado através do seu ID de contêiner (30fa) e o segundo contêiner a ser eliminado é especificado através do seu nome ("elated_franklin").</p><p>Observação: os contêineres precisam estar estar parados para serem eliminados.</p><h4 id="docker-images"><strong>docker images</strong></h4><p><strong><strong>docker images </strong></strong>é o próximo comando da lista.</p><p>Esse comando lista todas as imagens do Docker que estão presentes no seu Docker Host.</p><pre><code>$ docker images</code></pre><pre><code>REPOSITORY  TAG      IMAGE          CREATED        SIZE
mysql       latest   7bb2586065cd   38 hours ago   477MB
httpd       latest   5eace252f2f2   38 hours ago   132MB
ubuntu      16.04    9361ce633ff1   2 weeks ago    118MB
ubuntu      trusty   390582d83ead   2 weeks ago    188MB
fedora      latest   d09302f77cfc   2 weeks ago    275MB
ubuntu      latest   94e814e2efa8   2 weeks ago    88.9MB</code></pre><p>Vamos decodificar o resultado do comando <strong><strong>docker images</strong></strong>.</p><p><strong><strong>REPOSITORY:</strong></strong> representa o nome único da imagem do Docker.</p><p><strong><strong>TAG:</strong></strong> cada imagem está associada a uma tag exclusiva. Uma tag basicamente representa uma versão da imagem.</p><p>Uma tag é geralmente representada usando uma palavra, um conjunto de números ou uma combinação de caracteres alfanuméricos.</p><p><strong><strong>IMAGE ID:</strong></strong> uma string única constituída por caracteres alfanuméricos, associada a cada imagem.</p><p><strong><strong>CREATED:</strong></strong> mostra o tempo decorrido desde que a imagem foi criada.</p><p><strong><strong>SIZE:</strong></strong> mostra o tamanho da imagem.</p><h4 id="docker-rmi"><strong>docker rmi</strong></h4><p>O próximo comando da lista é o comando <strong><strong>docker rmi</strong></strong>.</p><p>O <strong><strong>docker rmi</strong></strong> nos permite remover uma imagem (ou imagens) do Docker Host.</p><p>A sintaxe desse comando é mostrada abaixo:</p><pre><code>docker rmi [opções] IMAGE NAME/ID [IMAGE NAME/ID...]</code></pre><p>Alguns dos exemplos de uso desse comando são mostrados abaixo:</p><pre><code>docker rmi mysql</code></pre><p>O comando acima remove a imagem chamada "mysql" do Docker Host.</p><pre><code>docker rmi httpd fedora</code></pre><p>O comando acima remove as imagens chamadas "httpd" e "fedora" do Docker Host.</p><pre><code>docker rmi 94e81</code></pre><p>O comando acima remove a imagem que começa com o ID de imagem "94e81" do Docker Host.</p><pre><code>docker rmi ubuntu:trusty</code></pre><p>O comando acima remove a imagem chamada "ubuntu", com a tag "trusty" do Docker Host.</p><p>Esses foram alguns dos comandos mais comuns usados no Docker. Há muitos outros comandos do Docker a serem explorados.</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>A conteinerização tem recebido recentemente a atenção que merece, embora já exista há muito tempo. Algumas das principais empresas de tecnologia, como Google, Amazon Web Services (AWS), Intel, Tesla e Juniper Networks, têm sua própria versão personalizada de <em>container engines </em>(em português, algo como "motor de containerização"). Essas empresas dependem fortemente das engines para criar, executar, gerir e distribuir as suas aplicações.</p><blockquote>O <strong>Docker </strong>é um motor de containerização extremamente poderoso e tem muito para oferecer quando se trata de criar, executar, gerir e distribuir as suas aplicações de maneira eficiente.</blockquote><p>Você acabou de ver uma visão extremamente geral do Docker. Há muito mais para aprender sobre o Docker, como:</p><ul><li>Comandos do Docker (comandos mais poderosos)</li><li>Imagens do Docker (como criar suas próprias imagens personalizadas)</li><li>Docker Networking (configurar e implantar a rede)</li><li>Docker Services (agrupamento de contêineres que utilizam a mesma imagem)</li><li>Docker Stack (agrupamento de serviços exigidos por uma aplicação)</li><li>Docker Compose (ferramenta para gerir e executar vários contêineres)</li><li>Docker Swarm (agrupamento e gestão de uma ou mais máquinas nas quais o Docker está sendo executado)</li><li>E muito mais…</li></ul><p>Se achou o Docker fascinante e está interessado em aprender mais sobre ele, então recomendo que se inscreva nos cursos que estão listados abaixo. Eles são muito informativos e objetivos.</p><p>Se é um iniciante, então sugiro que se <a href="http://bit.ly/2YLH23G" rel="noopener">inscreva neste curso</a> (em inglês), que foi projetado para principiantes.</p><p>Se você tem um bom conhecimento sobre o Docker, se está bastante confiante com as coisas básicas e se quer expandir seu conhecimento, então eu sugiro que você se <a href="http://bit.ly/2UaTGe8" rel="noopener">inscreva neste curso</a>, que é mais voltado para tópicos avançados relacionados ao Docker.</p><p><strong><strong>Docker </strong></strong>é uma habilidade muito importante para o futuro e está apenas ganhando impulso.</p><p>Investir seu tempo e dinheiro para aprender Docker não será algo de que você se arrependerá.</p><blockquote>Espero que você tenha achado este artigo informativo. sinta-se à vontade para compartilhá-lo. Isso realmente significa muito para mim.</blockquote><h3 id="antes-de-dizer-adeus-"><strong>Antes de dizer adeus...</strong></h3><p>Para manter contato com o autor, <a href="https://forms.gle/3U1uBNEC4mDkSpMJ7" rel="noopener">clique aqui para cadastrar seu e-mail</a>.</p><p>Agradeço por dedicar seu precioso tempo à leitura deste artigo.</p><p>Isenção de responsabilidades: todos os nomes de produtos e empresas são marcas comerciais™ ou marcas comerciais registradas® dos respectivos titulares. O uso deles não implica qualquer endosso. Pode haver links de afiliados neste artigo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Uma rápida introdução às tags no Docker ]]>
                </title>
                <description>
                    <![CDATA[ Se você já trabalhou com o Docker, mesmo que por um tempo curto, aposto que já se deparou com tags. Elas geralmente se parecem com "nome_da_minha_imagem: 1", onde a parte após os dois pontos é conhecida como uma tag. A tag nem sempre é especificada ao marcar imagens, mas chegaremos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/uma-rapida-introducao-as-tags-no-docker/</link>
                <guid isPermaLink="false">642b63e686dbbe0599dba631</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Tue, 04 Apr 2023 00:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/0_KBn45TeUMJZSbz9n.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/an-introduction-to-docker-tags-9b5395636c2a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A quick introduction to Docker tags</a>
      </p><p>Se você já trabalhou com o Docker, mesmo que por um tempo curto, aposto que já se deparou com tags. Elas geralmente se parecem com "nome_da_minha_imagem: 1", onde a parte após os dois pontos é conhecida como uma tag. A tag nem sempre é especificada ao marcar imagens, mas chegaremos a isso mais tarde.</p><p>Desde que comecei a usar o Docker, fiquei muito confusa sobre as tags. A documentação não as explica muito bem. Na verdade, não há explicações completas sobre o tópico. É por isso que decidi escrever este artigo.</p><h3 id="o-que-s-o-as-tags-no-docker"><strong>O que são as tags no Docker?</strong></h3><p>Então, o que são, exatamente, as tags do Docker? Em palavras simples, as tags do Docker transmitem informações úteis sobre uma versão/variante de imagem específica. Elas são <em>aliases</em> para o ID da sua imagem que, muitas vezes, parecem com isto: <code>f1477ec11d12</code>. É apenas uma maneira de se referir à sua imagem. Uma boa analogia é associar a como as tags do Git se referem a um <em>commit</em> específico em seu histórico.</p><p>Os dois casos mais comuns em que as tags podem ser vistas são:</p><ol><li>Ao criar uma imagem, quando usamos o seguinte comando:</li></ol><pre><code>docker build -t nome_do_usuario/nome_da_imagem:nome_da_tag .</code></pre><p>Vamos tentar descomplicar um pouco o que esse comando faz. Dizemos ao daemon do Docker para buscar o arquivo do Docker presente no diretório atual (é isso que o <code>.</code> no final faz). Em seguida, dizemos ao daemon do Docker para criar a imagem e fornecer a ela a tag especificada. Se você executar <code>docker images</code>, deverá ver uma imagem cujo repositório é <code>nome_do_usuario/nome_da_imagem</code> e a tag é <code>nome_da_tag</code>.</p><p><code>nome_do_usuario/nome_da_imagem</code> não é um formato obrigatório para especificar o nome da imagem. É apenas uma convenção útil para evitar marcar sua imagem novamente quando você precisar enviá-la para um registro.</p><p>Sua imagem pode ser nomeada como você quiser. Para o registro público do Docker, você está restrito a uma hierarquia de dois níveis ao nomear imagens. Por exemplo, sua imagem não pode ter o nome <code>a/b/c:1</code>. Essa restrição geralmente não existe em registros privados. Como dito anteriormente, não é obrigatório especificar um <code>nome_da_tag</code>. Veremos o que acontece nesse caso em breve.</p><p>2. Marcação explícita de uma imagem através do comando <code>tag</code>.</p><pre><code>docker tag IMAGEM_DE_ORIGEM[:TAG] IMAGEM_DE_DESTINO[:TAG]</code></pre><p>Esse comando apenas cria um alias (uma referência) com o nome de <code>IMAGEM_DE_DESTINO</code> que se refere a <code>IMAGEM_DE_ORIGEM</code>. Isso é tudo o que o comando faz. É como atribuir a uma imagem existente outro nome para se referir a ela. Observe como a tag é especificada como opcional aqui também, por <code>[:TAG]</code>.</p><h3 id="o-que-acontece-quando-voc-n-o-especifica-uma-tag">O que acontece quando você não especifica uma tag?</h3><p>Tudo bem, agora vamos descobrir o que acontece quando você não especifica uma tag ao marcar uma imagem. É aqui que a tag <code>latest</code> (em português, mais recente) entra em cena. Sempre que uma imagem é marcada sem uma tag explícita, ela recebe a tag <code>latest</code> por padrão. É uma escolha de nomenclatura infeliz, que causa muita confusão. Eu, porém, gosto de pensar nisso como a <em>tag padrão</em> que é dada às imagens quando você não especifica uma.</p><p>Muita confusão em torno de <code>latest</code> é causada pela expectativa de que seja a versão mais recente da imagem, especialmente no Dockerfiles. Vamos considerar os vários cenários com um exemplo:</p><h4 id="cen-rio-1-"><strong>Cenário 1:</strong></h4><p>Suponha que a seguinte instrução esteja presente em nosso Dockerfile:</p><pre><code>FROM debian</code></pre><p>Como não especificamos nenhuma tag, o Docker adicionará a tag <code>latest</code> e tentará puxar a imagem <code>debian:latest</code>.</p><h4 id="cen-rio-2-"><strong>Cenário 2:</strong></h4><pre><code>FROM debian:9.3</code></pre><p>Como a tag é explicitamente mencionada aqui, o Docker puxará a imagem Debian marcada como 9.3.</p><p>Outra coisa a ter em mente é que não há nenhuma regra que estabeleça que uma imagem precisa ter apenas uma tag. Uma imagem pode ter várias tags. Elas geralmente são usadas para especificar versões principais e secundárias. Por exemplo, considere o seguinte:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/bOvBoIYQodn8oPnc9D39cLmXRwp4i-vcgIUc.png" class="kg-image" alt="bOvBoIYQodn8oPnc9D39cLmXRwp4i-vcgIUc" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/bOvBoIYQodn8oPnc9D39cLmXRwp4i-vcgIUc.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/bOvBoIYQodn8oPnc9D39cLmXRwp4i-vcgIUc.png 682w" width="682" height="133" loading="lazy"><figcaption><a href="https://hub.docker.com/r/library/debian/">Página do Docker Hub para o Debian</a></figcaption></figure><p>No momento em que escrevo este artigo, a tag <code>latest</code> para a imagem Debian aponta para a versão <code>9.3</code> <strong>e </strong>para a versão <code>9</code>. Isso, provavelmente, mudará no futuro sempre que a versão principal ou secundária for alterada para a imagem.</p><p>Observe que as tags que estão sendo usadas para controle de versão semântico são uma convenção que é seguida, mas as tags não foram projetadas <em>apenas </em>para essa finalidade.</p><h3 id="para-concluir-latest-n-o-uma-tag-especial">Para concluir, <code>latest</code> não é uma tag especial</h3><p>A principal conclusão do que tratamos até agora é que <code>latest</code> é como qualquer outra tag. Cabe ao desenvolvedor marcar as imagens corretamente, de modo que <code>latest</code> sempre aponte para a última versão estável da imagem.</p><p>Portanto, não especificamos explicitamente uma tag em nossos Dockerfiles ao extrair imagens, pois podemos acabar com uma versão completamente diferente de imagem base em comparação com a que havíamos usado antes. Não há garantias de que isso será uma grande ou uma pequena mudança. Mesmo uma versão antiga pode ser marcada como <code>latest</code>.</p><p>Se você encontrar algum erro/imprecisão neste artigo, fique à vontade para enviar uma mensagem para a autora pelo <a href="https://twitter.com/ScribblingOn">Twitter</a>.</p><p>A autora agradece a <a href="https://twitter.com/jpetazzo" rel="noopener">Jérôme Petazzoni</a> por ajudá-la a entender um pouco do assunto em questão.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Docker exec – como executar um comando dentro de um contêiner ou imagem do Docker ]]>
                </title>
                <description>
                    <![CDATA[ Vou contar a você um segredo do DevOps aqui: o que todas as pessoas do DevOps adoram fazer é construir um sistema supersofisticado e complexo e, em seguida, encontrar uma maneira de lidar com ele como um shell normal. Outra possibilidade é a de se conectar a ele com SSH ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/docker-exec-como-executar-um-comando-dentro-de-um-conteiner-ou-imagem-do-docker/</link>
                <guid isPermaLink="false">63a9b78d44e27f060d7a4751</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Sun, 05 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/01/antoine-petitteville-hHntcuiLbOg-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/docker-exec-how-to-run-a-command-inside-a-docker-image-or-container/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Docker Exec - How to Run a Command Inside a Docker Image or Container</a>
      </p><p>Vou contar a você um segredo do DevOps aqui: o que todas as pessoas do DevOps adoram fazer é construir um sistema supersofisticado e complexo e, em seguida, encontrar uma maneira de lidar com ele como um shell normal. Outra possibilidade é a de se conectar a ele com SSH e tratá-lo como um shell normal.</p><p>Com o Docker não é diferente! Você está executando um computador dentro de outro computador. Talvez esse computador seja uma instância do EC2 ou um laptop. Você pode até fazer algo realmente louco e executar uma VM que está executando o Docker.</p><p>Na maioria das vezes, quando uso o Docker, eu o uso para empacotar e distribuir uma aplicação. Às vezes, estou usando para algo mais legal, como um projeto de computação distribuída. Muitas vezes, porém lanço um Dockerfile em um repositório do GitHub para não precisar instalar CLIs que sei que, no fim, entrarão em conflito no meu laptop.</p><p>Para encurtar a história, você pode dizer ao Docker para executar o comando <code>bash</code>, que o leva a um shell:</p><pre><code class="language-bash">docker run -it nome-da-imagem bash
# docker run -it continuumio/miniconda3:latest bash
# docker run -it node:latest bash</code></pre><p>Continue lendo para saber mais. 😜</p><h2 id="experimente">Experimente</h2><p>Pesquise no Google o Docker da sua linguagem de programação favorita. Para mim, é Python e, especificamente, eu gosto do conda. Em seguida, execute alguns comandos para garantir que você esteja de fato nesse shell.</p><pre><code class="language-bash"># A partir do sistema hospedeiro
echo $(pwd)
# Entre no shell do docker
docker run -it continuumio/miniconda3:latest bash
# Agora você está em um shell do docker!
echo $(pwd)
echo $USER</code></pre><p>Legal, não é? É perfeito para depurar um contêiner que deveria, com certeza, estar funcionando corretamente. Também é ótimo para o meu caso de uso mais comum: "Não quero instalar isso no meu computador".</p><h2 id="fa-a-a-depura-o-de-um-docker-build-com-docker-run">Faça a depuração de um Docker Build com Docker Run</h2><p>Tratar sua imagem do Docker como um shell normal será útil ao tentar depurar compilações do Docker.</p><p>Digamos que você tenha um Dockerfile para uma imagem que está tentando criar. Normalmente, o que acontece é que, ao executar <code>docker build -t minha-imagem .</code> (onde -t é para a tag), o Docker executará cada uma das etapas de RUN e parará quando chegar a um comando que não saia corretamente.</p><p>Em um shell UNIX, o código de saída 0 (zero) significa que está tudo bem com um comando. Então, para ilustrar esse ponto, fiz nosso Dockerfile ter um comando RUN que sai com 1.</p><pre><code class="language-bash">FROM continuumio/miniconda3:latest

RUN apt-get update -y; \
    apt-get upgrade -y; \
    apt-get install -y \
    vim-tiny vim-athena build-essential

RUN  conda update conda \
    &amp;&amp; conda clean --all --yes

RUN exit 1</code></pre><pre><code class="language-bash">docker build -t minha-imagem .</code></pre><p>Isso dará uma saída que se assemelhará a isto:</p><pre><code class="language-bash">(base) ➜  docker build -t minha-imagem .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM continuumio/miniconda3:latest
 ---&gt; 406f2b43ea59
Step 2/4 : RUN apt-get update -y;     apt-get upgrade -y;     apt-get install -y     vim-tiny vim-athena build-essential
 ---&gt; Using cache
 ---&gt; 726af29a48a0
Step 3/4 : RUN  conda update conda     &amp;&amp; conda clean --all --yes
 ---&gt; Using cache
 ---&gt; 19478bb3ce67
Step 4/4 : RUN exit 1
 ---&gt; Running in 7c98aab6b52c
The command '/bin/sh -c exit 1' returned a non-zero code: 1</code></pre><p>Você pode confirmar que sua imagem do Docker não foi criada executando <code>docker images</code> e verificando <code>minha-imagem</code>. Não estará lá porque não foi construído com sucesso.</p><p>Agora, o que podemos fazer é comentar o comando RUN problemático do Dockerfile.</p><pre><code class="language-bash">FROM continuumio/miniconda3:latest

RUN apt-get update -y; \
    apt-get upgrade -y; \
    apt-get install -y \
    vim-tiny vim-athena build-essential

RUN  conda update conda \
    &amp;&amp; conda clean --all --yes

#RUN exit 1</code></pre><p>Então, o que você verá é:</p><pre><code class="language-bash">Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM continuumio/miniconda3:latest
 ---&gt; 406f2b43ea59
Step 2/3 : RUN apt-get update -y;     apt-get upgrade -y;     apt-get install -y     vim-tiny vim-athena build-essential
 ---&gt; Using cache
 ---&gt; 726af29a48a0
Step 3/3 : RUN  conda update conda     &amp;&amp; conda clean --all --yes
 ---&gt; Using cache
 ---&gt; 19478bb3ce67
Successfully built 19478bb3ce67
Successfully tagged minha-imagem:latest
</code></pre><p>Agora, você pode entrar em sua imagem Docker e começar a executar comandos interativamente!</p><pre><code class="language-bash">docker run -it minha-imagem bash
# você também pode executar
# docker run -it minha-imagem:latest bash</code></pre><p>A partir daqui, um por um, você pode começar a depurar seus comandos RUN para ver o que deu errado. Se você não tem certeza se um comando saiu corretamente ou não, execute <code>$?</code>:</p><pre><code># Primeiro, execute docker run -it minha-imagem bash para obter o shell
# Exibe o texto hello
echo "hello"
# hello
echo $?
# 0

# Executa um comando hello não existente
$(hello)
# bash: hello: command not found
echo $?
# 127</code></pre><p>Você pode continuar executando essas etapas, comentando seu Dockerfile, entrando em um shell e descobrindo comandos problemáticos, até que suas imagens do Docker sejam criadas perfeitamente.</p><h2 id="conclus-o">Conclusão</h2><p>Espero ter mostrado a você que usar uma imagem do Docker não é diferente do terminal em seu computador. O uso de imagens do Docker é uma maneira incrível de distribuir aplicações.</p><p>Tente pegar sua aplicação de CLI favorita ou o próximo projeto do GitHub e, em vez de criar um script de instalação, empacote-o com o Docker. 😀</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 7 casos em que você não deve usar o Docker ]]>
                </title>
                <description>
                    <![CDATA[ O Docker é um divisor de águas. Mas não é uma solução para todos os problemas. Há muitas coisas boas sobre o Docker. Ele empacota, envia e executa aplicativos como uma ferramenta de conteinerização leve, portátil e autossuficiente. O Docker é ótimo para empresas de todos os tamanhos. Quando você ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/7-casos-em-que-voce-nao-deve-usar-o-docker/</link>
                <guid isPermaLink="false">62e279e4fea2f10707d67ddb</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Sun, 28 Aug 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/08/Docker-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/7-cases-when-not-to-use-docker/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">7 Cases When You Should Not Use Docker</a>
      </p><h3 id="o-docker-um-divisor-de-guas-mas-n-o-uma-solu-o-para-todos-os-problemas-">O Docker é um divisor de águas. Mas não é uma solução para todos os problemas.</h3><p>Há muitas coisas boas sobre o Docker. Ele empacota, envia e executa aplicativos como uma ferramenta de conteinerização leve, portátil e autossuficiente. O Docker é ótimo para empresas de todos os tamanhos. Quando você está trabalhando em um trecho de código em uma equipe pequena, ele elimina o problema do "mas funciona na minha máquina". Enquanto isso, as empresas podem usar o Docker para criar pipelines de entrega de software Agile para enviar novos recursos com mais rapidez e segurança.</p><p>Com seu sistema de conteinerização integrado, o Docker é uma excelente ferramenta para computação em nuvem. Por sua vez, o Docker Swarm avança na clusterização e no design descentralizado. Parece bom demais para ser verdade, certo? Bem, ainda existem vários casos em que não se deve usar o Docker. Aqui estão sete deles.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/07/Infographics__3_-min_pt_BR.png" class="kg-image" alt="Infographics__3_-min_pt_BR" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/07/Infographics__3_-min_pt_BR.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/07/Infographics__3_-min_pt_BR.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="1000" loading="lazy"></figure><p>Vamos passar por eles um por um.</p><h2 id="n-o-use-o-docker-se-voc-precisa-de-mais-velocidade"><strong>Não use o Docker se você precisa de mais velocidade</strong></h2><p>Os contêineres do Docker são menores e exigem menos recursos do que uma máquina virtual com um servidor e um banco de dados. Ao mesmo tempo, o Docker usará tantos recursos do sistema quanto o agendador do kernel do host permitir. Você não deve esperar que o Docker acelere um aplicativo de forma alguma.</p><p>Mais do que isso, o Docker pode até torná-lo mais lento. Se estiver trabalhando com ele, você deve definir limites de memória, CPU ou bloco de E/S o contêiner pode usar. Caso contrário, se o kernel detectar que a máquina host está com pouca memória para executar funções importantes do sistema, ele poderá começar a matar processos importantes. Se o processo errado for eliminado (incluindo o próprio Docker), o sistema ficará instável.</p><p>Infelizmente, os ajustes de memória do Docker – a prioridade de falta de memória no daemon do Docker – não resolvem esse problema. Por outro lado, uma camada adicional entre um aplicativo e o sistema operacional também pode resultar em redução de velocidade. No entanto, essa diminuição será insignificante. Os contêineres do Docker não são totalmente isolados e não contêm um sistema operacional completo como qualquer máquina virtual.</p><h2 id="n-o-use-o-docker-se-voc-prioriza-a-seguran-a"><strong>Não use o Docker se você prioriza a segurança</strong></h2><p>A maior vantagem de segurança do Docker é que ele divide o aplicativo em partes menores. Se a segurança de uma parte for comprometida, as demais não serão afetadas.</p><p>No entanto, enquanto processos isolados em contêineres prometem segurança aprimorada, todos os contêineres compartilham acesso a um único sistema operacional de host. Você corre o risco de executar contêineres do Docker com isolamento incompleto. Qualquer código malicioso pode ter acesso à memória do seu computador.</p><p>Existe uma prática popular de executar muitos contêineres em um único ambiente. É assim que você deixa seu aplicativo exposto a ataques do tipo Abuso de Recursos, a menos que você limite os recursos do contêiner de recursos. Para máxima eficiência e isolamento, cada contêiner deve tratar de uma área específica de preocupação.</p><p>Outro problema é a configuração padrão do Docker – os usuários não têm espaços de nome (<em>namespace</em>, em inglês). Os espaços de nome permitem que os recursos de software usem outros recursos somente se eles pertencerem a um espaço de nome específico.</p><p>A execução de aplicativos com o Docker implica a execução do daemon do Docker com privilégios de root. Todos os processos que saem do contêiner do Docker terão os mesmos privilégios no host que tinham no contêiner. Executar seus processos dentro dos contêineres como um usuário sem privilégios não garante a segurança. Depende dos recursos que você adiciona ou remove. Para mitigar os riscos de rompimento de contêineres do Docker, você não deve baixar contêineres prontos para uso de fontes não confiáveis.</p><h2 id="n-o-use-o-docker-se-voc-desenvolve-um-aplicativo-de-interface-gr-fica-para-desktops"><strong>Não use o Docker se você desenvolve um aplicativo de interface gráfica para desktops</strong></h2><p>O Docker não é adequado para aplicativos que exigem interface do usuário avançada. O Docker destina-se principalmente a contêineres isolados com aplicativos baseados em console. Os aplicativos baseados em GUI (abreviação em inglês de interface gráfica de usuário) não são uma prioridade. Seu suporte dependerá do caso e da aplicação específicos. Os contêineres do Windows são baseados em Nano ou Core Server – ele não permite que os usuários iniciem uma interface baseada em GUI ou um servidor Docker RDP no contêiner Docker.</p><p>No entanto, você ainda pode <a href="https://hub.docker.com/r/tzutalin/py2qt4/"><u>executar aplicativos baseados em GUI</u></a> desenvolvidos com Python e a estrutura QT em um contêiner Linux. Além disso, você pode usar o encaminhamento X11, mas essa solução é um pouco estranha.</p><h2 id="n-o-use-o-docker-se-voc-deseja-facilitar-o-desenvolvimento-e-depura-o"><strong>Não use o Docker se você deseja facilitar o desenvolvimento e depuração</strong></h2><p>O Docker foi criado por desenvolvedores e para desenvolvedores. Ele fornece estabilidade ao ambiente: um contêiner na máquina de desenvolvimento funcionará exatamente da mesma forma no teste, na produção ou em qualquer outro ambiente. Isso elimina o problema de várias versões de programas em diferentes ambientes.</p><p>Com a ajuda do Docker, você pode adicionar facilmente uma nova dependência ao seu aplicativo. Nenhum desenvolvedor em sua equipe precisará repetir essa manipulação em sua máquina. Tudo estará funcionando no contêiner e será distribuído para toda a equipe.</p><p>Ao mesmo tempo, você precisa fazer algumas configurações extras para codificar seu aplicativo no Docker. Além disso, com a depuração do Docker, você precisa configurar a saída de logs e as portas de depuração. Você também pode precisar mapear portas para seus aplicativos e serviços em contêineres. Portanto, se você tiver um processo de implantação complicado e tedioso, o Docker o ajudará muito. Se você tem um aplicativo simples, ele apenas adiciona complexidade desnecessária.</p><h2 id="n-o-use-o-docker-se-voc-precisa-usar-sistemas-operacionais-e-kernels-diferentes"><strong>Não use o Docker se você precisa usar sistemas operacionais e kernels diferentes</strong></h2><p>Com máquinas virtuais, o hipervisor pode abstrair um dispositivo inteiro. Você pode usar o Microsoft Azure para executar as duas instâncias do Windows Server e do Linux Server ao mesmo tempo. A imagem do Docker, no entanto, requer o mesmo sistema operacional para o qual foi criada.</p><p>Há um grande banco de dados de imagens de contêiner do Docker – o Docker Hub. No entanto, se uma imagem foi criada no Linux Ubuntu, ela será executada apenas no mesmo Ubuntu.</p><p>Se um aplicativo for desenvolvido no Windows, mas a produção for executada no Linux, você não poderá usar o Docker de maneira eficaz. Às vezes, é mais fácil configurar um servidor se você tiver vários aplicativos estáticos.</p><h2 id="n-o-use-o-docker-se-voc-tem-muitos-dados-valiosos-para-armazenar"><strong>Não use o Docker se você tem muitos dados valiosos para armazenar</strong></h2><p>Por design, todos os arquivos do Docker são criados dentro de um contêiner e armazenados em uma camada de contêiner gravável. Pode ser difícil recuperar os dados do contêiner se um processo diferente precisar deles. Além disso, a camada gravável de um contêiner é conectada à máquina host na qual o contêiner está sendo executado. Se você precisar mover os dados para outro lugar, não poderá fazê-lo facilmente. Mais do que isso, todos os dados armazenados dentro de um contêiner serão perdidos para sempre quando o contêiner for encerrado.</p><p>Você precisa pensar em maneiras de salvar seus dados em outro lugar primeiro. Para manter os dados seguros no Docker, você precisa empregar uma ferramenta adicional – o Docker Data Volumes. No entanto, esta solução ainda é bastante desajeitada e precisa ser melhorada.</p><h2 id="n-o-use-o-docker-se-voc-busca-a-tecnologia-mais-f-cil-de-gerenciar"><strong>Não use o Docker se você busca a tecnologia mais fácil de gerenciar</strong></h2><p>Tendo sido introduzido em 2012, o Docker ainda é uma tecnologia nova. Como desenvolvedor, talvez seja necessário atualizar as versões do Docker regularmente. Infelizmente, a compatibilidade com versões anteriores não é garantida. Além disso, a documentação está ficando para atrás em relação ao avanço da tecnologia. Como desenvolvedor, você terá que descobrir algumas coisas sozinho.</p><p>As opções de monitoramento que o Docker oferece também são bastante ruins. Você pode obter uma visão rápida de algumas estatísticas simples. No entanto, se você quiser ver alguns recursos avançados de monitoramento, o Docker não tem nada a oferecer.</p><p>No caso de um aplicativo grande e complexo, a implementação do Docker tem um custo. Construir e manter a comunicação entre vários contêineres em vários servidores exigirá muito tempo e esforço. No entanto, existe uma ferramenta útil, que facilita o trabalho com aplicativos Docker de vários contêineres – o Docker Compose. Ele define serviços, redes e volumes em um único arquivo YAML.</p><p>No entanto, o ecossistema do Docker é bastante fragmentado – nem todos os produtos de contêiner de suporte funcionam bem uns com os outros. Cada produto é apoiado por uma determinada empresa ou comunidade. A competição acirrada entre elas resulta na incompatibilidade do produto.</p><h2 id="para-resumir"><strong>Para resumir</strong></h2><p>Os profissionais da KeenEthics gostam de trabalhar com o Docker e costumam usá-lo para o desenvolvimento de aplicativos. Apesar de algumas desvantagens, você pode usá-lo facilmente para executar e gerenciar aplicativos lado a lado em contêineres isolados.</p><p>Instalar um aplicativo pode ser tão simples quanto executar um único comando – &lt;docker run&gt;. O Docker também fornece um ambiente de isolamento limpo e original para cada teste, tornando-o uma ferramenta importante e útil para testes de automação.</p><p>Os recursos do Docker oferecem benefícios em termos de gerenciamento de dependência e segurança. Aprimorado com ferramentas úteis como o Docker Hub, o Docker Swarm e o Docker Compose, o Docker é uma solução popular e fácil de usar.</p><p>Apesar de todos os benefícios do Docker, você não deve usá-lo para conteinerizar todo e qualquer aplicativo que você desenvolver.</p><p><em>Lembre-se: o Docker é um divisor de águas, mas não é uma solução para todos os problemas.</em></p><p>O Docker também não é a única ferramenta desse tipo no mercado. As alternativas ao Docker são o <u><a href="https://coreos.com/rkt/">rkt</a> </u>(que se pronuncia como "rocket"), o <a href="https://linuxcontainers.org/"><u>Linux Containers</u></a> ou o <a href="https://openvz.org/"><u>OpenVZ</u></a>. Todos têm suas vantagens e desvantagens e são bastante semelhantes ao Docker. A crescente popularidade e as taxas de uso do Docker são causadas apenas pela decisão das empresas de adotá-lo.</p><p>Antes de tirar conclusões precipitadas sobre usar ou não o Docker, pesquise os requisitos do projeto. Converse com seus colegas de equipe ou colegas e deixe-os ajudá-lo a decidir quando usar o Docker, quando não usar contêineres e se é um desses casos de uso do Docker.</p><p>Quer você goste ou não, essa tecnologia tem futuro. Existem alguns desenvolvedores e agências de desenvolvimento que odeiam o Docker e tentam eliminá-lo de todos os seus projetos em andamento. Ao mesmo tempo, existem especialistas que colocam em contêiner tudo o que podem porque veem o Docker como uma panaceia. Talvez você não deva se juntar a nenhum dos lados. Mantenha-se imparcial, seja objetivo e tome uma decisão que dependa de sua situação específica.</p><h2 id="voc-tem-uma-ideia-para-um-projeto-do-docker">Você tem uma ideia para um projeto do Docker?</h2><p>A empresa do autor, a KeenEthics, é uma equipe de <a href="https://keenethics.com/services-web-development">desenvolvedores de aplicativos da web</a> experientes. Caso precise de um orçamento gratuito de um projeto semelhante, sinta-se à vontade para <a href="https://keenethics.com/contacts?activeForm=estimate">entrar em contato</a>.</p><p>Você pode ler mais artigos semelhantes no blog do autor, o Keen Blog. Permita-me sugerir que você leia <a href="https://keenethics.com/blog/1554572000000-refactoring">Why to Refactor Your Code?</a> (em inglês) ou <a href="https://keenethics.com/blog/outsourcing-vs-outstaffing">Software Development Models Explained: &nbsp;Outsourcing vs Outstaffing, &nbsp;Fixed Price vs Time &amp; Material?</a> (também em inglês)</p><h2 id="nota-final">Nota final</h2><p>Por fim, o autor original gostaria de registrar seu "obrigado" a <a href="https://www.linkedin.com/in/oleksiy-pletnov-212b3764/">Alex Pletnov</a>, por ser o coautor do artigo original, bem como aos leitores por chegarem até o final do texto!</p><p>O artigo original, postado no blog da KeenEthics, pode ser encontrado aqui: <a href="https://keenethics.com/blog/1517306255770-docker-5-cases-when-you-should-not-use-it">7 Cases When Not to Use Docker</a> (em inglês).</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Um guia para iniciantes em Docker — como criar sua primeira aplicação com o Docker ]]>
                </title>
                <description>
                    <![CDATA[ Você é um desenvolvedor e deseja começar a usar o Docker? Este artigo é para você. Após uma breve apresentação sobre o que o Docker é e sobre o motivo para usá-lo, você poderá criar sua primeira aplicação com o Docker. O que é o Docker? Docker [https://www.docker.com/] é um ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/um-guia-para-iniciantes-em-docker-como-criar-sua-primeira-aplicacao-com-o-docker/</link>
                <guid isPermaLink="false">62bd551ca3520206e79cf217</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Thu, 30 Jun 2022 08:41:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/1_5ErAAkV5REH3bE6-xAzzFg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A beginner’s guide to Docker — how to create your first Docker application</a>
      </p><h3 id="voc-um-desenvolvedor-e-deseja-come-ar-a-usar-o-docker-este-artigo-para-voc-">Você é um desenvolvedor e deseja começar a usar o Docker? Este artigo é para você.</h3><p>Após uma breve apresentação sobre o que o Docker é e sobre o motivo para usá-lo, você poderá criar sua primeira aplicação com o Docker.</p><h4 id="o-que-o-docker"><strong>O que é o <strong><strong>Docker?</strong></strong></strong></h4><p><a href="https://www.docker.com/" rel="noopener">Docker</a> é um software livre desenvolvido pela Docker Inc. Ele foi apresentado ao público em geral em 13 de março de 2013 e se tornou desde então algo necessário no mundo do desenvolvimento em tecnologia.</p><p>Ele permite que os usuários criem ambientes de desenvolvimento independentes e isolados para lançar e implantar suas aplicações. Esses ambientes são, então, chamados de contêineres (<em>containers</em>, em inglês).</p><p>Isso permitirá ao desenvolvedor executar um contêiner em qualquer máquina.</p><p>Como você pode ver, com o Docker, não há mais problemas de dependências ou de compilação. Tudo o que você precisa é lançar seu contêiner e a aplicação iniciará imediatamente.</p><h4 id="o-docker-portanto-uma-m-quina-virtual"><strong>O<strong><strong> Docker</strong></strong>, portanto, é uma máquina<strong><strong> virtual?</strong></strong></strong></h4><p>Esta é uma das perguntas que mais são feitas com relação ao Docker. A resposta é: bem, não exatamente.</p><p>Ele até pode parecer com uma máquina virtual para começar, mas a funcionalidade não é a mesma.</p><p>Diferente do Docker, uma máquina virtual incluirá todo o sistema operacional. Ela funcionará de modo independente e agirá como um computador.</p><p>O Docker compartilhará apenas os recursos da máquina <em>host</em> para executar seus ambientes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Blog.-Are-containers-..VM-Image-1-1024x435.png" class="kg-image" alt="Blog.-Are-containers-..VM-Image-1-1024x435" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Blog.-Are-containers-..VM-Image-1-1024x435.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/Blog.-Are-containers-..VM-Image-1-1024x435.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Blog.-Are-containers-..VM-Image-1-1024x435.png 1024w" sizes="(min-width: 720px) 720px" width="1024" height="435" loading="lazy"><figcaption>Docker x máquinas virtuais (copyright: <a href="https://blog.docker.com/2018/08/containers-replacing-virtual-machines/" rel="noopener">blog do Docker</a>)</figcaption></figure><h4 id="qual-o-motivo-para-usar-o-docker-como-um-desenvolvedor"><strong>Qual o motivo para usar o <strong><strong>Docker </strong></strong>como um desenvolvedor<strong><strong>?</strong></strong></strong></h4><p>Essa ferramenta pode realmente mudar a vida diária de um desenvolvedor. Para melhor responder a essa pergunta, eu escrevi uma lista abrangente de benefícios que você encontrará:</p><ul><li>O Docker é rápido. Diferentemente de uma máquina virtual, sua aplicação pode ser iniciada em poucos segundos e encerrada com a mesma rapidez.</li><li>O Docker é multiplataforma. Você pode lançar seu contêiner em qualquer sistema.</li><li>Contêineres podem ser criados e destruídos mais rapidamente do que uma máquina virtual.</li><li>Você não terá mais a dificuldade de configurar seu ambiente de trabalho. Quando o Docker estiver configurado, você nunca terá de reinstalar suas dependências de modo manual novamente. Se trocar de computador ou se um novo funcionário se juntar à empresa, tudo o que você precisa fazer é dar a ele ou ela sua configuração.</li><li>Você mantém limpo seu espaço de trabalho, já que cada um dos ambientes estará isolado e você poderá exclui-los a qualquer momento, sem causar impacto ao resto.</li><li>Será mais fácil implantar seu projeto em seu servidor para colocá-lo on-line.</li></ul><h3 id="vamos-criar-sua-primeira-aplica-o"><strong>Vamos criar sua primeira aplicação</strong></h3><p>Agora que você sabe o que o Docker é, está na hora de criar sua primeira aplicação!</p><p>A finalidade deste tutorial breve é criar um programa em Python que exiba uma frase. Esse programa terá de ser lançado por meio de um Dockerfile.</p><p>Como você verá, não é complicado quando você compreende o processo.</p><blockquote>Observação: você não precisará instalar o Python em seu computador. Ele funcionará no ambiente do Docker para conter o Python que executará o seu código.</blockquote><h4 id="1-instalar-o-docker-em-sua-m-quina"><strong>1. Instalar o Docker em sua máquina</strong></h4><p><em>Para o <em>Ubuntu:</em></em></p><p>Primeiro, faça a atualização de seus pacotes:</p><pre><code>$ sudo apt update</code></pre><p>Em seguida, instale o Docker com <em>apt-get</em>:</p><pre><code>$ sudo apt install docker.io</code></pre><p>Por fim, verifique se o Docker está instalado corretamente:</p><pre><code>$ sudo docker run hello-world</code></pre><ul><li><em>Para o<em> MacOSX:</em></em> siga <a href="https://docs.docker.com/docker-for-mac/install/" rel="noopener">este link</a> (instruções em inglês).</li><li><em>Para o <em>Windows:</em></em> siga <a href="https://docs.docker.com/docker-for-windows/install/" rel="noopener">este link</a> (instruções em inglês).</li></ul><h4 id="2-criar-seu-projeto"><strong>2. Criar seu projeto</strong></h4><p>Para criar sua primeira aplicação em Docker, convido você a criar uma pasta em seu computador. Ela deve ter os dois arquivos abaixo:</p><ul><li>Um arquivo '<em><em>main.py</em></em>' (arquivo em Python que conterá o código a ser executado).</li><li>Um arquivo '<em><em>Dockerfile</em></em>' (arquivo do Docker que conterá as instruções necessárias para criar o ambiente).</li></ul><p>Normalmente, você deverá ter a seguinte arquitetura de pasta:</p><pre><code>.
├── Dockerfile
└── main.py
0 directories, 2 files</code></pre><h4 id="3-editar-o-arquivo-em-python"><strong>3. Editar o arquivo em Python</strong></h4><p>Você pode adicionar o código a seguir ao arquivo '<em><em>main.py</em></em>':</p><pre><code class="language-python">#!/usr/bin/env python3

print("O Docker é mágico!")</code></pre><p>Nada de excepcional, mas assim que você ver a linha "O <em><em>Docker </em>é mágico<em>!</em></em>" exibida em seu terminal, saberá que o Docker está funcionando.</p><h4 id="4-editar-o-arquivo-docker"><strong>4. Editar o arquivo Docker</strong></h4><p>Um pouco de teoria: a primeira coisa a fazer quando quiser criar seu arquivo Dockerfile é se perguntar o que você quer fazer. O objetivo aqui é lançar código em Python.</p><p>Para fazer isso, nosso Docker deve conter todas as dependências necessárias para lançar o Python. Um sistema Linux (Ubuntu) com o Python instalado nele deve ser o suficiente.</p><p>O primeiro passo ao criar um arquivo do Docker é acessar o site da web do <a href="https://hub.docker.com/" rel="noopener">DockerHub</a>. Ele contém diversas imagens pré-projetadas para poupar seu tempo (por exemplo: todas as imagens para o Linux ou linguagens de código).</p><p>Em nosso caso, digitaremos 'Python' na barra de pesquisa. O primeiro resultado é <a href="https://hub.docker.com/_/python" rel="noopener">a imagem oficial</a> criada para executar o Python. Perfeito! Vamos usá-la!</p><pre><code class="language-python"># Um dockerfile sempre deve começar importando a imagem de base.
# Usamos a palavra-chave 'FROM' para isso.
# Em nosso exemplo, queremos importar a imagem do python.
# Assim, escrevemos 'python' para o nome da imagem e 'latest' para  a versão.
FROM python:latest

# Para lançar nosso código em Python, devemos importá-lo em nossa imagem.
# Usamos para isso a palavra-chave 'COPY'.
# O primeiro parâmetro, 'main.py', é o nome do arquivo no host.
# O segundo parâmetro, '/', é o caminho onde colocar o arquivo na imagem.
# Aqui, colocamos o arquivo na pasta raiz da imagem.
COPY main.py /

# Precisamos definir o comando para lançar quando rodarmos a imagem.
# Usamos a palavra-chave 'CMD' para isso.
# O comando a seguir executará "python ./main.py".
CMD [ "python", "./main.py" ]</code></pre><h4 id="4-criar-uma-imagem-do-docker"><strong>4. Criar uma imagem do Docker</strong></h4><p>Quando seu código estiver pronto e o Dockerfile estiver escrito, tudo o que você precisa fazer é criar sua imagem para que contenha sua aplicação.</p><pre><code>$ docker build -t python-test . </code></pre><p>A opção '<em><em>-t</em></em>' permite que você defina o nome de sua imagem. Em nosso caso, escolhemos '<em><em>python-test</em></em>', mas você pode usar o nome que quiser.</p><h4 id="5-executar-a-imagem-do-docker"><strong>5. Executar a imagem do Docker</strong></h4><p>Quando a imagem for criada, seu código estará pronto para ser lançado.</p><pre><code>$ docker run python-test</code></pre><p>Você precisa colocar o nome de sua imagem após '<em><em>docker run</em></em>'.</p><p>Aí está. Você, agora, deverá ver "O Docker é mágico!" sendo exibido em seu terminal.</p><h3 id="o-c-digo-est-dispon-vel"><strong>O código está disponível</strong></h3><p>Se deseja obter o código completo para descobri-lo facilmente ou executá-lo, eu o coloquei à sua disposição no meu GitHub.</p><p><strong><strong>-&gt;</strong></strong> <a href="https://github.com/gael-thomas/Docker-First-Application-example">GitHub: exemplo de primeira aplicação com o Docker</a> (<em>readme.md</em> em inglês)</p><h3 id="comandos-teis-para-o-docker"><strong>Comandos úteis para o Docker</strong></h3><p>Antes de encerrar, preparei uma lista de comandos que pode ser útil para você no Docker.</p><ul><li>Listar suas imagens.</li></ul><pre><code>$ docker image ls</code></pre><ul><li>Excluir uma imagem específica.</li></ul><pre><code>$ docker image rm [nome da imagem]</code></pre><ul><li>Excluir todas as imagens existentes.</li></ul><pre><code>$ docker image rm $(docker images -a -q)</code></pre><ul><li>Listar todos os contêineres existentes (em execução ou não).</li></ul><pre><code>$ docker ps -a</code></pre><ul><li>Parar um contêiner específico.</li></ul><pre><code>$ docker stop [nome do contêiner]</code></pre><ul><li>Parar todos os contêineres em execução.</li></ul><pre><code>$ docker stop $(docker ps -a -q)</code></pre><ul><li>Excluir um contêiner específico (que não estiver em execução).</li></ul><pre><code>$ docker rm [nome do contêiner]</code></pre><ul><li>Excluir todos os contêineres (apenas se estiverem parados).</li></ul><pre><code>$ docker rm $(docker ps -a -q)</code></pre><ul><li>Exibir os logs (registros) de um contêiner.</li></ul><pre><code>$ docker logs [nome do contêiner]</code></pre><h4 id="e-agora"><strong>E agora?</strong></h4><p>Depois de receber o feedback sobre o texto, decidi escrever a segunda parte desse guia do iniciante. Nela, você descobrirá como usar o docker-compose para criar sua primeira aplicação client/servidor com o Docker.</p><p>-&gt; <a href="https://herewecode.io/blog/a-beginners-guide-to-docker-how-to-create-a-client-server-side-with-docker-compose/">A beginner’s guide to Docker — how to create a client/server side with docker-compose</a> (texto em inglês)</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Você pode usar este artigo como referência sempre que precisar de um exemplo simples e concreto de como criar sua primeira aplicação em Docker. Se tiver perguntas ou comentários, fique à vontade para perguntar ao autor.</p><p>Se quiser mais conteúdo como este, você pode <a href="https://twitter.com/gaelgthomas">seguir o autor no Twitter</a>. Lá, ele faz tweets sobre desenvolvimento para a web, autoaperfeiçoamento e sobre sua jornada como desenvolvedor <em>full-stack</em>!</p><p>Você também pode encontrar outros artigos como este no site da web do autor: <a href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f/herewecode.io">herewecode.io</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como habilitar o live-reload em aplicações do Docker utilizando volumes ]]>
                </title>
                <description>
                    <![CDATA[ Neste artigo, você vai aprender como configurar um ambiente de desenvolvimento com o live-reload habilitado. Com isso, você poderá fazer com que aplicações legadas usem Docker, volumes do Docker e o docker-compose. Alguns desenvolvedores torcem o nariz quando o assunto é utilizar o Docker em seus ambientes de desenvolvimento. Eles ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-habilitar-o-live-reload-em-aplicacoes-do-docker-utilizando-volumes/</link>
                <guid isPermaLink="false">62ac9a40253a6406db9bb7ec</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Cássio Leodegario ]]>
                </dc:creator>
                <pubDate>Tue, 21 Jun 2022 14:30:48 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/5f9c9a0f740569d1a4ca233c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-enable-live-reload-on-docker-based-applications/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Enable Live-reload on Docker-based Applications with Docker Volumes</a>
      </p><p>Neste artigo, você vai aprender como configurar um ambiente de desenvolvimento com o <em>live-reload</em> habilitado. Com isso, você poderá fazer com que aplicações legadas usem Docker, volumes do Docker e o docker-compose.</p><p>Alguns desenvolvedores torcem o nariz quando o assunto é utilizar o Docker em seus ambientes de desenvolvimento. Eles dizem que o Docker não é bom para desenvolvimento, pois é preciso reconstruir a imagem toda hora para refletir as novas alterações. Isso torna o trabalho improdutivo e lento.</p><p>Neste artigo, nosso objetivo é combater esse pensamento, demonstrando como algumas configurações simples podem trazer muitos benefícios, como a possibilidade de ter um ambiente confiável, tanto em produção, como em desenvolvimento.</p><p>Ao final deste artigo, você terá aprendido a:</p><ul><li>Configurar aplicações legadas para rodar em contêineres do Docker;</li><li>Habilitar o cache de dependências em módulos do <em>Node.js</em>;</li><li>Habilitar o <em>live-reload</em> utilizando volumes do Docker;</li><li>Agregar todos os serviços utilizando o docker-compose.</li></ul><h2 id="requisitos"><strong>Requisitos</strong></h2><p>Nos próximos passos, você vai clonar um projeto existente para executar todos os exemplos deste artigo. Antes de começar a escrever código, certifique-se de que você possui as seguintes ferramentas instaladas no seu computador:</p><ul><li><a href="https://docs.docker.com/desktop/">Docker</a> e <a href="https://docs.docker.com/compose/">Docker compose</a></li><li><a href="https://nodejs.org/en/download/current/">Node.js 1</a>0+</li><li><a href="https://code.visualstudio.com/download">Git</a></li></ul><h2 id="por-que-usar-o-docker"><strong>Por que usar o Docker<strong><strong><strong>?</strong></strong></strong></strong></h2><p>A todo momento, vemos na internet o surgimento de novas tecnologias de ponta. Elas são estáveis, e é divertido trabalhar com coisas novas, mas elas não são tão previsíveis quando estamos trabalhando nos mais diversos ambientes. Então, um grupo de desenvolvedores criou o Docker para reduzir as chances de possíveis erros nestes cenários de mudança de ambiente.</p><p>O Docker é uma das minhas ferramentas favoritas e eu o utilizo para trabalhar com aplicações desktop, web ou IoT. Agora, eu tenho o poder de mover minhas aplicações para os mais diversos ambientes, podendo também manter meu ambiente local sempre limpo.</p><p>Desenvolvedores que trabalham com tecnologias de ponta estão sempre mexendo com algo novo. Mas, e quanto às aplicações legadas? Deveríamos simplesmente reescrever tudo com uma nova tecnologia? Eu sei que isso não é tão simples quanto parece. Nós devemos trabalhar com coisas novas, mas também devemos sempre manter e aprimorar as aplicações existentes.</p><p>Vamos dizer que você decidiu trocar de servidores baseados em Windows para servidores baseados em Unix. Como isso deveria ser feito? Você sabe todas as dependências que seu aplicativo precisa para funcionar?</p><h2 id="como-um-ambiente-de-desenvolvimento-deveria-ser"><strong>Como um ambiente de desenvolvimento deveria ser?</strong></h2><p>Desenvolvedores estão sempre tentando ser mais produtivos. Para isso, muitas vezes, tentamos adicionar <em>plugins, boilerplates</em> e bases de códigos prontas em nossas IDEs/editores/terminais. Na minha opinião, porém, o ambiente de desenvolvimento ideal deveria ser:</p><ol><li>Fácil de executar e testar;</li><li>Agnóstico ao ambiente;</li><li>Rápido de avaliar/testar modificações;</li><li>Fácil de replicar em qualquer computador.</li></ol><p>Nas próximas seções deste artigo, nós configuraremos uma aplicação que tem como base os princípios citados acima. Caso você ainda não tenha ouvido falar de <em>live-reload</em> (ou <em>hot reload</em>), sua tradução literal seria "atualização em tempo real", que nada mais é do que uma funcionalidade que fica observando as modificações que são feitas no código e reinicia a aplicação automaticamente. Com isso, você não precisa ficar toda hora fazendo o <em>build </em>e reiniciando sua aplicação.</p><h2 id="come-ando"><strong>Começando</strong></h2><p>Primeiro, você vai precisar de uma pasta vazia chamada <code>post-docker-livereload</code>, que será nosso local de trabalho. Acesse este <a href="https://github.com/ErickWendel/nodejs-with-mongodb-api-example">repositório do Github</a> e faça um clone dentro dele na pasta post-docker-live-reload.</p><p>Após clonar o repositório no seu ambiente local, vamos analisar quais os requerimentos da aplicação. Dando uma rápida olhada no arquivo README.md, podemos ver algumas instruções de como executar a aplicação, como mostra a imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-06-24-at-18.10.43-1.png" class="kg-image" alt="Screen-Shot-2020-06-24-at-18.10.43-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/Screen-Shot-2020-06-24-at-18.10.43-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/Screen-Shot-2020-06-24-at-18.10.43-1.png 889w" sizes="(min-width: 720px) 720px" width="889" height="530" loading="lazy"></figure><p>É necessário ter o Node.js na versão 10 ou superior e o MongoDB. Ao invés de fazermos uma instalação do MongoDB no seu ambiente local, vamos instalá-lo utilizando o Docker. Você vai expor o MongoDB em localhost:27017. Assim, mesmo aplicações executadas fora do Docker poderão acessá-lo sem a necessidade de conhecer o IP interno que é utilizado no Docker.</p><p>Copie o comando abaixo e cole no seu terminal:</p><pre><code class="language-bash">docker run --name mongodb -p 27017:27017 -d mongo:4</code></pre><p>Com o comando acima, você baixará e executará uma instância do MongoDB. Observe que, caso você já tenha uma instância com o mesmo nome, o comando lançará um erro de nome inválido.</p><p>Caso ocorra o erro, você pode remover a instalação anterior rodando o comando <code>docker rm mongodb</code>. Com isso, você removerá qualquer instância anterior e poderá rodar o comando <code>docker run</code> novamente.</p><h2 id="explorando-a-aplica-o"><strong>Explorando a aplicação</strong></h2><p>O arquivo README.md diz que, antes de rodar sua aplicação, você precisará de uma instância do MongoDB, juntamente com o Node.js.</p><p>Se você já tiver instalado o Node.js, vá para a pasta <code>nodejs-with-mongodb-api-example</code> e execute os seguintes comandos:</p><pre><code class="language-bash">npm i 
npm run build 
npm start</code></pre><p>Após executar esses comandos, vá até o navegador e acesse <a href="http://localhost:3000/">http://localhost:3000</a>. Assim, você poderá visualizar a aplicação sendo executada, como mostra a imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/01-start.gif" class="kg-image" alt="01-start" width="1920" height="1080" loading="lazy"></figure><p>Tenha em mente que a aplicação já possui um comando para habilitar o <em>live-reload</em> que é o <code>npm run dev:watch</code>. O fluxo deve seguir os seguintes passos:</p><ol><li>O desenvolvedor muda um arquivo Typescript;</li><li>Os arquivos Typescript são transpilados (convertidos) para JavaScript;</li><li>O servidor identifica as modificações nos arquivos JavaScript e reinicia o servidor Node.js.</li></ol><p>Então, fazendo um espelhamento dos arquivos para os contêineres Docker, essas alterações serão refletidas para o contêiner também. O comando <code>npm run build:watch</code> vai capturar as alterações e gerar novos arquivos na pasta <em>lib. </em>Então, todas as vezes que o comando <code>npm run dev:run</code> for disparado, o servidor será reiniciado.</p><h2 id="dockerizando-a-aplica-o"><strong>Dockerizando a aplicação</strong></h2><p>Caso o Docker seja um mundo completamente novo para você, não tenha medo! Você fará essa configuração do zero. Você vai precisar criar apenas alguns arquivos para começar:</p><ol><li><code>Dockerfile</code> - é como uma receita onde será descrito como instalar sua aplicação;</li><li><code>.dockerignore</code> - um arquivo onde listamos quais arquivos não irão para a instância do contêiner.</li></ol><h3 id="criando-o-dockerfile"><strong>Criando o Dockerfile</strong></h3><p>Dockerfile é o conceito chave aqui. Nele, você especifica os passos e dependências para preparar e executar a aplicação. Desde que você tenha lido o arquivo README.md, será muito fácil de implementar o arquivo de "receita".</p><p>Vou colocar todo arquivo aqui e, mais para a frente, vamos explorá-lo mais a fundo. Na sua pasta <code>nodejs-with-mongodb-api-example</code>, crie um arquivo com o nome <code>Dockerfile</code><em><em> </em></em>e cole o código abaixo.</p><pre><code class="language-dockerfile">FROM node:14-alpine

WORKDIR /src

ADD package.json /src 

RUN npm i --silent

ADD . /src 

RUN npm run build 

CMD npm start</code></pre><p>O que estamos fazendo no Dockerfile?</p><ul><li>Na primeira linha - utilizamos uma imagem base do Node.js 14 - versão alpine; </li><li>Da linha 2 até a linha 4 - é feita a cópia e instalação das dependências do Node.js do host para o contêiner. Note que a ordem aqui é importante. Adicionar o package.json para a pasta src antes de restaurar as dependências vai criar um <em>cache </em>e evitar que toda a vez que você fizer o <em>build </em>da imagem os pacotes sejam baixados novamente;</li><li>Da linha 6 até a linha 7 - é feita a compilação e logo após a execução do programa como mencionado no arquivo README.md;</li></ul><h3 id="ignorando-arquivos-desnecess-rios-com-o-dockerignore"><strong>Ignorando arquivos desnecessários com o <strong>.dockerignore</strong></strong></h3><p>Atualmente, eu estou trabalhando com um sistema operacional baseado em OSX. O contêiner Docker vai executar em um sistema operacional baseado em Alpine Linux. Quando você executar o comando <code>npm install</code>,<em><em> </em></em>serão baixadas as dependências para o ambiente específico.</p><p>Agora, você vai criar um arquivo para ignorar o código gerado no seu ambiente local - por exemplo, a pasta <em>node_modules</em> e a pasta <em>lib<em>.</em></em> Assim, garantimos que, quando você fizer a cópia dos arquivos do seu diretório atual para o contêiner, nenhuma dependência indesejada seja copiada também.</p><p>Na pasta <code>nodejs-with-mongodb-api-example</code>, crie um arquivo com o nome <code>.dockerignore</code><em><em> </em></em>e cole o código abaixo:</p><pre><code class="language-txt">node_modules/
lib/</code></pre><h3 id="construindo-a-imagem-docker"><strong>Construindo a imagem Docker</strong></h3><p>Eu prefiro executar essa aplicação a partir da pasta raiz. Volte para a pasta <code>post-docker-live-reload</code> e execute os comandos a seguir para preparar a imagem para a utilizarmos mais adiante:</p><pre><code class="language-shell">docker build -t app nodejs-with-mongodb-api-example</code></pre><p>Repare que o comando acima utiliza a <em>flag </em><code>-t</code> para definir o nome da imagem. Logo depois disso, é informada a pasta que contém o arquivo <code>Dockerfile</code>.</p><h3 id="trabalhando-com-volumes"><strong>Trabalhando com<strong> volumes</strong></strong></h3><p>Antes de executar a aplicação, vamos fazer alguns "<em>hacks</em>" para melhorar nossa experiência com os contêineres do Docker.</p><p>Os volumes no Docker nos permitem espelhar arquivos da nossa máquina local para o ambiente do Docker. Você também pode compartilhar volumes entre diversos contêineres e reaproveitá-los para criar um <em>cache </em>das dependências.</p><p>Nosso objetivo aqui é observar qualquer mudança nos nossos arquivos <code>.ts</code> do ambiente local e espelhar essas mudanças para o contêiner, mesmo que os arquivos e a pasta <code>node_modules</code> estejam no mesmo diretório.</p><p>Você se lembra quando eu disse que as dependências podem ser diferentes dependendo do sistema operacional? Para ter certeza que nosso ambiente local não vai afetar o ambiente do Docker quando espelharmos os arquivos, nós vamos isolar a pasta <code>node_modules</code> do container em um volume separado.</p><p>Consequentemente, quando a pasta <code>node_modules</code> for criada no contêiner, ela não será criada na nosso ambiente local. Execute o comando abaixo no terminal para criar o volume:</p><pre><code>docker volume create --name nodemodules
</code></pre><h3 id="executando-e-habilitando-o-live-reload"><strong>Executando e habilitando o <strong><em>live-reload</em></strong></strong></h3><p>Como você já sabe, o comando <code>npm run dev:watch</code> especificado no arquivo README.md mostra como habilitar o <em>live-reload</em>. O problema é que você está programando em sua máquina local e suas alterações devem se refletir no contêiner.</p><p>Executando o comando abaixo, você vai conectar seu ambiente local com o contêiner do Docker. Assim, qualquer alteração na pasta <code><code>nodejs-with-mongodb-api-example</code></code> será refletida na pasta <code>src</code> do contêiner.</p><pre><code class="language-shell">docker run \
    --name app \
    --link mongodb \
    -e MONGO_URL=mongodb \
    -e PORT=4000 \
    -p 4000:4000 \
    -v `pwd`/nodejs-with-mongodb-api-example:/src \
    -v nodemodules:/src/node_modules \
    app npm run dev:watch</code></pre><p>Vamos nos aprofundar no que está sendo feito aqui:</p><ul><li><code>--link</code> - dá a permissão para a aplicação acessar a instância do MongoDB;</li><li><code>-e</code> - são as variáveis de ambiente. Como mencionado no arquivo README.md, você pode especificar a <em>string </em>de conexão da instância do MongoDB a qual você quer se conectar sobrescrevendo a variável <code>MONGO_URL</code>. Sobrescreva a variável <code>PORT</code>, caso queira que a aplicação seja executada em uma porta diferente. Observe que o valor de <code>mongodb</code> é o mesmo que usamos para criar a nossa instância do MongoDB nas seções anteriores. Este valor também é um apelido para o IP interno da instância do MongoDB;</li><li><code>-v</code> - mapeia o diretório atual para o contêiner do Docker utilizando um volume virtual. Utilizando o comando <code>pwd</code>, você tem acesso ao caminho absoluto para seu diretório de trabalho atual e, em seguida, para a pasta que você gostaria de espelhar no contêiner do Docker, que, no caso, é o diretório <code>:/src</code>. A pasta <code>src</code> representa a instrução <code>WORKDIR</code>, definida no arquivo <code>Dockerfile</code>, para que possamos espelhar nosso diretório local para a pasta src do contêiner do Docker;</li><li><code>-v</code> - este segundo volume serve para espelhar a pasta <code>node_modules</code> do contêiner de maneira individual;</li><li><code>app</code> - é o nome da imagem;</li><li><code>npm run dev:watch</code> - este último comando vai sobrescrever o comando <code>CMD</code> que está no <code>Dockerfile</code>.</li></ul><p>Após executar o comando acima, você pode acessar o browser novamente e fazer algumas alterações no seu arquivo <code>index.ts</code> para ver os resultados (atente-se que utilizamos a porta 4000 no comando <em>shell</em>). O vídeo abaixo demonstra esses passos:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/O9vEQhU_JEM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="Example of live reload working - freeCodeCamp post" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="finalizando"><strong>Finalizando</strong></h2><p>Você sabe que trabalhar com comandos <em>shell </em>funciona. Não é muito comum , no entanto, usá-los aqui. Também não é muito produtivo executar todos esses comandos, construir as imagens e gerenciar as instâncias manualmente. Então, vamos fazer uma composição!</p><p>O Docker Compose é uma forma de simplificar a agregação e a conexão entre os serviços. Você pode especificar os bancos de dados, os logs, as aplicações, os volumes, as redes e assim por diante.</p><p>Primeiro, será preciso remover todas as instâncias inativas para evitar conflito nas portas expostas. Execute o seguinte comando no seu terminal para remover os volumes, serviços e contêineres:</p><pre><code class="language-bash">docker rm app 
docker volume rm nodemodules
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)</code></pre><h3 id="o-arquivo-docker-compose"><strong>O arquivo <strong>docker-compose</strong></strong></h3><p>Crie um arquivo <code>docker-compose.yml</code> na sua pasta <code>post-docker-livereload</code> usando as informações abaixo:</p><pre><code class="language-yaml">version: '3'
services:
    mongodb:
        image: mongo:4
        ports:
            - 27017:27017
    app:
        build: nodejs-with-mongodb-api-example
        command: npm run dev:watch
        ports:
            - 4000:4000
        environment: 
            MONGO_URL: mongodb
            PORT: 4000
        volumes:
            - ./nodejs-with-mongodb-api-example:/src/
            - nodemodules:/src/node_modules
        links:
            - mongodb
        depends_on: 
            - mongodb

volumes:
    nodemodules: {}</code></pre><p>O arquivo acima especifica os recursos por seções. Repare que, nele, você possui as seções <code>links</code> e <code>depends_on</code>. O campo <em>links</em> representa a mesma <em>flag </em>que você utilizou no comando <em>shell</em>. O campo <code>depends_on</code> vai garantir que o MongoDB é uma dependência necessária para executar a aplicação. Isso fará com que o MongoDB seja executado antes da aplicação magicamente!</p><p>Voltando ao terminal, para iniciar os serviços, construir a imagem do Docker, criar os volumes e os links, execute o seguinte comando:</p><pre><code class="language-shell">docker-compose up --build</code></pre><p>Caso você precise remover todos os serviços criados anteriormente pelo <code>Dockerfile</code>, também pode executar o comando <code>docker-compose down</code>.</p><h2 id="o-docker-seu-amigo-"><strong>O Docker é seu amigo<strong>!</strong></strong></h2><p>É isso, meu amigo. O Docker pode te ajudar a prevenir muitos erros. Você pode utilizá-lo tanto em aplicações <em>front-end </em>como em aplicações <em>back-end</em>. Até mesmo com IoT, quando é necessário controlar um <em>hardware</em>, você pode especificar políticas utilizando o Docker.</p><p>Como um próximo passo, eu recomendo fortemente que você dê uma olhada em ferramentas de orquestração de contêineres, como o Kubernetes e o Docker swarm. Elas podem melhorar ainda mais suas aplicações existentes e ajudar você a atingir um outro nível.</p><h2 id="muito-obrigado-por-ler-at-aqui"><strong>Muito obrigado por ler até aqui</strong></h2><p>Eu fico muito grato por esse tempo que passamos juntos. Espero que esse conteúdo seja mais do que apenas texto. Espero que ele ajude você a se tornar um pensador melhor e também um programador melhor. Siga-me no <a href="https://twitter.com/erickwendel_">Twitter</a> e confira meu <a href="https://erickwendel.com/">blog pessoal</a>, onde eu compartilho muitos conteúdos especiais.</p><p>Até mais!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como obter o endereço IP de um contêiner do Docker - Explicado e com exemplos ]]>
                </title>
                <description>
                    <![CDATA[ O Docker fornece a capacidade e "empacotar" e executar uma aplicação em um ambiente relativamente isolado, chamado de contêiner. Eu sei o que você está pensando – ah, não, outro artigo explicando o que é o Docker! A gente encontra isso em todo lugar agora! Mas não se preocupe. Pularemos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-obter-o-endereco-ip-de-um-conteiner-do-docker-explicado-e-com-exemplos/</link>
                <guid isPermaLink="false">61aa11613515f60519009741</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Fri, 03 Dec 2021 23:20:23 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/5f9c9a19740569d1a4ca2384.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-get-a-docker-container-ip-address-explained-with-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Get A Docker Container IP Address - Explained with Examples</a>
      </p><p>O Docker fornece a capacidade e "empacotar" e executar uma aplicação em um ambiente relativamente isolado, chamado de contêiner.</p><p>Eu sei o que você está pensando – ah, não, outro artigo explicando o que é o Docker! A gente encontra isso em todo lugar agora!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/docker-i-see.jpg" class="kg-image" alt="docker-i-see" srcset="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/docker-i-see.jpg 600w" width="600" height="327" loading="lazy"></figure><p>Mas não se preocupe. Pularemos a parte introdutória. O público alvo desse artigo já deve ter um conhecimento básico sobre o Docker e sobre contêineres.</p><p>Mas você já se perguntou sobre como obter o endereço IP de um contêiner do Docker?</p><h2 id="rede-do-docker-explicada"><strong>Rede do Docker explicada</strong></h2><p><br>Primeiro, vamos entender como a rede do Docker funciona. Para isso, vamos nos concentrar na rede <code>bridge</code> padrão. Ao usar o Docker, se você não especificar um driver, este é o tipo de rede que você usará.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/docker-network.png" class="kg-image" alt="docker-network" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/docker-network.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2021/12/docker-network.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/docker-network.png 1154w" sizes="(min-width: 720px) 720px" width="1154" height="1076" loading="lazy"><figcaption>Rede do Docker em: <a href="https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/">understanding-docker-networking-drivers-use-cases</a></figcaption></figure><p>A rede <code>bridge</code> funciona como uma rede interna privada para o host de modo que os contêineres dentro dele possam se comunicar. O acesso externo é garantido ao expor portas para os contêineres.</p><p>As redes bridge são usadas quando suas aplicações rodam em contêineres autônomos que precisam se comunicar.</p><p>Na figura acima, <code>db</code> e <code>web</code> podem se comunicar entre eles em uma rede bridge criada pelo usuário, chamada <code>mybridge</code>.</p><p>Se você nunca adicionou uma rede no Docker, deverá ver algo semelhante a isso:</p><pre><code class="language-bash">$ docker network ls

NETWORK ID          NAME                  DRIVER              SCOPE
c3cd46f397ce        bridge                bridge              local
ad4e4c24568e        host                  host                local
1c69593fc6ac        none                  null                local</code></pre><p>A rede <code>bridge</code> padrão está listada, junto com <code>host</code> e <code>none</code>. &nbsp;Ignoraremos as outras duas e usaremos a rede <code>bridge</code> ao chegar aos exemplos.</p><h2 id="endere-o-ip-do-cont-iner-do-docker"><strong>Endereço IP do contêiner do Docker</strong></h2><p><br>Por padrão, o contêiner recebe um endereço IP para cada rede do Docker a qual ele se conecta. Cada rede é criada com uma máscara de sub-rede padrão, usando-a como um pool posteriormente para fornecer o endereço IP.</p><p>Em geral, o Docker usa a sub-rede padrão <strong><strong>172.17. 0.0/16</strong></strong> para colocar o contêiner em rede.</p><p>Para entender isso melhor, vamos executar um caso de uso real.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/flamenco-done.png" class="kg-image" alt="flamenco-done" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/flamenco-done.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2021/12/flamenco-done.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/flamenco-done.png 1516w" sizes="(min-width: 720px) 720px" width="1516" height="912" loading="lazy"></figure><h3 id="exemplo-do-docker"><strong>Exemplo do Docker</strong></h3><p><br>Para ilustrar, usaremos um ambiente de Hive e Hadoop, contendo 5 contêineres do Docker.</p><p>Confira o arquivo <code>docker-compose.yml</code> que estamos prestes a executar:</p><pre><code>version: "3"

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
    volumes:
      - namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
    env_file:
      - ./hadoop-hive.env
    ports:
      - "50070:50070"
  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
    volumes:
      - datanode:/hadoop/dfs/data
    env_file:
      - ./hadoop-hive.env
    environment:
      SERVICE_PRECONDITION: "namenode:50070"
    ports:
      - "50075:50075"
  hive-server:
    image: bde2020/hive:2.3.2-postgresql-metastore
    env_file:
      - ./hadoop-hive.env
    environment:
      HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore"
      SERVICE_PRECONDITION: "hive-metastore:9083"
    ports:
      - "10000:10000"
  hive-metastore:
    image: bde2020/hive:2.3.2-postgresql-metastore
    env_file:
      - ./hadoop-hive.env
    command: /opt/hive/bin/hive --service metastore
    environment:
      SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432"
    ports:
      - "9083:9083"
  hive-metastore-postgresql:
    image: bde2020/hive-metastore-postgresql:2.3.0

volumes:
  namenode:
  datanode:
</code></pre><p><a href="https://github.com/mesmacosta/docker-hive">Do GitHub <strong><strong>docker-hive</strong></strong></a></p><p>Ninguém quer ler um arquivo de configuração <strong>ENORME</strong>, certo? Então, aí vai uma imagem:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/Screen-Shot-2020-06-21-at-2.48.18-PM.png" class="kg-image" alt="Screen-Shot-2020-06-21-at-2.48.18-PM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/Screen-Shot-2020-06-21-at-2.48.18-PM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/Screen-Shot-2020-06-21-at-2.48.18-PM.png 837w" sizes="(min-width: 720px) 720px" width="837" height="635" loading="lazy"></figure><p>Melhor assim! Vamos começar com os contêineres:</p><pre><code class="language-bash">docker-compose up -d
</code></pre><p>Podemos ver 5 contêineres:</p><pre><code class="language-bash">$ docker ps --format \
"table {{.ID}}\t{{.Status}}\t{{.Names}}"

CONTAINER ID        STATUS                   NAMES
158741ba0339        Up 1 minutes             dockerhive_hive-metastore-postgresql
607b00c25f29        Up 1 minutes             dockerhive_namenode
2a2247e49046        Up 1 minutes             dockerhive_hive-metastore
7f653d83f5d0        Up 1 minutes (healthy)   dockerhive_hive-server
75000c343eb7        Up 1 minutes (healthy)   dockerhive_datanode</code></pre><p>Agora, vamos conferir as redes do Docker:</p><pre><code class="language-bash">$ docker network ls

NETWORK ID          NAME                  DRIVER              SCOPE
c3cd46f397ce        bridge                bridge              local
9f6bc3c15568        docker-hive_default   bridge              local
ad4e4c24568e        host                  host                local
1c69593fc6ac        none                  null                local</code></pre><p>Espere aí... tem uma nova rede chamada <code>docker-hive_default</code>!</p><p>Por padrão, o comando docker compose configura uma única rede para seu app. E a rede do app recebe seu nome com base no “nome do projeto”, originário do nome do diretório em que ele está.</p><p>Como o nome do nosso diretório é <code>docker-hive</code>, isso explica a nova rede.</p><p>Em seguida, veremos exemplos de como obter o endereço IP do contêiner do Docker.</p><h2 id="como-obter-o-endere-o-ip-do-cont-iner-do-docker-exemplos"><strong>Como obter o endereço IP do contêiner do Docker - exemplos</strong></h2><p>Agora que eu já tenho sua atenção, vamos revelar o mistério.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/bermuda-logged-out-1.png" class="kg-image" alt="bermuda-logged-out-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/bermuda-logged-out-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/bermuda-logged-out-1.png 999w" sizes="(min-width: 720px) 720px" width="999" height="912" loading="lazy"></figure><h3 id="1-usando-docker-inspect"><strong>1. Usando docker inspect</strong></h3><p><br>O comando docker inspect é uma ótima forma de obter informações de baixo nível sobre os objetos do Docker. Você pode pegar qualquer campo do JSON retornado de maneira bastante direta.</p><p>Vamos usá-lo para obter o endereço IP de <code>dockerhive_datanode</code>?</p><pre><code class="language-bash">$ docker inspect -f \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
75000c343eb7

172.18.0.5</code></pre><p>Você não disse que o Docker usa a sub-rede <strong><strong>172.17. 0.0/16</strong></strong> padrão para colocar o contêiner em rede? Por que o endereço IP retornado é <strong><strong>172.18.0.5</strong></strong> &nbsp;fora dele?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/Screen-Shot-2020-06-22-at-3.25.07-PM.png" class="kg-image" alt="Screen-Shot-2020-06-22-at-3.25.07-PM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/Screen-Shot-2020-06-22-at-3.25.07-PM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/Screen-Shot-2020-06-22-at-3.25.07-PM.png 798w" sizes="(min-width: 720px) 720px" width="798" height="437" loading="lazy"><figcaption>Imagem criada em <a href="https://tehnoblog.org/ip-tools/ip-address-in-cidr-range/">ip-address-in-cidr-range</a></figcaption></figure><p>Para responder isso, temos que olhar para nossas configurações de rede:</p><pre><code class="language-bash">$ docker network inspect -f \
'{{range .IPAM.Config}}{{.Subnet}}{{end}}'  9f6bc3c15568

172.18.0.0/16</code></pre><p>Executamos esse exemplo em uma máquina virtual do Compute Engine. Neste teste, a rede do Docker foi atribuída a uma sub-rede diferente: <strong><strong>172.18.0.0/16</strong></strong>. Isso explica a questão!</p><p>Além disso, podemos procurar os endereços IP na rede <code>docker-hive_default</code>.</p><p>Assim, não precisamos procurar o IP de cada contêiner individualmente:</p><pre><code class="language-bash">$ docker network inspect -f \
'{{json .Containers}}' 9f6bc3c15568 | \
jq '.[] | .Name + ":" + .IPv4Address'

"dockerhive_hive-metastore-postgresql:172.18.0.6/16"
"dockerhive_hive-metastore:172.18.0.2/16"
"dockerhive_namenode:172.18.0.3/16"
"dockerhive_datanode:172.18.0.5/16"
"dockerhive_hive-server:172.18.0.4/16"</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/cherry-success.png" class="kg-image" alt="cherry-success" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/cherry-success.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/cherry-success.png 989w" sizes="(min-width: 720px) 720px" width="989" height="912" loading="lazy"></figure><p>Caso não tenha percebido, usamos a ajuda do <a href="https://github.com/stedolan/jq"><strong><strong>jq</strong></strong></a> para analisar o objeto de mapa <code>Containers</code>.</p><h3 id="2-usando-docker-exec"><strong>2. Usando docker exec</strong></h3><p>No exemplo a seguir, trabalharemos com o <code>dockerhive_namenode</code>.</p><pre><code class="language-bash">$ docker exec dockerhive_namenode cat /etc/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3      607b00c25f29</code></pre><h3 id="3-dentro-do-cont-iner-do-docker"><strong>3. Dentro do contêiner do Docker</strong></h3><pre><code class="language-bash">$ docker exec -it dockerhive_namenode /bin/bash

# rodando dentro do contêiner dockerhive_namenode
ip -4 -o address

7: eth0    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0</code></pre><p>Podemos até encontrar os endereços IP de outros contêineres que estão dentro da mesma rede:</p><p><strong>Nó dos dados (data node)</strong></p><pre><code class="language-bash"># rodando dentro do contêiner dockerhive_namenode
ping dockerhive_datanode

PING dockerhive_datanode (172.18.0.5): 56 data bytes
64 bytes from 172.18.0.5: icmp_seq=0 ttl=64 time=0.092 ms</code></pre><p><strong>M<strong>etastore</strong> do Hive</strong></p><pre><code class="language-bash"># rodando dentro do contêiner dockerhive_namenode
ping dockerhive_hive-metastore

PING dockerhive_hive-metastore_1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.087 ms</code></pre><p><strong>Servidor do <strong>Hive</strong></strong></p><pre><code class="language-bash"># rodando dentro do contêiner
ping dockerhive_hive-server

PING dockerhive_hive-server (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: icmp_seq=0 ttl=64 time=0.172 ms</code></pre><h2 id="para-encerrar"><strong><strong>Para encerrar</strong></strong></h2><p>Todos os exemplos foram executados em uma VM de uma distribuição Linux no Compute Engine. Se você executar os exemplos nos ambientes macOS ou Windows, os comandos dos exemplos podem mudar um pouco.</p><p>Lembre-se, também, de que esses endereços IP dos exemplos dados são internos à rede <code>docker-hive_default</code> usada na amostra. Por isso, se você tiver um caso de uso para conectar esses contêineres externamente, precisará usar o IP externo da máquina do host (levando em conta que você estará expondo as portas dos contêineres corretamente).<br><br>Se estiver usando kubernetes, por exemplo, para gerenciar seus contêineres do Docker, <a href="https://www.freecodecamp.org/news/how-to-get-a-docker-container-ip-address-explained-with-examples/#:~:text=kubernetes%2Dexpose%2Dexternal%2Dip%2Daddress">permita que ele trate dos endereços IP para você</a>.</p><p><strong><strong>* I</strong>lustrações de<strong> <a href="https://icons8.com/">icons8.com</a> </strong>feitas por<strong> <a href="https://dribbble.com/muratkalkavan">Murat Kalkavan</a>.</strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Onde as imagens do Docker estão armazenadas? Caminhos dos contêineres do Docker explicados ]]>
                </title>
                <description>
                    <![CDATA[ O Docker vem sendo adotado amplamente e é usado para executar e escalar aplicações em produção. Além disso, ele pode ser usado para iniciar aplicações rapidamente executando um único comando do Docker. Empresas também estão investindo cada vez mais esforços na melhoria do desenvolvimento em contêineres locais e remotos do ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/onde-as-imagens-do-docker-estao-armazenadas-caminhos-dos-conteineres-do-docker-explicados/</link>
                <guid isPermaLink="false">61a95e483515f605190092fc</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Fri, 03 Dec 2021 02:09:37 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/example-of-examples-word-embeddings_grey.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Where are Docker Images Stored? Docker Container Paths Explained</a>
      </p><p>O Docker vem sendo adotado amplamente e é usado para executar e escalar aplicações em produção. Além disso, ele pode ser usado para iniciar aplicações rapidamente executando um único comando do Docker.</p><p>Empresas também estão investindo cada vez mais esforços na melhoria do desenvolvimento em contêineres locais e remotos do Docker, o que traz muitas vantagens.</p><p>Você pode obter as informações básicas sobre sua configuração do Docker executando o comando:</p><pre><code class="language-shell">$ docker info

...
 Storage Driver: overlay2
 Docker Root Dir: /var/lib/docker
...
</code></pre><p>O resultado contém as informações sobre seu driver de armazenamento e sobre seu diretório raiz do Docker.</p><h2 id="o-local-de-armazenamento-das-imagens-e-cont-ineres-do-docker"><strong>O local de armazenamento das imagens e contêineres do Docker</strong></h2><p>Um contêiner do Docker é composto de configurações de rede, volumes e imagens. O local dos arquivos do Docker depende de seu sistema operacional. Aqui, vemos uma visão geral dos sistemas operacionais mais utilizados:<br></p><ul><li>Ubuntu: <code>/var/lib/docker/</code></li><li>Fedora: <code>/var/lib/docker/</code></li><li>Debian: <code>/var/lib/docker/</code></li><li>Windows: <code>C:\ProgramData\DockerDesktop</code></li><li>MacOS: <code>~/Library/Containers/com.docker.docker/Data/vms/0/</code></li></ul><p>No macOS e no Windows, o Docker executa contêineres do Linux em um ambiente virtual. Assim, é preciso saber mais algumas coisas.</p><h3 id="docker-para-o-mac"><strong>Docker para o Mac</strong></h3><p>O Docker não é compatível nativamente com o macOS. Então, o <a href="https://github.com/moby/hyperkit">Hyperkit</a> é usado para executar uma imagem virtual. Os dados dessa imagem virtual estão localizados em:</p><p><code>~/Library/Containers/com.docker.docker/Data/vms/0</code></p><p>Dentro da imagem virtual, temos o caminho padrão do Docker <code>/var/lib/docker</code>.</p><p>Você pode investigar seu diretório raiz do Docker criando um shell no ambiente virtual:</p><pre><code class="language-shell">$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty </code></pre><p>Você pode encerrar essa sessão pressionando <strong><strong>Ctrl+a</strong></strong> e, depois, pressionando <strong><strong>k</strong></strong> e <strong><strong>y</strong></strong>.</p><h3 id="docker-para-o-windows"><strong>Docker para o Windows</strong></h3><p>No Windows, o Docker é um pouco fracionado. Há contêineres nativos do Windows que funcionam de forma semelhante aos contêineres do Linux. Os contêineres do Linux são executados em um ambiente virtual mínimo baseado no Hyper-V.</p><p>A configuração e a imagem virtual para executar imagens do Linux são salvas no diretório padrão do Docker.</p><p><code>C:\ProgramData\DockerDesktop</code></p><p>Se você inspecionar as imagens normais, verá caminhos do Linux, como, por exemplo:</p><pre><code class="language-shell">$ docker inspect nginx

...
"UpperDir": "/var/lib/docker/overlay2/585...9eb/diff"
...
</code></pre><p>Você pode se conectar com a imagem virtual com:</p><pre><code class="language-shell">docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i sh</code></pre><p>Lá, você pode ir até o local referenciado:</p><pre><code class="language-shell">$ cd /var/lib/docker/overlay2/585...9eb/
$ ls -lah

drwx------    4 root     root        4.0K Feb  6 06:56 .
drwx------   13 root     root        4.0K Feb  6 09:17 ..
drwxr-xr-x    3 root     root        4.0K Feb  6 06:56 diff
-rw-r--r--    1 root     root          26 Feb  6 06:56 link
-rw-r--r--    1 root     root          57 Feb  6 06:56 lower
drwx------    2 root     root        4.0K Feb  6 06:56 work</code></pre><h2 id="a-estrutura-interna-do-diret-rio-raiz-do-docker"><strong>A estrutura interna do diretório raiz do Docker</strong></h2><p>Dentro de <code>/var/lib/docker</code>, informações diversas são armazenadas. Por exemplo, dados de contêineres, volumes, builds, redes e clusters.</p><pre><code class="language-shell">$ ls -la /var/lib/docker

total 152
drwx--x--x   15 root     root          4096 Feb  1 13:09 .
drwxr-xr-x   13 root     root          4096 Aug  1  2019 ..
drwx------    2 root     root          4096 May 20  2019 builder
drwx------    4 root     root          4096 May 20  2019 buildkit
drwx------    3 root     root          4096 May 20  2019 containerd
drwx------    2 root     root         12288 Feb  3 19:35 containers
drwx------    3 root     root          4096 May 20  2019 image
drwxr-x---    3 root     root          4096 May 20  2019 network
drwx------    6 root     root         77824 Feb  3 19:37 overlay2
drwx------    4 root     root          4096 May 20  2019 plugins
drwx------    2 root     root          4096 Feb  1 13:09 runtimes
drwx------    2 root     root          4096 May 20  2019 swarm
drwx------    2 root     root          4096 Feb  3 19:37 tmp
drwx------    2 root     root          4096 May 20  2019 trust
drwx------   15 root     root         12288 Feb  3 19:35 volumes
</code></pre><h3 id="imagens-do-docker"><strong>Imagens do Docker</strong></h3><p>O conteúdo mais pesado são, em geral, as imagens. Se você usar o driver de armazenamento padrão, o overlay2, suas imagens do Docker são armazenadas em <code>/var/lib/docker/overlay2</code>. Lá, você poderá encontrar arquivos diferentes que representam camadas somente para leitura de uma imagem do Docker e uma camada superior que contém suas alterações.</p><p>Vamos explorar o conteúdo usando um exemplo:</p><pre><code class="language-shell">$ docker image pull nginx
$ docker image inspect nginx

[
    {
        "Id": "sha256:207...6e1",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:ad5...c6f"
        ],
        "Parent": "",
 ...
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 126698063,
        "VirtualSize": 126698063,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/585...9eb/diff:
                             /var/lib/docker/overlay2/585...9eb/diff",
                "MergedDir": "/var/lib/docker/overlay2/585...9eb/merged",
                "UpperDir": "/var/lib/docker/overlay2/585...9eb/diff",
                "WorkDir": "/var/lib/docker/overlay2/585...9eb/work"
            },
...
</code></pre><p><strong><strong>LowerDir</strong></strong> contém as camadas somente para leitura de uma imagem. A camada de leitura e escrita que representa as alterações são parte de <strong><strong>UpperDir</strong></strong>. Neste caso, a pasta <strong><strong>UpperDir</strong></strong> do NGINX contém os arquivos de log:</p><pre><code class="language-shell">$ ls -la /var/lib/docker/overlay2/585...9eb/diff

total 8
drwxr-xr-x    2 root     root    4096 Feb  2 08:06 .
drwxr-xr-x    3 root     root    4096 Feb  2 08:06 ..
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 access.log -&gt; /dev/stdout
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 error.log -&gt; /dev/stderr</code></pre><p>O <strong><strong>MergedDir</strong> </strong>representa o resultado de <strong><strong>UpperDir</strong></strong> e <strong><strong>LowerDir</strong></strong> que é usado pelo Docker para executar o contêiner. O <strong><strong>WorkDir</strong></strong> é um diretório interno para overlay2 e deve estar vazio.</p><h3 id="volumes-do-docker"><strong>Volumes do Docker</strong></h3><p>É possível adicionar um armazenamento persistente para contêineres de modo a manter os dados por mais tempo do que a existência do contêiner ou para compartilhar o volume com o host ou com outros contêineres. Um contêiner pode ser iniciado com um volume usando a opção <strong><strong>-v</strong></strong>:</p><pre><code class="language-shell">$ docker run --name nginx_container -v /var/log nginx</code></pre><p>Podemos obter informações sobre o local do volume conectado com:</p><pre><code class="language-shell">$ docker inspect nginx_container

...
"Mounts": [
            {
                "Type": "volume",
                "Name": "1e4...d9c",
                "Source": "/var/lib/docker/volumes/1e4...d9c/_data",
                "Destination": "/var/log",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...
</code></pre><p>O diretório referenciado contém arquivos do local <code>/var/log</code> do contêiner do NGINX.</p><pre><code class="language-shell">$ ls -lah /var/lib/docker/volumes/1e4...d9c/_data

total 88
drwxr-xr-x    4 root     root        4.0K Feb  3 21:02 .
drwxr-xr-x    3 root     root        4.0K Feb  3 21:02 ..
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 apt
-rw-rw----    1 root     43             0 Jan 30 00:00 btmp
-rw-r--r--    1 root     root       34.7K Feb  2 08:06 dpkg.log
-rw-r--r--    1 root     root        3.2K Feb  2 08:06 faillog
-rw-rw-r--    1 root     43         29.1K Feb  2 08:06 lastlog
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 nginx
-rw-rw-r--    1 root     43             0 Jan 30 00:00 w
</code></pre><h2 id="limpeza-do-espa-o-usado-pelo-docker"><strong>Limpeza do espaço usado pelo Docker</strong></h2><p>Recomenda-se usar o comando do Docker para limpar contêineres não utilizados. Contêiner, redes, imagens, e o cache criado podem ser limpos executando o seguinte comando:</p><pre><code class="language-shell">$ docker system prune -a</code></pre><p>Além disso, você pode remover volumes não utilizados com o comando:</p><pre><code class="language-shell">$ docker volumes prune</code></pre><h2 id="resumo"><strong>Resumo</strong></h2><p>O Docker é uma parte importante dos ambientes e do conjunto de ferramentas de muitos desenvolvedores. Às vezes, o Docker pode parecer meio mágico ao resolver problemas de modo muito inteligente sem dizer ao usuário como ele funciona por debaixo dos panos. Ainda assim, ele é uma ferramenta normal, que armazena as partes mais pesadas em locais que podem ser abertos e alterados.</p><p>Por vezes, o armazenamento pode encher rapidamente. Desse modo, é útil inspecionar o diretório raiz, mas não é recomendado excluir ou alterar arquivos manualmente dentro dele. Em vez disso, os comandos de prune (ver acima) podem ser usados para liberar espaço em disco.</p><p>Esperamos que você tenha gostado do artigo. Se gostou e quiser parabenizar o autor, <a href="https://twitter.com/journerist">siga-o no Twitter</a>. O autor trabalha no eBay Kleinanzeigen, uma das maiores empresas de anúncios classificados do mundo inteiro. Falando nisso, <a href="https://jobs.ebayclassifiedsgroup.com/ebay-kleinanzeigen">eles estão contratando</a>!</p><p>Uma boa exploração do Docker para você :)</p><hr><h2 id="refer-ncias-em-ingl-s-"><strong>Referências (em inglês)</strong></h2><ul><li>Documentação do storagedriver do Docker<br><a href="https://docs.docker.com/storage/storagedriver/">https://docs.docker.com/storage/storagedriver/</a></li><li>Documentação do sistema de arquivos OverlayFS<br><a href="https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt">https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como remover imagens e contêineres no Docker ]]>
                </title>
                <description>
                    <![CDATA[ Docker rmi O comando docker rmi remove as imagens por ID. Para remover a imagem, primeiro você precisa listar todas as imagens para obter os IDs de imagem, nomes de imagem e outros detalhes. Faça isso executando o comando docker images -a ou docker images. Depois disso, certifique-se de qual ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-remover-imagens-e-conteineres-no-docker/</link>
                <guid isPermaLink="false">618dc665d630de0504ee40a8</guid>
                
                    <category>
                        <![CDATA[ Docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Fri, 12 Nov 2021 03:01:23 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2021/11/5f9c9e04740569d1a4ca3ae5.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-remove-images-in-docker/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Remove Images and Containers in Docker</a>
      </p><h2 id="docker-rmi">Docker rmi</h2><p>O comando <code>docker rmi</code> remove as imagens por ID.</p><p>Para remover a imagem, primeiro você precisa listar todas as imagens para obter os IDs de imagem, nomes de imagem e outros detalhes. Faça isso executando o comando <code>docker images -a</code> ou <code>docker images</code>.</p><p>Depois disso, certifique-se de qual imagem deseja remover, para depois fazer isso executando o comando <code>docker rmi &lt;id-da-imagem&gt;</code>. Em seguida, confirme que a imagem foi removida listando todas as imagens e verificando.</p><h3 id="remover-v-rias-imagens"><strong><strong><strong>Remove</strong>r<strong> </strong>várias <strong>image</strong>n<strong>s</strong></strong></strong></h3><p>Há uma forma de remover mais de uma imagem por vez quando você quiser remover diversas imagens. Para fazer isso, obtenha os IDs das imagens listando todas elas e execute o comando a seguir.</p><p><code>docker rmi &lt;id-da-imagem&gt; &lt;id-da-imagem&gt; ...</code></p><p>Escreva os IDs das imagens no comando acima com espaços entre eles.</p><h3 id="remover-todas-as-imagens-ao-mesmo-tempo"><strong><strong><strong>Remove</strong>r todas as imagens ao mesmo tempo</strong></strong></h3><p>Para remover todas as imagens, há um comando que faz isso: <code>docker rmi $(docker images -q)</code></p><p>No comando acima, há, de fato, dois comandos. O primeiro, executa em <code>$()</code>, que é a sintaxe do shell, e retorna seja quais forem os resultados executados naquela sintaxe. Enquanto isso, <code>-q- é a opção usada para retornar os IDs exclusivos.</code> $() retorna os resultados dos IDs de imagens e <code>docker rmi</code> remove todas elas.</p><h4 id="para-obter-mais-informa-es-"><strong><strong>Para obter mais informações<strong>:</strong></strong></strong></h4><ul><li><a href="https://docs.docker.com/engine/reference/commandline/rm/">Documentação da Docker CLI: rmi</a> (em inglês)</li></ul><h2 id="docker-rm"><strong><strong><strong>Docker rm</strong></strong></strong></h2><p><code>docker rm</code> remove contêineres por nome ou por ID.</p><p>Quando você tem contêineres do Docker em execução, é preciso pará-los primeiro antes de exclui-los.</p><ul><li>Parar todos os contêineres em execução: <code>docker stop $(docker ps -a -q)</code></li><li>Excluir todos os contêineres parados: <code>docker rm $(docker ps -a -q)</code></li></ul><h3 id="remover-diversos-cont-ineres"><strong><strong><strong>Remove</strong>r diversos contêineres</strong></strong></h3><p>Você pode parar e excluir diversos contêineres passando para os comandos uma lista dos contêineres que deseja remover. A sintaxe do shell <code>$()</code> retorna os resultados do que tiver sido executado dentro dos parênteses. Desse modo, você pode criar sua lista de contêineres dentro dela para passar a informação para os comandos <code>stop</code> e <code>rm</code>.</p><h3 id="aqui-voc-ver-um-resumo-de-docker-ps-a-q"><strong>Aqui, você verá um resumo de docker ps -a -q</strong></h3><ul><li><code>docker ps</code> lista contêineres</li><li><code>-a</code> opção para listar todos os contêineres, mesmo os parados. Sem isso, o padrão é listar apenas os contêineres em execução</li><li><code>-q</code> opção silenciosa para fornecer apenas os IDs numéricos dos contêineres, em vez de uma tabela inteira de informações sobre os contêineres</li></ul><h4 id="mais-informa-es-"><strong><strong><strong>M</strong>ais informações<strong>:</strong></strong></strong></h4><ul><li><a href="https://docs.docker.com/engine/reference/commandline/rm/">Documentação da Docker CLI: rm</a> (em inglês)</li></ul><h2 id="mais-informa-es-sobre-imagens-no-docker-"><strong>Mais informações sobre imagens no Docker:</strong></h2><ul><li><a href="https://www.freecodecamp.org/news/docker-image-guide-how-to-remove-and-delete-docker-images-stop-containers-and-remove-all-volumes/">Docker image guide</a> (em inglês)</li><li><a href="https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/">Where are Docker images stored?</a> (em inglês)</li></ul><h2 id="mais-informa-es-sobre-cont-ineres-no-docker-"><strong>Mais informações sobre contêineres no Docker:</strong></h2><ul><li><a href="https://www.freecodecamp.org/news/automate-docker-container-deployment-via-maven-53a855e26d3e/">How to automate Docker container deployment</a> (em inglês)</li><li><a href="https://www.freecodecamp.org/news/how-to-find-and-fix-docker-container-vulnerabilities-in-2020/">How to fix Docker container vulnerabilities</a> (em inglês)</li></ul><h2 id="mais-informa-es-sobre-o-docker-"><strong>Mais informações sobre o Docker:</strong></h2><ul><li><a href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f/">A beginner's guide to Docker</a> (em inglês)</li><li><a href="https://www.freecodecamp.org/news/docker-devops-course/">Docker DevOps course (curso gratuito em vídeo)</a> (em inglês)</li><li><a href="https://www.freecodecamp.org/news/docker-101-creation-to-deployment/">Docker 101: from creation to deployment</a> (em inglês)</li></ul> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
