{"componentChunkName":"component---src-templates-blog-post-js","path":"/docker/","result":{"data":{"markdownRemark":{"html":"<h1 id=\"Docker\" style=\"position:relative;\">Docker<a href=\"#Docker\" aria-label=\"Docker permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h1>\n<p><strong>O que é?</strong></p>\n<p>Tecnologia utilizada para baratear o custo de hospedar várias aplicações em uma mesma máquina.</p>\n<p><strong>Diferença entre entre Dokcer e VM.</strong></p>\n<p>Virtualização é a tecnologia que virtualiza os drivers do pc o que se torna várias máquinas rodando em uma unica máquina.</p>\n<p>Melhor aproveitamento dos recursos do servidor.</p>\n<p>Problemas da virtualização, cada aplicação com um sistema operacional por VM e isso é custoso tanto na configuração quanto no consumo de hardwares.</p>\n<p>Containers são lugares onde a aplicação ira ser executada e eles rodarão sobre o sistema operacional do servidor. É mais leve pois só tem o SO do servidor e eles compartilham os recursos do SO.</p>\n<p>Um <strong><em>container</em></strong> funcionará junto do nosso sistema operacional base, e conterá a nossa aplicação, ou seja, a aplicação será executada dentro dele. Criamos um <em>container</em> para cada aplicação, e esses <em>containers</em> vão <strong>dividir</strong> as funcionalidades do sistema operacional.</p>\n<p>Com os <em>containers</em>, conseguimos limitar o consumo de CPU das aplicações, melhorando o controle sobre o uso de cada recurso do nosso sistema (CPU, rede, etc). Também temos uma facilidade maior em trabalhar com versões específicas de linguagens/bibliotecas, além de ter uma agilidade maior na hora de criar e subir <em>containers</em>, já que eles são mais leves que as máquinas virtuais.</p>\n<p><strong>Instalação</strong></p>\n<p><a href=\"https://www.digitalocean.com/community/tutorials/como-instalar-e-usar-o-docker-no-ubuntu-18-04-pt\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Linux</a></p>\n<p><strong>Layered File System</strong></p>\n<p>Imagens com várias camadas. Camadas podem ser compartilhadas e são somente read only. Podem ser aproveitadas por vários containers</p>\n<p><strong>Volumes</strong></p>\n<p>O volume fica no <em>Docker Host</em>. Ou seja, fica salvo no computador onde a <em>Docker Engine</em> está rodando.</p>\n<p>Persistir dados com containers, pois os containers são voláteis.</p>\n<p>Exemplo:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker run -v <span class=\"token string\">\"C:\\Users\\develop:/var/www\"</span> ubuntu</code></pre></div>\n<p>O parâmetro <em>-v</em> (volume) primeira parte é o caminho na sua máquina e o segundo é o caminho no container</p>\n<p>Mesmo após o container ser removido os dados desse path não serão destruídos juntos.</p>\n<p>Exemplo executando um código salvo em uma pasta em um container:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker run -p <span class=\"token number\">8080</span>:3000 -v <span class=\"token string\">\"C:\\Users\\develop<span class=\"token entity\" title=\"\\r\">\\r</span>epo<span class=\"token entity\" title=\"\\v\">\\v</span>olume-exemplo:/var/www\"</span> -w <span class=\"token string\">\"/var/www\"</span> node <span class=\"token function\">npm</span> start</code></pre></div>\n<p><em>-w</em> working directory aponta onde, qual pasta ou path, o container deve iniciar</p>\n<p><strong>Criando imagens personalizadas usando Dockerfile</strong></p>\n<p><strong>FROM</strong> comando pra aproveitar imagem base</p>\n<p><strong>MAINTAINER</strong> pessoa responsavel</p>\n<p><strong>ENV</strong> variaveis de ambiente</p>\n<p><strong>COPY</strong> copia pra dentro da imagem</p>\n<p><strong>WORKDIR</strong> assim que o container carregar no caminho especificado</p>\n<p><strong>RUN</strong> comando que roda enquanto está construindo a imagem</p>\n<p><strong>ENTRYPOINT</strong> comando que será executado assim que terminar de construir o container</p>\n<p><strong>EXPOSE</strong> porta que será aberta</p>\n<p>Exemplo:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">FROM node:latest\n\nMAINTANER Guilherme Alves\n\nENV <span class=\"token assign-left variable\">PORT</span><span class=\"token operator\">=</span><span class=\"token number\">3000</span>\n\nCOPY <span class=\"token builtin class-name\">.</span> /var/www\n\nWORKDIR /var/www\n\nRUN <span class=\"token function\">npm</span> <span class=\"token function\">install</span>\n\nENTRYPOINT <span class=\"token function\">npm</span> start\n\nEXPOSE <span class=\"token variable\">$PORT</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker build -f <span class=\"token operator\">&lt;</span>nome <span class=\"token keyword\">do</span> arquivo<span class=\"token operator\">></span> -t <span class=\"token operator\">&lt;</span>tag<span class=\"token operator\">></span> <span class=\"token builtin class-name\">.</span> <span class=\"token operator\">&lt;</span>contexto<span class=\"token operator\">></span>\n\ndocker run -d -p <span class=\"token number\">8080</span>:3000 <span class=\"token operator\">&lt;</span>tag<span class=\"token operator\">></span></code></pre></div>\n<p><strong>Subir para dockerhub</strong></p>\n<p>docker login</p>\n<p>docker push <tag></p>\n<p><strong>Network</strong></p>\n<p>Comunicando vários containers.</p>\n<p>Na rede default eles se comunicam apenas por IP</p>\n<p>Comando para criar sua própria rede:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker network create --driver bridge <span class=\"token operator\">&lt;</span>nome-da-rede<span class=\"token operator\">></span></code></pre></div>\n<p>Existem outros drivers mas o mais comum é o <strong><em>bridge</em></strong></p>\n<p>Atrelar o contêiner na rede criada:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker run --name <span class=\"token operator\">&lt;</span>nome-do-container<span class=\"token operator\">></span> --netowrk <span class=\"token operator\">&lt;</span>nome-da-rede<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>imagem<span class=\"token operator\">></span></code></pre></div>\n<p>Com isso conseguimos nos comunicar entre os contêiner pelo nome.</p>\n<p><strong>Docker Compose</strong></p>\n<p>Ferramenta para facilitar, automatizar e prever falhas para comunicação entre containers.</p>\n<p>Todo o processo é escrito em um arquivo chamado <strong>docker-compose.yml</strong></p>\n<p><strong>Instalação</strong></p>\n<p><a href=\"https://docs.docker.com/compose/install/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Docker Compose Install Documentation</a></p>\n<p>Exemplo de uma aplicação com um banco de dados <strong>MySQL</strong>, uma aplicação <strong>NodeJS</strong> e um Load Balance com <strong>NGINX</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">version: &#39;3&#39; //versão do docker compose\nservices: //nome dos serviços que vão ser rodados\n  nginx: // aqui é feita a condfiguração do NGINX que é um container que possui um Dokcerfile\n    build:\n      dockerfile: ./docker/nginx.dockerfile //dizemos onde está o arquivos Dockerfile que deve ser buildado\n      context: . //a partir de onde ele tem que buscar\n    image: &lt;nome-da-imagem&gt; //nome da imagem\n    container_name: nginx //nome pro container\n    ports: //mapear as portas que serão expostas\n      - &quot;80:80&quot; //porta de fora:porta de dentro\n    networks:\n      - production-network //nome da network criada abaixo\n    depends_on:\n      - &quot;node&quot; //o nginx só sobe depois que o node subir\n  mongodb:\n    image: mongo //imagem padrão\n    networks:\n      - production-network\n  node:\n    build:\n      dockerfile: //path de onde está o Dockerfile\n      context: . //a partir de onde procurar o Dockerfile\n    image: //nome da imagem\n    container_name: //nome dado ao container\n    ports:\n      - &quot;3000&quot;\n    networks:\n      - production-network\n    depends_on:\n      - &quot;mongo&quot; //indica que o node só vai subir depois que o mongo subir\nnetworks: //criando a rede pra comunicação dos containers\n  production-network: //nome que você quiser\n    driver: bridge</code></pre></div>\n<p>Executando:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">docker-compose build //buildar imagens\n\ndocker-compose up -d //subir containers a partir <span class=\"token keyword\">do</span> compose\n\ndocker-compose <span class=\"token function\">ps</span> //lista todos\n\ndocker-compose down //terminar todos os containers\n\ndocker-compose restart //restarta os containers</code></pre></div>\n<p><strong>Instalando Docker Compose</strong></p>\n<p>sudo curl -L <a href=\"https://github.com/docker/compose/releases/download/1.15.0/docker-compose-%60uname\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname</a> -s<code class=\"language-text\">-</code>uname -m` -o /usr/local/bin/docker-compose</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">sudo</span> <span class=\"token function\">chmod</span> +x /usr/local/bin/docker-compose</code></pre></div>\n<p><strong>Comandos Básicos</strong></p>\n<ul>\n<li>Comandos relacionados às informações</li>\n<li>docker version <strong>-</strong> exibe a versão do docker que está instalada.</li>\n<li>docker inspect ID_CONTAINER <strong>-</strong> retorna diversas informações sobre o container.</li>\n<li>docker ps <strong>-</strong> exibe todos os containers em execução no momento.</li>\n<li>docker ps -a <strong>-</strong> exibe todos os containers, independentemente de estarem em execução ou não.</li>\n<li>Comandos relacionados à execução</li>\n<li>docker run NOME<em>DA</em>IMAGEM <strong>-</strong> cria um container com a respectiva imagem passada como parâmetro.</li>\n<li>docker run -it NOME<em>DA</em>IMAGEM <strong>-</strong> conecta o terminal que estamos utilizando com o do container.</li>\n<li>docker run -d -P —name NOME dockersamples/static-site <strong>-</strong> ao executar, dá um nome ao container.</li>\n<li>docker run -d -p 12345:80 dockersamples/static-site <strong>-</strong> define uma porta específica para ser atribuída à porta 80 do container, neste caso 12345.</li>\n<li>docker run -v “CAMINHO<em>VOLUME” NOME</em>DA_IMAGEM <strong>-</strong> cria um volume no respectivo caminho do container.</li>\n<li>docker run -it —name NOME<em>CONTAINER —network NOME</em>DA<em>REDE NOME</em>IMAGEM <strong>-</strong> cria um container especificando seu nome e qual rede deverá ser usada.</li>\n<li>Comandos relacionados à inicialização/interrupção</li>\n<li>docker start ID_CONTAINER <strong>-</strong> inicia o container com id em questão.</li>\n<li>docker start -a -i ID_CONTAINER <strong>-</strong> inicia o container com id em questão e integra os terminais, além de permitir interação entre ambos.</li>\n<li>docker stop ID_CONTAINER <strong>-</strong> interrompe o container com id em questão.</li>\n<li>Comandos relacionados à remoção</li>\n<li>docker rm ID_CONTAINER <strong>-</strong> remove o container com id em questão.</li>\n<li>docker container prune <strong>-</strong> remove todos os containers que estão parados.</li>\n<li>docker rmi NOME<em>DA</em>IMAGEM <strong>-</strong> remove a imagem passada como parâmetro.</li>\n<li>Comandos relacionados à construção de Dockerfile</li>\n<li>docker build -f Dockerfile <strong>-</strong> cria uma imagem a partir de um Dockerfile.</li>\n<li>docker build -f Dockerfile -t NOME<em>USUARIO/NOME</em>IMAGEM <strong>-</strong> constrói e nomeia uma imagem não-oficial.</li>\n<li>docker build -f Dockerfile -t NOME<em>USUARIO/NOME</em>IMAGEM CAMINHO_DOCKERFILE <strong>-</strong> constrói e nomeia uma imagem não-oficial informando o caminho para o Dockerfile.</li>\n<li>Comandos relacionados ao Docker Hub</li>\n<li>docker login <strong>-</strong> inicia o processo de login no Docker Hub.</li>\n<li>docker push NOME<em>USUARIO/NOME</em>IMAGEM <strong>-</strong> envia a imagem criada para o Docker Hub.</li>\n<li>docker pull NOME<em>USUARIO/NOME</em>IMAGEM <strong>-</strong> baixa a imagem desejada do Docker Hub.</li>\n<li>Comandos relacionados à rede</li>\n<li>hostname -i <strong>-</strong> mostra o ip atribuído ao container pelo docker (funciona apenas dentro do container).</li>\n<li>docker network create —driver bridge NOME<em>DA</em>REDE <strong>-</strong> cria uma rede especificando o driver desejado.</li>\n<li>Comandos relacionados ao docker-compose</li>\n<li>docker-compose build <strong>-</strong> Realiza o build dos serviços relacionados ao arquivo docker-compose.yml, assim como verifica a sua sintaxe.</li>\n<li>docker-compose up <strong>-</strong> Sobe todos os containers relacionados ao docker-compose, desde que o build já tenha sido executado.</li>\n<li>docker-compose down <strong>-</strong> Para todos os serviços em execução que estejam relacionados ao arquivo docker-compose.yml.</li>\n</ul>","fields":{"slug":"/docker/"},"frontmatter":{"date":"19 de agosto de 2020","description":"Primeiros passos com Docker","title":"Docker","tags":["Docker"],"author":"Guilherme Alves","image":{"id":"d413b508-0d98-58fa-a882-71a275d382df","publicURL":"/static/5ef27418358e0041cd02966fc3e74e55/docker.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAACw0lEQVQ4y31Ty28ScRAm0aQx/gXGGPVSEg8mnkz8Vzx4MGo8mepBY6KEvpLWtLVpJOC2pTSl9EEpLfZBWXYX2IIUaEuhQHksr32zUKqJB3V3/S2BPrT1MNnJ7Mz3m29mPhXDMGjLaJpuGPARiqJQjuOQH0f1jVgqvWlDN6Nlkmz8Y1kWoUE+1cxVrFmHqi4Cq1UFeCee8Hu/BkNvTQul+1qdSAFAnufdBEF4eKqMCMBnGLoFhhwDngYjARjwEbZUxJ7pzfT1d3q5vWdCvqv59BMLhkJiXXC+sfuKnQ6cIMslrAzyz+vwuG2+UnF/F3j3E2iOvvHeIKt7TdJtLSSpu43yHY3udzaV3HyxEibbRgPyQ6Od4ckySjPsWcBWhzTLonuRcOCxfpq91T8nqyFMah9clNqHHZJ62CGrB2zSvTHPr5sg9goykwjuj1QAbeqE4VnAMgU6BDS0MytZVf8X+bIBF6/pNsSrEC62fcbFSzpMUvWtyY/0s7RQyGGZbM7XrP8PZfBiIZ9HO4zWaueqV35g8cuqAZes+rAmX+m1Sk/H7WWWLKEcX3HTJ7O7GLAqCO7DWg2uUCS6n0jEp7EA+XwGLmoWXBlfaHtL/Ha4cVSvuzhwOrVqFW6c0EVb5sHd+YOh4MjYRGbZCe84nK5wkcghW7hvC4FdEeuyY287Fvcvrq7vJlMHPrfXF84XCp5ToCeAAtju7l7MrzNOpqEpS+qlpotbWndGX/f0sRa7I7645ox2aLpYvWkq3T00UhrUQ4TFthTneQ6hz1uKQoHIFzwKmNEyl5yat+0bJs0Hptn5xPj0bMrqWIkNGUazY+aZlHbgY2kVdu9EdqMBMCKYat7imRkeL6RQ9GRzOa8yy/1kElfmmc5kvTmgjhY1Ip/3kEA1pwXxT4etoFKkaFh5tXFj4KvMVokp56HkKf5fGkZaEv4DVdU6+enoOwkAAAAASUVORK5CYII=","aspectRatio":1.5023474178403755,"src":"/static/5ef27418358e0041cd02966fc3e74e55/767d3/docker.png","srcSet":"/static/5ef27418358e0041cd02966fc3e74e55/c67b7/docker.png 320w,\n/static/5ef27418358e0041cd02966fc3e74e55/d3930/docker.png 640w,\n/static/5ef27418358e0041cd02966fc3e74e55/767d3/docker.png 1200w","sizes":"(max-width: 1200px) 100vw, 1200px"}}}},"timeToRead":6}},"pageContext":{"slug":"/docker/","previous":null,"next":{"fields":{"slug":"/arquitetura-limpa/"},"frontmatter":{"title":"Arquitetura limpa","date":"19 ago, 2020"}}}},"staticQueryHashes":["63159454"]}