O que é o Docker

Atualmente os sistemas de software afetam praticamente todos os aspectos de nossas vidas. No entanto  erros em sistemas de computação podem produzir prejuizos assustadores como explodir uma nave espacial, levar uma empresa multimilionária a falência ou expor a imagem de uma gigante e lider na área de video-games. Todos estes exemplos são reais e a todo momento vemos noticias de outras catástrofes ocorridas por erros de software.

 

Qual o motivo para ocorreram estas coisas ? No raiz do problema está a negligência com a complexidade envolvida nos processos de desenvolvimento e implantação de sistemas.

 

Um sistema de software bem escrito deve ser robusto, eficiente, confiável e flexível. Para conseguir isso devemos ter o controle de todo o Ciclo de Vida da Aplicação, desde a concepção, baseada nos requisitos do negócio, passando pelo desenvolvimento, testes, homologação, produção e gerenciamento de mudanças.

 

Ok, mas este é um artigo sobre Docker então por que falar disso tudo ?  Ora, por que o Docker vai facilitar nossa vida em várias etapas desse ciclo de vida da aplicação. Neste artigo vou descrever o que é o Docker pois este é o primeiro passo para poder usa-lo de forma eficiente para Gerenciar todos os Ciclos de Vida de nossas Aplicações.   

 

Gerenciamento do Ciclo de Vida da Aplicação

A manutenção de ambientes de Desenvolvimento, Homologação e Produção tem grande impacto no Gerenciamento do Ciclo de Vida da Aplicação (ALM – Application Lifecycle Management), devido a grande complexidade das aplicações atuais nas sua maioria rodando em ambiente distribuído. Para mitigar os riscos neste gerenciamento e manter os altos níveis de Qualidade desejados pelos usuários dos sistemas é necessário que usemos algumas das ferramentas disponíveis para os setores de Tecnologia da Informação que permitam alto nível de produtividade.

Considere como exemplo um sistema com com apenas 5 clientes. Como temos três ambientes diferentes para cada cliente devemos gerenciar 15 ambientes, cada um com seus ativos de software, banco de dados, scripts de teste, etc. Torna-se impossível usar maquinas reais nesta tarefa pois teríamos uma pilha de 15 máquinas que consumiria muitos recursos e muito espaço físico.  Para resolver este problema é necessário compartilhar os recursos de hardware usando algum tipo de virtualização.

 

Virtualização

Podemos optar por usar Maquinas Virtuais para facilitar o gerenciamento e provisionamento de serviços. Neste caso entra em cena a ferramenta Vagrant que facilita a criação dessas máquinas virtuais e o provisionamento de recursos de forma programática. Isto é possível usando ferramentas como Puppet, Salt, Chief ou Ansible.

A criação e manutenção de uma máquina virtual (Virtual Box, Hyper-V ou VMWare) demanda grande quantidade de tempo e, muitas vezes complexa. Além do fato dessas máquinas virtuais consumirem uma quantidade imensa de espaço em disco.  

 

Melhorando o modelo

 

Devido ao crescimento da demanda por Maquinas Virtuais e grande dificuldade na operação desse ambiente surgiu a necessidade de melhorar esse modelo. Os pesquisadores desta área perceberam que não havia a necessidade de recriar um SO completo e que bastava reusar os recursos de um mesmo SO num espaço de run-time independente chamado Virtual Environment. Lançando mão de uma funcionalidade nativa do Kernel Linux, para facilitar a criação e gestão destes ambientes virtuais leves, eles conseguiram ótimos resultados. Assim surgiu o LxC e mais recentemente o Software Docker que em pouco tempo roubou a cena quando se fala em automatizar a infraestrutura de software e hardware.

 

O Vagrant e o Docker se complementam num ambiente de Gerenciamento de infraestrutura de TI mais sofisticado.

 

Detalhando

 

A seguir vamos detalhar um pouco mais o Docker que é uma ferramenta extremamente útil na gestão de múltiplos ambientes para Gerenciamento do Ciclo de Vida do Software.

 

O Docker é uma plataforma aberta usada por desenvolvedores e administradores de sistemas para construir, entregar e rodar aplicações distribuídas. É composto pelo Docker Engine, que é uma ferramenta leve de execução e empacotamento, e pelo Docker Hub, um serviço em nuvem responsável pelo compartilhamento de aplicações e automação de fluxos de trabalho. Ele permite que aplicações sejam rapidamente montadas e elimina as diferenças entre os ambientes de desenvolvimento, testes e produção.

 

O Docker não é uma ferramenta de virtualização de máquinas, ele é um ambiente de virtualização de Linux, construído sobre os LinuX Contêineres (LxC), que utiliza as funcionalidades cgroups e namespacing do Kernel do Linux (e a linguagem Go) para criar e rodar ambientes Linux Virtuais isolados em um único host. Mais recentemente a equipe do Docker em parceria com 34 outras empresas (https://www.opencontainers.org/) fundaram a Open Container Initiative para padronizar conteineres e a forma de executá-los independente de sistema operacional.

 

O Virtual Environment – VE roda diretamente sobre o kernel já existente (do host) e apenas cria um contêiner  onde serão executados seus aplicativos, onde até é possível recriar outra configuração de SO, já que este será apenas outro aplicativo rodando sobre o kernel.

 

Vale observar que o Docker compartilha o kernel do Linux entre os ambientes e portanto seus contêineres não terão completo isolamento como acontece numa maquina real ou numa maquina virtual completa rodando sob Virtual Box, Hyper-V ou VMWare.

 

Acontece porém que o isolamento que ele proporciona atende plenamente as necessidades dos Sistemas de Informação em ambientes controlados, com a vantagem de executar extremamente rápido. Por exemplo, podemos rodar um comando num contêiner à partir do Host em alguns milisegundos.

O Docker usa AuFS (advanced multi layered unification filesystem) como sistema de arquivos, assim ele reutiliza a imagem do SO e as imagens relativas a cada um dos serviços instalados entre vários de seus contêineres em execução economizando recursos valiosos do computador host.

 

O Docker permite Implantação portátil através de máquinas, pois podemos usar o Docker para criar um objeto único que contém todas as suas aplicações empacotadas o qual chamamos Imagem Docker. Este objeto pode ser transferido e rapidamente instalado em qualquer outro host Linux com Docker habilitado, incluindo maquinas reais ou virtuais rodando Linux, Windows ou MAC OSX.

 

O Docker permite Reutilização de componentes pois podemos “empilhar” pacotes já criados cada um com sua funcionalidade específica. Por exemplo, se você precisa criar várias máquinas que todos necessitam de banco de dados Oracle e WebServer Apache, podemos criar uma imagem base contendo o Oracle e outra contendo o Apache, e na sequência, construir e criar novos contêineres que utilizam estas imagens base já criadas.

 

O Docker pode usar imagens disponíveis em bibliotecas compartilhadas. Existe um registro público onde podemos encontrar milhares de imagens já prontas (https://hub.docker.com/explore/)

 

Principais Funcionalidades do Docker

 

Contêineres facilmente portáveis: você pode criar uma imagem de toda a configuração e aplicativos instalados em seu contêiner, transferir e instalar em um outro host desde que tenha um Docker previamente instalado.

 

Versionamento: Docker permite que você versione as alterações de um contêiner de uma forma muito semelhante ao feito pelo GIT ou SVN. Isto permite portanto verificar as diferenças entre versões, fazer commit de novas versões e fazer rollback de uma dada versão.

 

Reutilização de componentes: as imagens criadas podem ser reutilizadas, como por exemplo, se diversas de suas aplicações utilizam um stack com Java 8, Tomcat 8 e Oracle 12 você poderá criar uma uma imagem base contendo estes itens com sua instalação e configuração. Desta maneira esta imagem poderá ser reutilizada em diversos Contêineres diferentes.  podemos construir imagens Docker usando um arquivo Dockerfile e o comando de montagem docker build. O Dockerfile usa uma DSL – Domain Specific Language –  simples com poucas instruções, porém sufucientes para construir imagens Docker. A abordagem de criação via Dockerfile pode ser repetida quantas vezes for necessário, em quantos ambientes seja desejado além de permitir gerenciamento de versão no GIT/SVN das definições da infraestrutura. Com esta DSL o Docker consegue levar a Metodologia de Orientação a Objetos para o provisionamento da Infraestrutura.

 

Compartilhamento: o Docker Hub já possui milhares de contêineres com as mais diversas aplicações instaladas e configuradas, desta maneira você pode rapidamente criar sua aplicação com uma base desenvolvida por outra pessoa, ou ainda criar sua base e compartilhá-la.

 

CLI – Command Line Interface e API – Application Program Interface: Permite criação de Programas e Scripts que interagem com o Docker para provisionar serviços nos Contêineres.

 

Automatização de Implantação dentro dos Contêineres: Usando os provisionadores que por sua vez usam a API do Docker, podemos automatizar a implantação dos ambientes de software.

 

Licença Open Source: Licenciado como Apache License, Version 2.0 mantem os códigos fonte em https://github.com/docker/docker para facilitar o desenvolvimento colaborativo.

 

Evita Dependency Hell: Um dos maiores problemas em múltiplos ambientes com os quais os desenvolvedores de software convivem diariamente é o gerenciamento de dependências. O Docker evita problemas neste gerenciamento.

 

Demanda Poucos Recursos de Hardware: Exige poucos recursos de processos, memória e espaço em disco.

 

Performance inigualável: é possivel baixar uma imagem Fedora do repositório público na Internet em menos de um minuto e executar um comando simples num contêiner criado com esta imagem, à partir do computador Host, em menos de um segundo.

  

Ligação entre Contêineres

Conectar contêineres via mapeamentos de porta TCP/IP não é a única forma de disponibilizar recursos entre eles. Um contêiner Docker pode se conectar a um outro via um sistema de ligação e enviar informações de um para o outro de forma eficiente e segura. Quando os contêineres estão ligados, a informação sobre o contêiner origem pode ser enviada para um contêiner destino. Isso permite que o contêiner destino possa acessar dados selecionados do contêiner origem. Como exemplo, podemos então criar um contêiner chamado web (destino) e ligá-lo a um contêiner chamado db (origem) usando um alias para o link chamado dblink, por exemplo. Para permitir a ligação o Docker cria um tunel seguro entre o contêiner origem e o contêiner destino, eliminando a necessidade de expor qualquer porta TCP/IP externamente a estes dois contêineres.

 

Orquestração com Docker Compose

 

Docker Compose é uma ferramenta para definir e rodar aplicações complexas via Docker. Com Compose, podemos definir uma aplicação multi-contêiner num único arquivo, e em seguida iniciar a aplicação e tudo da qual ela depende para sua executação. O Docker Compose é ótimo para usar em ambientes de desenvolvimento, homologação e Integração Contínua e permite implementar Arquitetura de Micro Serviço de forma simples.

 

Para saber mais sobre Docker Compose e Orquestração de Serviços e obter todas as vantagens desta plataforma faça o curso Introdução ao Docker compreendendo 16 horas. Link permanente : http://cursos.escolalinux.com.br/curso/introducao-ao-docker-16-horas

 

Virtualização Enxuta
Por tudo isso que foi exposto aqui podemos dizer que o Docker permite levar para a Infraestrutura de TI esta Técnica de Virtualização Enxuta que nos proporciona o benefício da eliminação de desperdício da mesma forma que é preconizada pelas Metodologias Ágeis para Desenvolvimento de Software (SCRUM/XP) e de Produtos e Negócios (Lean Startup).

 

O Docker no Comando

Aliando o Docker com uma ferramenta de Integração Contínua, tal como o Jenkins, podemos gerenciar automáticamente via Scripts todo o ciclo de vida da aplicação. Isto é possível devido a sua característica de permitir que instalemos e executemos uma instância de Docker de dentro de outro Contêiner Docker.

 

 

 

Posicionamento do Docker no mercado

Os profissionais de TI que estão escolhendo uma tecnologia para automatizar sua infraestrutura vão gostar de ver este gráfico abaixo que mostra como o mercado está vendo está revolução causada pelo Docker principalmente à partir de meados de 2014 para cá. O crescimento do Docker foi exponencial.

O Vagrant não compete diretamente com o Docker e também está crescendo, porém mais lentamente.

Este gráfico reflete aquilo que já sabíamos mesmo que intuitivamente: as funcionalidades implementadas pelo Docker para suporte ao que podemos chamar de Virtualização Enxuta está surpreendendo o mercado de TI devido ao uso super eficiente de recursos (Memória, Disco, CPU) e a facilidade com que permite tirar proveito desses recursos.

Por curiosidade podemos comparar as pesquisas feitas sobre Docker com aquelas feitas sobre Lean Startup e SCRUM que também estão relacionados a eliminação de desperdício, porém nas áreas de Gestão de Negócios e Gestão de Desenvolvimento de Software respectivamente. Veja o gráfico abaixo mostrando como a curva de interesse pelo Docker é muito mais ascendente. Isto reflete a Inovação que o Docker incorporou e o quanto o mercado está empolgado com esta descoberta.

Por isso é muito importante que nós profissionais de TI nos especializemos nesta tecnologia para tirar o máximo de proveito dela para diminuir o esforço de Gestão de Infraestrutura nos nossos Centros de Processamento de Dados.

Para quem desejar se aprofundar no Docker pode solicitar um cupom de desconto para o curso neste link

Este é um curso on-line que preparei para a Escola Linux empresa do grupo Linux Solutions.

Obs.: Uma das sessões do curso trata da utilização do Docker na plataforma Windows e na plataforma MAC OSX.

SCRUM, Métodos Ágeis e Docker

O evento anual de SCRUM e Metodologias Ágeis Regional Scrum Gathering® Rio 2015  aconteceu nos dias 13, 14, e 15 de agosto em Copacabana, coração do Rio de Janeiro. Este evento Scrum Gathering é marca registrada da Scrum Alliance que ocorre em todo o mundo e no Brasil é realizado pela K21  empresa certificada para treinamentos SCRUM com grande experiência nessas metodologias que estão revolucionando a forma de gerir projetos e negócios. O evento demonstrou o interesse cada vez maior dos participantes pela aplicação destas metodologias nos negócios. Antigamente este evento era mais focado na gestão ágil para Desenvolvimento de Software mas agora toma outra dimensão.

 

 

Um pouco de história

O embrião destas metodologias ágeis surgiram na industria automotiva Japonesa, ou mais específicamente na Toyota como descreve Jeff Sutherland em seu livro Scrum: A Arte de Fazer o Dobro do Trabalho na Metade do Tempo. Jeff e seus colaboradores trouxeram estas ideias da Industria Automobilistica consolidando como metodologia ágil para a área de desenvolvimento de software. Mais recentemente Eric Ries aplicou estes conceitos para negócios e produtos como descrito no seu livro A Startup Enxuta (The Lean Startup)

O segredo do sucesso

O que está por trás do sucesso dessas metodologias é a eliminação do desperdício, o foco no cliente, o uso de métricas e experimentação, a colaboração e comprometimento nas equipes altamente integradas, a simplificação dos processos de gestão e o uso de ferramentas adequadas de TI.

Onde entra o Docker nisso ?

É neste ultimo item que entra o  Docker e a tecnologia de Contêineres. Esta tecnologia que iniciou com o suporte a LXC – Linux Containers, agora ganhou uma especificação independente de Sistema Operacional o que permitirá que a Microsoft lance em breve sua versão nativa de Docker (hoje ela roda numa mini maquina virtual Linux chamada Boot2Docker). O mesmo poderá ser feito no BSD, no Solaris, no MAC OSX e em outros sistemas num futuro próximo.

Enquanto isso podemos usar o a versão atual sem nenhum prejuizo já que o Docker roda 100% na maioria dos provedores de Cloud Computing e nos nossos Centros de processamento de Dados locais.

O Docker já é um EcoSistema de automação de Infraestrutura totalmente alinhado com os objetivos dos Processos Enxutos. Com ele podemos implementar nossa infraestrutura para Testes Automatizados, Integração Contínua, Entrega Contínua com a Escalabilidade e Resiliência desejada e exigida pelos negócios modernos baseados na WEB, no Comércio Eletrônico nas Apps Móveis com geolocalização e integração com mídias sociais.

A eliminação do desperdício é uma das grandes vantagens do Docker devido a sua arquitetura de imagem em camadas reutilizáveis. Enquanto uma máquina virtual leva minutos para levantar um serviço, no Docker isso pode levar alguns poucos segundos, graças a reusabilidade extrema de recursos.

A nivel de Arquitetura o Docker valoriza Micro Serviços permitindo integração completa e segura entre Contêineres.

Com isso o Docker pode ajudar a implementar os métodos ágeis incluindo Startup enxuta, Integração Contínua,  Testes Automatizados e Entrega Contínua num indice de produtividade excelente melhorando o Time-to-Market e ao mesmo tempo alcançando um melhor Retorno de Investimento.

Parabéns a equipe da K21 pelo evento e esperamos ansiosamente o próximo em 2016.

Para quem desejar se aprofundar no Docker pode solicitar um cupom de desconto para o curso neste link

Este é um curso on-line que preparei para a Escola Linux