{"id":12529,"date":"2018-01-25T10:48:37","date_gmt":"2018-01-25T12:48:37","guid":{"rendered":"https:\/\/king.host\/blog\/?p=12529"},"modified":"2024-06-03T17:08:51","modified_gmt":"2024-06-03T20:08:51","slug":"como-docker-entrou-minha-rotina","status":"publish","type":"post","link":"https:\/\/king.host\/blog\/tecnologia\/como-docker-entrou-minha-rotina\/","title":{"rendered":"Como Docker entrou na minha rotina"},"content":{"rendered":"<p>Saindo um pouco da ideia de tutoriais, gostaria de escrever um pouco sobre a minha experi\u00eancia de como Docker entrou na minha rotina de desenvolvimento, incluindo algumas dicas que foram muito importantes pra tornar esse caminho mais agrad\u00e1vel.<\/p>\n<h2>Em uma gal\u00e1xia muito, muito distante\u2026<\/h2>\n<p>Assim como muitos, eu tinha muito receio de usar o Docker e, na verdade, era bem contra a ideia toda. Afinal basta eu subir um servi\u00e7o do Apache na minha m\u00e1quina, configurar o PHP e pronto\u2026 estou com a minha m\u00e1quina de desenvolvimento funcionando perfeitamente.<\/p>\n<p>Em um segundo momento, enquanto estudava para a prova de certifica\u00e7\u00e3o PHP, descobri que o PHP tinha um servidor web embutido (<a href=\"https:\/\/secure.php.net\/manual\/pt_BR\/features.commandline.webserver.php\" target=\"_blank\" rel=\"noopener\">link documenta\u00e7\u00e3o<\/a>)! Isso me deixou muito feliz, pois n\u00e3o era mais necess\u00e1rio utilizar o Apache.<\/p>\n<p>Nessa etapa, n\u00e3o teria porque eu utilizar o Docker para nada, eu j\u00e1 tinha o meu ambiente pronto. Bastava digitar:<\/p>\n<pre name=\"dad4\" id=\"dad4\" class=\"graf graf--pre graf-after--p \">$ php -S localhost:8080<\/pre>\n<h2>Epis\u00f3do I: O Contato<\/h2>\n<p><iframe width=\"480\" height=\"259\" src=\"https:\/\/giphy.com\/embed\/3ohc11y6Oiv0aBirU4\" frameborder=\"0\" class=\"giphy-embed\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>A necessidade de usar o Docker surgiu quando entrei na Kinghost: a equipe j\u00e1 utilizava para desenvolvimento e eu tinha que me manter atualizado com o time. Ou seja, a necessidade n\u00e3o surgiu diretamente do meu dia a dia mas sim, da necessidade de atualiza\u00e7\u00e3o constante. N\u00e3o devemos ficar muito tempo na zona de conforto, caso contr\u00e1rio podemos perder coisas \u00f3timas que est\u00e3o bem debaixo do nosso nariz.<\/p>\n<p>Primeiro comecei a tentar entender o conceito geral: containers. \u00c9 complicado no come\u00e7o entender que o container \u00e9, basicamente, um \u201clinux empacotado\u201d, e que funciona! Bem louco. Um vez entendido isso, podemos seguir para a pr\u00f3xima fase.<\/p>\n<p>Como Docker \u00e9 executado via linha de comando, ent\u00e3o eu precisava aprender aquela porrada de par\u00e2metros que eu precisava passar para que tudo funcionasse corretamente.<\/p>\n<p>O primeiro desafio era subir o meu j\u00e1 conhecido ambiente de dev \u201capache + php\u201d no docker. Encontrei, ent\u00e3o, o DockerHub, que \u00e9 o reposit\u00f3rio das imagens oficiais. Justo. Bora procurar uma imagem que atenda ao meu ambiente citado!<\/p>\n<p>E n\u00e3o \u00e9 que no <a href=\"https:\/\/hub.docker.com\/_\/php\/\" target=\"_blank\" rel=\"noopener\">reposit\u00f3rio oficial do PHP<\/a> tinha uma imagem pronta?!<\/p>\n<p>Nesse caso foi s\u00f3 copiar o comando que eles mesmos descrevem:<\/p>\n<pre name=\"6fc8\" id=\"6fc8\" class=\"graf graf--pre graf-after--p\"><code class=\"markup--code markup--pre-code\">$ docker run -d \\\n-p 80:80 \\\n--name my-apache-php-app \\\n-v \"$PWD\":\/var\/www\/html \\\nphp:7.0-apache<\/code><\/pre>\n<p>O que eu estou fazendo aqui.<\/p>\n<p>-d # rodar em modo \u201cdeamon\u201d para que o terminal n\u00e3o fique preso.<br \/>\n-p 80:80 # mapeie a minha porta localhost:80 para a porta 0.0.0.0:80 do container<br \/>\n&#8211; -name # \u00e9 apenas o nome do container<br \/>\n-v \u201c$PWD\u201d:\/var\/www\/html # \u00e9 para mapear a minha pasta atual, para a pasta \/var\/www\/html do container<br \/>\nRodando apenas esse comando, ele vai fazer download da imagem e subir o container. A partir desse ponto, bastava acessar o endere\u00e7o localhost:80 e a minha aplica\u00e7\u00e3o estava funcionando de boas. Fiquei maravilhado, pois isso significava que eu n\u00e3o precisava mais instalar apache na minha m\u00e1quina.<\/p>\n<p>Pois ent\u00e3o que surgiu o primeiro problema\u2026<\/p>\n<h2>Epis\u00f3dio II: A Amea\u00e7a<\/h2>\n<p><iframe width=\"480\" height=\"270\" src=\"https:\/\/giphy.com\/embed\/xULW8PxuI1Wg2tEUZa\" frameborder=\"0\" class=\"giphy-embed\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><a href=\"https:\/\/giphy.com\/gifs\/xULW8PxuI1Wg2tEUZa\" target=\"_blank\" rel=\"noopener\">via GIPHY<\/a><\/p>\n<p>Eu precisava de uma extens\u00e3o espec\u00edfica, exemplo: <strong>bcmath<\/strong>. Como faz? A minha aplica\u00e7\u00e3o necessitava que <strong>n<\/strong> extens\u00f5es estivessem l\u00e1\u2026 que o meu php estivesse totalmente configurado.<\/p>\n<p>Felizmente a minha pergunta foi respondida j\u00e1 na documenta\u00e7\u00e3o oficial novamente. Basta criar um dockerfile e criar a m\u00e1quina com a nova config. Nesse momento o cara grita ao fundo \u201ccome\u00e7ou a ficar complicado esse tro\u00e7o, olha que m\u00e3o pra instalar uma extens\u00e3o!!!\u201d<\/p>\n<p>Calma! Segura a emo\u00e7\u00e3o! Olha s\u00f3 o que eu precisei escrever no arquivo Dockerfile:<\/p>\n<pre name=\"fe5f\" id=\"fe5f\" class=\"graf graf--pre graf-after--p\">FROM php:7.0-apache<\/pre>\n<pre name=\"6027\" id=\"6027\" class=\"graf graf--pre graf-after--pre\">RUN docker-php-ext-install bcmath<\/pre>\n<p>Ap\u00f3s criado o arquivo na pasta, eu vou para o terminal e fa\u00e7o o \u201cbuild\u201d dessa m\u00e1quina (aten\u00e7\u00e3o para o \u201cponto\u201d no final do script, \u00e9 necess\u00e1rio).<\/p>\n<pre name=\"b8b4\" id=\"b8b4\" class=\"graf graf--pre graf-after--p\">$ docker build -t my_php_docker_app .<\/pre>\n<p>Funciona!! Agora basta trocar a chamada abaixo.<\/p>\n<pre name=\"4d2f\" id=\"4d2f\" class=\"graf graf--pre graf-after--p\"><code class=\"markup--code markup--pre-code\">$ docker run -d \\\n-p 80:80 \\\n--name my-apache-php-app \\\n-v \"$PWD\":\/var\/www\/html \\\n<\/code><strong class=\"markup--strong markup--pre-strong\">my_php_docker_app<\/strong><\/pre>\n<p>Agora a m\u00e1quina est\u00e1 configurada e sempre estar\u00e1. <strong>Ps: fim do tutorial.<\/strong><\/p>\n<h2>Epis\u00f3dio III: O Ataque dos Clones<\/h2>\n<p><iframe width=\"480\" height=\"230\" src=\"https:\/\/giphy.com\/embed\/l49JMVlvkuqNlsnZe\" frameborder=\"0\" class=\"giphy-embed\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Nesse momento eu ainda tava preocupado em ter que armazenar toda essa info, em gerar um Dockerfile pra cada aplica\u00e7\u00e3o\u2026 etc. Porque, al\u00e9m de tudo, ainda tem o banco de dados: ficar configurando banco de dados para todas as aplica\u00e7\u00f5es \u00e9 chato demais.<\/p>\n<p>Quem nunca teve problemas com o servi\u00e7o do mysql rodando local? E quando d\u00e1 problema de vers\u00e3o do banco de dados. A\u00ed impacta em todos os projetos que eu estou testando localmente. Diversas vari\u00e1veis eram motivos de preocupa\u00e7\u00e3o.<\/p>\n<p>Descobri o querido <strong>docker-compose<\/strong> e, isso sim, abriu muito o meu mundo de desenvolvimento para novas possibilidades. Olha um exemplo de docker compose que eu utilizo hoje em dia:<\/p>\n<pre class=\"\">version: '2'\n\nservices:\n  web:\n    build: .\/\n    image: meuaplicativo\n    container_name: meuaplicativo-web\n    hostname: dev.meuaplicativo.com.br\n    volumes:\n      - .\/:\/var\/www\n    depends_on:\n      - mysql\n      - rabbit\n\n  mysql:\n    image: mysql:5.6\n    container_name: meuaplicativo-mysql\n    hostname: mysql.meuaplicativo.com.br\n\n  rabbit:\n    image: rabbitmq:3-management\n    container_name: meuaplicativo-rabbit\n    hostname: rabbit.meuaplicativo.com.br\n    environment:\n      - RABBITMQ_DEFAULT_USER=myapp\n      - RABBITMQ_DEFAULT_PASS=myapp\n      - RABBITMQ_DEFAULT_VHOST=myapp<\/pre>\n<p>Com isso eu n\u00e3o preciso lembrar da configura\u00e7\u00e3o de NENHUM cliente. Basta rodar<\/p>\n<pre name=\"db58\" id=\"db58\" class=\"graf graf--pre graf-after--p\"><code class=\"markup--code markup--pre-code\">$ docker-compose up -d web<\/code><\/pre>\n<p>E a minha aplica\u00e7\u00e3o j\u00e1 est\u00e1 rodando com mysql, rabbit, apache, php\u2026 tudo configurado.<\/p>\n<p>O que eu tenho rodando na minha m\u00e1quina, instalado, \u00e9 apenas o docker. N\u00e3o preciso NEM do phpMyAdmin, sabe por qu\u00ea? Tem imagem do docker para o phpMyAdmin tamb\u00e9m. Ent\u00e3o\u2026. muito barbada.<\/p>\n<h2>Epis\u00f3dio IV: O Retorno de Jedi<\/h2>\n<p><iframe width=\"480\" height=\"202\" src=\"https:\/\/giphy.com\/embed\/3o752mHT0f6DJzkzAc\" frameborder=\"0\" class=\"giphy-embed\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Hoje eu acredito que cada segundo aplicado entendendo o conceito, utilizando e indo a fundo dentro da tecnologia do Docker, me auxiliou na simplicidade de diversos problemas. Foi algo que me animou novamente, tanto com os ambientes de desenvolvimento dos meus clientes \u201cfreelas\u201d quanto no meu desenvolvimento dentro da empresa.<\/p>\n<p>Qualquer novo membro da nossa equipe de desenvolvimento n\u00e3o precisa se preocupar com a configura\u00e7\u00e3o da sua esta\u00e7\u00e3o de trabalho. Ele deve ter apenas o seu Editor\/IDE funcionando e o servi\u00e7o do Docker rodando. Todo o resto do trabalho pode ser feito com isso, sem esfor\u00e7o e sem complica\u00e7\u00e3o.<\/p>\n<p>Deu trabalho migrar todo ambiente de dev para Docker? Deu\u2026<br \/>\nCriar o Dockerfile correto para cada projeto foi tenso? Foi\u2026<br \/>\nValeu a pena? Cada minuto.<\/p>\n<p>Mais colegas experimentaram o Docker para outras atividades. Leia o relato do meu colega Bruno Fidelis sobre <a href=\"https:\/\/king.host\/blog\/2016\/12\/utilizando-docker-para-escalonar-aplicacoes-node-js\/?utm_source=lab&amp;utm_medium=post&amp;utm_term=&amp;utm_content=docker na rotina&amp;utm_campaign=content-marketing\">como utilizar o Docker para escalonar aplica\u00e7\u00f5es Node.Js clicando aqui<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Saindo um pouco da ideia de tutoriais, gostaria de escrever um pouco sobre a minha experi\u00eancia de como Docker entrou na minha rotina de desenvolvimento, incluindo algumas dicas que foram muito importantes pra tornar esse caminho mais agrad\u00e1vel. Em uma gal\u00e1xia muito, muito distante\u2026 Assim como muitos, eu tinha muito receio de usar o Docker [&hellip;]<\/p>\n","protected":false},"author":292,"featured_media":12544,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1179,1327,8],"tags":[1376],"class_list":["post-12529","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento","category-hospedagem-node-js","category-tecnologia","tag-desenvolvimento"],"_links":{"self":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/12529","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/users\/292"}],"replies":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/comments?post=12529"}],"version-history":[{"count":9,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/12529\/revisions"}],"predecessor-version":[{"id":12683,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/12529\/revisions\/12683"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media\/12544"}],"wp:attachment":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media?parent=12529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/categories?post=12529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/tags?post=12529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}