Desenvolvendo e Implantando Software com Docker — Introdução

Fabio Lenine
6 min readMar 26, 2018

--

Nesse post veremos o que é Docker, uma breve história, que mudança de paradigma que foi provocado pelo Docker e um pouco de ambientes de produção nesses últimos anos.

Era uma vez

O conceito de contêiner é antigo, por décadas os sistema UNIX forneceram através do comando chroot, disponibilizando um tipo simples de isolamento do sistema de arquivos.

A FreeBSD, a partir de 1998, forneceu o utilitário jail, estendendo o modo seguro do chroot para os processos.

Por sua vez a Solaris Zones, em 2001, oferecia uma tecnologia de conteinerização comparativamente completa. No entanto, limitada ao sistema operacional da Solaris.

Ainda em 2001, a Parallels Inc (SW Soft) lançou a tecnologia de contêiner comercial Virtuozzo para o Linux, tornando-se open source em 2005, sendo denominada de OpenVZ.

A Google entra na brincadeira em 2008, reunindo o CGroups, os namespaces do kernel e a tecnologia chroot (et coetera) para fornecer uma solução de conteinerização completa.

E por fim, o primeiro anúncio público do Docker (estivador) foi realizado por Solomon Hykes, CEO da dotCloud, em 15 de Março de 2013, no lightning talk de Python na Califórnia. Veja o video de lançamento abaixo, ou pelo link: https://youtu.be/wW9CAH9nSLs

The future of Linux Containers — At PyCon Solomon Hykes shows docker to the public for the first time.

O objetivo era efetuar um gerenciamento mais simples do PaaS (Platform as a Service) da dotCloud, com deploy similar ao Heroku, utilizando o conceito de contêineres Linux ao invés de máquinas virtuais.

Em 2013 o Docker tornou-se open source (código aberto), e ocorreu a mudança do nome da empresa de dotCloud para o mesmo nome do produto Docker.

Mas, o que é Docker?

Para explicar melhor o que é Docker, permita-me aplicar uma metáfora:

Imagine que você tenha que transportar milhões de unidades de um novo smartphone da fabrica que está na China até o mercado americano e europeu (lojas). Pense que para transportar em navios, depois trens e caminhões, ficar movendo as caixas (uma unidade ou varias) de um meio de transporte para o outro, não é uma maneira otimizada e nem segura de se fazer.

Para essa missão a maneira mais segura e rápida seria utilizar contêineres, iniciando na fábrica que ficaria com a missão de organizar a mercadoria nos contêineres, onde basta um pau de carga ou um guindaste e alteramos o meio de transporte (caminhão -> navio -> trem -> caminhão) que agora seguirá viagem para o seu próximo destino. Mudança de meio de transporte feito de maneira rápida, eficaz, segura e de baixo custo.

Voltando ao nosso mundo de desenvolvimento de softwares, o escopo do Docker é proporcionar de forma rápida, eficaz, segura e de baixo custo, a possibilidade de trafegar em qualquer rede (servidor Linux) em contêiner. Não importando como é ou foi construída a sua aplicação, sejam baseadas na web, sejam workers, sejam compiladas ou não, sejam escritas em PHP, Python, Java ou Go.

Em suma, Docker é uma tecnologia de software que fornece contêineres encapsulando e estendendo de várias maneiras, para desenvolvedores e administradores de sistemas desenvolverem, implementarem e executarem aplicativos com contêineres.

Mudança de Paradigma

Conceito de paradigma em grego parádeigma, em latim paradigma, francês paradigme. Os senhores estão anotando? Vou pedir isso na prova. Em inglês paradigm, em alemão paradigma, em italiano paradigma, em espanhol paradigma

Desculpe-me, mas não pude evitar a referencia ao capitão Nascimento do filme Tropa de Elite. 😜

Por muito tempo o paradigma era comprar máquinas físicas (servidores), para hospedar nossas aplicações. Em seguida veio a computação em nuvem, onde alugamos não máquinas, mas o recursos que essas máquinas representam, e.g. CPU, memória RAM, armazenamento em disco et coetera, tudo isso graças à virtualização.

Seguindo a linha de raciocínio supracitado, perceberemos que estamos em uma mudança de modelo onde as virtualizações dos sistemas operacionais para trabalhar em nuvem, serão substituídas por contêineres para aproveitar melhor nossas máquinas, sejam físicas ou virtuais.

Essa mudança atingi a maneira de desenvolvimento, distribuição e execução dos softwares. Pois podemos contruir softwares localmente, sabendo que ele será executado de maneira idêntica não importando o ambiente de hospedagem, seja em um rack no departamento de TI do cliente, laptop do usuário ou em um cluster na nuvem.

O baixo custo não está apenas relacionado aos equipamentos (servidores) e fornecedores de estrutura de servidores, mas também na utilização dos recursos humanos. Os engenheiros de operações podem se concentrar na rede, nos recursos e no período de funcionamento e passar menos tempo configurando ambientes e cuidando de dependências do sistema.

Ambientes de Produção

Percebe-se que contêineres são um encapsulamento para um aplicativo com suas dependências. Mas, essa ideia pode nos levar, à primeira vista, confundir com um tipo de máquina virtual (VM ou virtual machine) um pouco mais leve, pois devemos lembrar que o VM e o contêiner mantém uma instância de um sistema operacional (OS ou Operating System) isolada, que pode ser usada na execução do software.

Para melhor diferenciar o conceito e vantagens do contêiner para virtual machine, apresentaremos os seguintes pontos:

  • Os contêineres compartilham recursos como o sistema operacional host, como vantagem os aplicativos executados em contêineres possuem pouco ou nenhum overhead em comparação com aplicativos executados nativamente no sistema operacional do host;
  • A desculpa dos desenvolvedores: "Mas, funciona na minha máquina!", desaparece, pois a portabilidade dos contêineres possui o potêncial de eliminar uma classe inteira de bugs causados por mudanças sutis no ambiente de execução;
  • Podem executar muito mais contêineres em uma única máquina host que usando virtual machine. Desta forma, permite emular um sistema distribuído e complexo, pronto para produção;

No entanto, a diferença mais importante entre as máquinas virtuais e dos contêineres é:

A finalidade de uma VM é emular totalmente um ambiente externo enquanto a de um contêiner é tornar os aplicativos portáveis e independentes.

MÁQUINAS VIRTUAIS
CONTÊINER

Os microservices e o Docker fazem um casamento perfeito. Pois, os microservices são principais casos de uso e é fortemente incentivado com a adoção dos contêineres.

Além disso, temos visto crescimento e investimento animadores em microsserviços, abrindo novas oportunidades para pessoas desenvolvedoras criarem arquiteturas mais maleáveis. E a explosão de ecossistemas de contêineres está ajudando a reduzir o atrito na compilação e na implantação de aplicações na nuvem. — Dra. Rebecca Parsons, CTO da ThoughtWorks

Em oposição a tradicional maneira monolítica de desenvolver softwares (normalmente escrito em C++ ou Java), os microservices e a contêrização são uma maneira de desenvolver e compor sistemas de software através de componentes pequenos e independentes que interagem uns com os outros pela rede.

Há de não se olvidar que em termos de complexidade, os microservices são uma faca de dois gumes. Por isso devemos cuidar para manter a facilidade de enteder e modificar.

Espero que tenham gostado desse simples texto e continuaremos esse assunto em um futuro próximo. Abraços.

--

--