December 10, 2016 | Author: Yure Pereira | Category: N/A
Karl Matthias Sean P. Kane
Novatec
Authorized Portuguese translation of the English edition of titled Docker: Up and Running, ISBN 9781491917572 © 2015 Karl Matthias, Sean P. Kane. This translation is published and sold by permission of O'Reilly Media, Inc., the owner of all rights to publish and sell the same. Tradução em português autorizada da edição em inglês da obra Docker: Up and Running, ISBN 9781491917572 © 2015 Karl Matthias, Sean P. Kane. Esta tradução é publicada e vendida com a permissão da O'Reilly Media, Inc., detentora de todos os direitos para publicação e venda desta obra. © Novatec Editora Ltda. 2016. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates YG20151222 Assistente editorial: Priscila A. Yoshimatsu Tradução: Alison Miazaki Revisão técnica: Rafael Gomes Revisão gramatical: Lia Gabriele Regius Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-473-1 Histórico de impressões: Janeiro/2016
Primeira edição
Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 – São Paulo, SP – Brasil Tel.: +55 11 2959-6529 E-mail:
[email protected] Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec
capítulo 1
Introdução
Origem do Docker O Docker foi inicialmente apresentado ao mundo – sem aviso prévio ou qualquer tipo de alarde – por Solomon Hykes, fundador e CEO da dotCloud, em uma palestra relâmpago de cinco minutos na Python Developers Conference, em Santa Clara, na Califórnia, em 15 de março de 2013. No momento do anúncio, cerca de apenas 40 pessoas de fora da dotCloud tiveram a chance de experimentar o Docker. Em poucas semanas após o anúncio, houve uma quantidade impressionante de notícias sobre o Docker. O projeto foi rapidamente transformado em open source e disponibilizado publicamente no GitHub, no qual qualquer um poderia fazer o download e contribuir para o projeto. Em poucos meses, mais e mais pessoas no mercado começaram a ouvir sobre o Docker e em como ele revolucionaria a maneira como os softwares eram desenvolvidos, entregues e executados. E dentro de um ano, poucos não conheciam o Docker, mas muitos não tinham certeza sobre o que exatamente ele era e por que as pessoas estavam tão animadas com ele. O Docker é uma ferramenta que promete encapsular facilmente o processo de criação de um artefato distribuído para qualquer aplicação, implantá-lo em escala em qualquer ambiente e racionalizar o fluxo de trabalho e a responsividade das organizações de software ágil.
O que esperar do Docker Embora visto como uma plataforma de virtualização, o Docker é muito mais que isso. O domínio do Docker se estende por alguns segmentos bem estabelecidos do mercado, que incluem tecnologias como KVM, Xen, OpenStack, Mesos, 22
Capítulo 1 ■ Introdução
23
Capistrano, Fabric, Ansible, Chef, Puppet, SaltStack etc. Há algo muito revelador sobre a lista de produtos com os quais o Docker compete, e talvez você já tenha percebido. Por exemplo, a maioria dos engenheiros não diria que uma ferramenta de virtualização compete com uma ferramenta de gerenciamento de configurações e, ainda assim, ambas são atingidas pelo Docker. As tecnologias listadas também são aclamadas por sua habilidade de aumentar a produtividade, e é isso que tem causado muita agitação no meio. O Docker está exatamente no meio de algumas das tecnologias mais promissoras da última década. Se você fizer uma comparação funcionalidade por funcionalidade do Docker e do maior campeão de cada uma dessas tecnologias, o Docker se pareceria muito com um competidor mediano. Ele é mais forte em algumas áreas do que em outras, mas o que o Docker oferece é um conjunto de recursos que atendem a uma ampla variedade de desafios no fluxo de trabalho. O Docker fornece várias funcionalidades úteis ao combinar a facilidade de ferramentas de implantação, como Capistrano e Fabric, com a facilidade de administrar sistemas de virtualização e, então, provê elos que tornam simples de implementar a automatização do fluxo de trabalho e orquestração. Novas tecnologias vêm e vão aos montes, e uma dose de ceticismo quanto a uma nova onda sempre é saudável. Sem se aprofundar na tecnologia, seria fácil considerar o Docker como mais uma tecnologia que resolve algum problema específico para equipes de desenvolvimento e operação. Se você olhar para o Docker apenas como uma tecnologia de virtualização ou implantação, ele pode não parecer muito atraente. No entanto, o Docker é muito mais do que aparenta ser em sua superfície. É difícil e, às vezes, caro fazer a comunicação e os processos entre equipes funcionar bem, mesmo em pequenas empresas. Ao mesmo tempo, vivemos em um mundo em que a comunicação eficaz de informações detalhadas entre equipes é cada vez mais necessária. Uma ferramenta que reduz essa complexidade de comunicação enquanto ajuda na produção de um software mais robusto seria um grande acerto. E é exatamente por isso que o Docker merece um olhar mais profundo. Não é nenhuma panaceia, e uma implementação bem feita do Docker requer algum esforço mental, mas o Docker é uma boa abordagem para resolver alguns dos problemas de empresas do mundo real e ajuda empresas a entregar softwares de melhor qualidade com mais rapidez. Entregar um fluxo de trabalho do Docker com um bom design pode tornar as equipes técnicas mais felizes e aumentar o lucro real para as empresas.
24
Primeiros passos com Docker
Então, onde dói mais para as empresas? Entregar um software na velocidade esperada no mundo de hoje é difícil de se fazer bem e, com o crescimento das empresas de um ou dois desenvolvedores para muitas equipes de desenvolvedores, o ônus da comunicação relativa a entregas de novos releases torna-se muito mais pesado e difícil de gerenciar. Os desenvolvedores têm que entender muitos aspectos complexos sobre o ambiente no qual eles entregarão o software, e as equipes de operações da produção precisam entender cada vez mais da essência do software que eles implantam. Em geral, todas essas são habilidades interessantes de se trabalhar, porque levam a uma melhor compreensão do ambiente como um todo e, portanto, incentivam o desenho de um software robusto, mas essas mesmas habilidades são muito difíceis de escalar de forma eficaz com a aceleração do crescimento de uma organização. Os detalhes do ambiente de cada empresa muitas vezes exigem muita comunicação que não agrega valor para as equipes envolvidas. Por exemplo, exigir que os desenvolvedores solicitem a uma equipe de operações a implantação 1.2.1 de uma biblioteca em particular os atrasa e não agrega nenhum valor de negócio para a empresa. Se os desenvolvedores pudessem simplesmente atualizar a versão da biblioteca que eles usam, escrever seu código, testar com a nova versão e implantá-la, o tempo de entrega seria consideravelmente reduzido. Se o pessoal de operação pudesse atualizar o software no host sem ter que coordenar múltiplas equipes de desenvolvedores o processo seria mais ágil. O Docker ajuda na construção de uma camada de isolamento em software que reduz a carga de comunicação no mundo dos humanos. Além de ajudar com problemas de comunicação, o Docker influencia a arquitetura do software no sentido de encorajar aplicações trabalhadas de modo mais robusto. Sua filosofia de arquitetura gira em torno de contêineres atômicos ou descartáveis. Durante a implantação, todo ambiente sobre o qual a aplicação antiga roda é jogado fora com ela. Nada no ambiente da aplicação viverá mais do que a aplicação em si; essa é uma pequena ideia com grandes repercussões. Isso significa que as aplicações não são suscetíveis a, acidentalmente, se sustentar sobre artefatos de releases anteriores. Isso significa que mudanças efêmeras de debug são menos propensas a continuar existindo em futuros releases que as recolheram do sistema de arquivos local. E isso significa que as aplicações são altamente portáveis entre servidores porque todo estado tem que ser incluído diretamente dentro do artefato de implantação e ser imutável, ou enviado para uma dependência externa, como um banco de dados, cache ou servidor de arquivos.
Capítulo 1 ■ Introdução
25
Isso leva a aplicações que não são apenas mais escaláveis, mas mais confiáveis. Instâncias de contêineres da aplicação podem ir e vir com pouca repercussão no uptime do frontend. Essas são escolhas comprovadas de arquitetura que têm sido bem-sucedidas para aplicações sem uso do Docker, mas as opções de design incluídas no design próprio do Docker seguirão as melhores práticas, e isso é ótimo.
Benefícios do fluxo de trabalho do Docker É difícil categorizar de modo coeso tudo que o Docker possibilita. Quando bem implementado, ele beneficia a empresa, as equipes, os desenvolvedores e os engenheiros de operação de várias maneiras. Isso simplifica as decisões de arquitetura, pois todas as aplicações são parecidas do ponto de vista do sistema que as hospeda. Isso facilita a escrita e o compartilhamento de ferramentas entre aplicações. Nada no mundo traz benefícios sem desafios, mas o Docker é surpreendentemente mais benéfico do que desafiador. Aqui estão mais algumas coisas que você obtém com o Docker: Empacotamento de software que extrai o melhor das habilidades que os desenvolvedores já têm.
Muitas empresas têm que criar posições de trabalho para liberar e desenvolver engenheiros para gerenciar todo conhecimento e ferramentas necessárias para criar pacotes de software para suas plataformas suportadas. Ferramentas como rpm, mock, dpkg e pbuilder podem ser complicadas de usar, sendo necessário aprender cada uma delas separadamente. O Docker junta todos os seus requisitos em um único pacote que é definido em um único arquivo. Empacotamento de aplicação de software e sistemas de arquivos (filesystems) necessários do sistema operacional juntos em um único formato de imagem padronizado.
No passado, normalmente você precisaria não apenas empacotar sua aplicação, mas muitas das dependências envolvidas, incluindo bibliotecas e daemons. Entretanto, você não conseguia assegurar que 100% do ambiente de execução era idêntico. Tudo isso tornava o empacotamento difícil de dominar e de conquistar a confiança de muitas empresas. Não raro, alguém executando Scientific Linux tentava implantar um pacote de comunidade, testado apenas no Red Hat Linux, esperando que os pacotes fossem parecidos o suficiente para o que eles precisavam. Com o Docker você implanta sua aplicação com todo e qualquer arquivo que ela precisa para ser executada. As imagens em camadas do Docker fazem disso um processo eficiente que assegura que sua aplicação está rodando no ambiente esperado.
26
Primeiros passos com Docker
Uso de artefatos empacotados para testar e entregar exatamente o mesmo artefato para todos os sistemas em todos os ambientes.
Quando os desenvolvedores fazem um commit para um sistema de controle de versão, pode-se criar uma nova imagem do Docker, que pode passar por todo o processo de teste e ser implantado em produção sem qualquer necessidade de recompilação e reempacotamento em qualquer passo do processo. Abstração de softwares de hardwares sem sacrificar recursos.
As tradicionais soluções de virtualização como VMware são normalmente usadas quando as pessoas precisam criar uma camada de abstração entre o hardware e o software que roda nele, comprometendo recursos. Os hypervisors que gerenciam as VMs e cada kernel de VM em execução consomem uma porcentagem dos recursos do hardware, que não mais estarão disponíveis para hospedar aplicações. Um contêiner, por outro lado, é apenas outro processo que fala diretamente com o kernel do Linux e logo pode utilizar mais recursos, até que a cota limite de recursos seja atingida. Quando o Docker foi lançado pela primeira vez, os contêineres do Linux já existiam há alguns anos, e muitas das outras tecnologias que foram construídas sobre eles não são realmente novas. Entretanto, a mistura única da forte arquitetura e das escolhas de fluxo de trabalho do Docker combinadas se tornou muito mais potente que a soma das partes. O Docker finalmente torna os contêineres do Linux, que já existem há mais de uma década, algo acessível a tecnólogos medianos. Ele encaixa os contêineres dentro de fluxos de trabalho e processos de empresas reais. E os problemas discutidos anteriormente afetaram tantas pessoas que o interesse no projeto Docker tem aumentado com mais rapidez do que qualquer pessoa esperaria. No primeiro ano, novos usuários do projeto se surpreenderam ao descobrir que o Docker ainda não estava pronto para a produção. Entretanto, um fluxo constante de commits da comunidade open source do Docker moveram o projeto adiante a passos largos. E esses passos parecem só acelerar com o tempo. Agora que o Docker já está no ciclo 1.x de lançamento, a estabilidade está boa, a adoção em produção já é uma realidade e várias empresas estão encarando o Docker como a solução para alguns sérios problemas que elas têm enfrentado no processo de entrega de software.
Capítulo 1 ■ Introdução
27
O que o Docker não é O Docker pode ser utilizado para resolver uma ampla variedade de desafios que outras categorias de ferramentas tradicionalmente deveriam corrigir; entretanto, a variedade de funcionalidades do Docker muitas vezes significa que ele falta em profundidade em um recurso específico. Por exemplo, algumas organizações podem acreditar que poderão remover completamente a ferramenta de gerenciamento de configuração quando migrarem para o Docker, mas o real poder do Docker é que, embora possa substituir alguns aspectos das mais tradicionais ferramentas, ele geralmente é compatível com essas ferramentas ou até aperfeiçoado ao se combinar a elas. Na lista a seguir, nós exploramos algumas das categorias de ferramentas que o Docker não substitui de forma direta, mas que geralmente podem ser utilizadas em conjunto com ele para alcançar grandes resultados: Plataforma de virtualização (VMware, KVM etc.)
Um contêiner não é uma máquina virtual no sentido tradicional. Uma máquina virtual contém um sistema operacional completo, rodando sobre o sistema operacional do host. A maior vantagem é que é fácil rodar várias máquinas virtuais com sistemas operacionais radicalmente diferentes em um único host. Com contêineres, tanto o host quanto o contêiner dividem o mesmo kernel. Isso significa que os contêineres utilizam menos recursos do sistema, mas precisam estar sob o mesmo sistema operacional (i.e., Linux). Plataforma de nuvem (Openstack, CloudStack etc.)
Assim como a virtualização, o fluxo de trabalho de um contêiner tem muitas similaridades superficiais com plataformas de nuvem. Ambos são aclamados por permitir que aplicações sejam escaladas horizontalmente em resposta a uma mudança na demanda. O Docker, entretanto, não é uma plataforma de nuvem. Ele só lida com a implantação, execução e gerenciamento de contêineres em um host de Docker preexistente. Ele não permite que você crie uma novo host (instância), armazenamento de objetos, armazenamento em bloco e muitos dos outros recursos que são normalmente associados a uma plataforma de nuvem. Gerenciamento de configurações (Puppet, Chef etc.)
Embora o Docker possa melhorar de forma significativa a habilidade de uma empresa de gerenciar aplicações e suas dependências, ele não substitui diretamente o gerenciamento de configurações tradicional. Dockerfiles são
28
Primeiros passos com Docker
usados para definir como um contêiner deveria se parecer no momento de criação (build), mas não gerenciam o estado atual do contêiner e não podem ser usados para gerenciar o host do Docker. Framework de implantação (Capistrano, Fabric etc.)
O Docker facilita muitos aspectos da implantação por criar imagens de contêineres autocontidas que encapsulam todas as dependências de uma aplicação e que podem ser implantadas, em todos os ambientes, sem mudanças. Entretanto, o Docker não pode ser utilizado sozinho para automatizar processos complicados de implantação. Outras ferramentas ainda são necessárias para unir a automação de um fluxo de trabalho maior. Ferramenta de gerenciamento de carga (Mesos, Fleet etc.)
O servidor Docker não tem nenhum conceito interno de cluster. Ferramentas de orquestração adicionais (incluindo a ferramenta Swarm do próprio Docker) devem ser usadas para coordenar o trabalho de maneira inteligente por um conjunto de hosts Docker, para rastrear o estado atual de todos os hosts e seus recursos e manter um inventário dos contêineres em execução. Ambiente de desenvolvimento (Vagrant etc.)
O Vagrant é uma ferramenta de gerenciamento de máquina virtual para desenvolvedores que costumam simular pilhas de servidores que se assemelham ao ambiente de produção no qual a aplicação será implantada. Entre outras coisas, o Vagrant facilita a execução do Linux em máquinas Mac OS X e Windows. Como o servidor Docker só roda no Linux, o Docker fornece o boot2docker e o Docker Machine para permitir que os desenvolvedores utilizem rapidamente máquinas Docker com base em Linux em várias plataformas. O boot2docker e o Docker Machine são suficientes para muitos fluxos de trabalho padrão do Docker, mas eles não disponibilizam a variedade de recursos encontrados no Vagrant. Desvendar o Docker pode ser bem desafiador quando alguém o conhece sem uma referência de peso. No próximo capítulo, faremos uma ampla visão geral do Docker: o que é, como deveria ser usado e quais vantagens ele oferece quando implementado com tudo isso em mente.