Containers: você ainda vai usar um!

Logo Docker

Não faz nem 2 anos que o projeto Docker teve início, em Março de 2013, e os containers já parecem ser a nova hype tecnológica do momento. Não é para menos, pois em tempos de computação em nuvem, uma ferramenta que permite tamanha flexibilidade quanto o Docker é muito bem-vinda.

Tecnologias de containers permitem virtualizar um sistema operacional sem que seja necessário utilizar um hypervisor. Para isso, o sistema guest compartilha o mesmo kernel com o host e executa as camadas superiores de bibliotecas e aplicações em uma espécie de sandbox que, na prática, isola ambos os sistemas de forma a executá-los de maneira independente. Contudo, como ambos compartilham do mesmo kernel, só é possível "virtualizar" sistemas do mesmo tipo, o que torna a técnica muito propícia à compartimentação de aplicações. Além disso, como não é preciso carregar o kernel do guest nem traduzir as chamadas de um sistema para o outro, como ocorre, por exemplo, na paravirtualização, há muito menos overhead, o que resulta em um maior desempenho e menor uso de memória.

A ideia não é nova. O FreeBSD já detinha uma implementação de containers chamada Jails e o (Open)Solaris também possuía os Solaris Containers, ou Zones há alguns anos. Mesmo no mundo Linux, o OpenVZ já existe desde 2005, enquanto que o kernel Linux incorporou o suporte à tecnologia, ainda de forma experimental, em 2009, na versão 2.6.24, com a implementação do LXC, ou Linux Containers.

Então, o que há de tão interessante em relação ao Docker e o que justifica tanto buzz? O que diferencia o Docker de outras implementações de containers são suas APIs, o que permite utilizar a ferramenta em um fluxo de trabalho muito semelhante a algo que boa parte dos desenvolvedores já estão acostumados quando fazem uso de utilitários de linha de comando como o Git. De forma semelhante a este, no Docker, é possível facilmente criar um ambiente de desenvolvimento, "commitar" as mudanças e, uma vez concluído o trabalho, distribuí-lo através da rede para que colegas possam "clonar" o container através da Internet, testá-lo e após a conclusão do mesmo, colocar toda a aplicação em produção simplesmente copiando o container de um ambiente para outro.

Da mesma forma que os contêineres facilitaram o comércio internacional ao padronizar uma unidade de distribuição e transporte de bens materiais, containers como o Docker, tem a intenção de padronizar a distribuição de aplicações e serviços de software de maneira uniforme. Daí vem o nome Docker, ou estivador, em português. Em ambientes de cloud, o Docker é especialmente interessante, pois facilita o processo de deploy e mesmo a migração entre diferentes fornecedores de nuvem, sejam elas públicas ou privadas. Basta mover o container que pode, inclusive, conter todas as dependências (interpretadores, frameworks e até mesmo bancos de dados) para que sua aplicação execute de maneira autônoma.

Em dezembro de 2014, foi anunciado durante a primeira DockerConf, o suporte ao Docker no Jelastic, a plataforma de cloud como serviço (PaaS) da Locaweb, que deve estar disponível aos clientes ainda no primeiro semestre de 2015. Por isso, se você ainda não utilizou o Docker, preparamos um tutorial rápido para que você possa tirar proveito de todo o poder que essa tecnologia oferece.

Tutorial

A primeira coisa a fazer é instalar o Docker em seu sistema. No site do projeto há instruções de instalação para diversas plataformas. Tenha em mente que o Docker é uma implementação de containers para o GNU/Linux e, caso esteja realizando a instalação em outro sistema operacional, este executará virtualização convencional sob o Docker, o que obviamente tem impacto no desempenho, apesar de permitir o uso da ferramenta em outras plataformas.

Uma vez com o Docker instalado, digite docker em uma janela do terminal para ver as opções disponíveis para a execução. Você verá que a sintaxe de muitas delas se assemelham com termos do git, como commit, diff, logs, pull, tag, etc.

O Docker possui um repositório online de imagens prontas, semelhante ao Github: o Docker Registry. A forma mais simples de iniciarmos é baixando uma dessas imagens para a nossa máquina.

Que tal baixarmos uma imagem com o NodeJS instalado? Dessa vez, digite docker pull node e veja que o download terá início. Ao final do processo você poderá confirmar que a imagem foi instalada digitando docker images:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
node                latest              b8a47fa0cdf3        10 days ago         778.7 MB

Agora, se digitarmos docker run node npm -v e docker run node node -v veremos a versões do npm e do node sendo impressas em nosso terminal. O proximo passo é acessar o shell de nosso container. Para isso, digite:

# docker run -t -i node /bin/bash
root@8fe314df42de:/#

A opção -t diz ao Docker para reservar um terminal virtual (TTY) e o -i para abrir uma sessão interativa. Vamos utilizar o npm para instalar o pacote bitly-cli, que é uma ferramenta simples, para encurtarmos uma URL através da linha de comando. Após a instalação, podemos testar o uso da ferramenta:

root@8fe314df42de:/# npm install bitly-cli -g
/usr/local/bin/bitly -> /usr/local/lib/node_modules/bitly-cli/lib/bitly-cli.js
bitly-cli@0.0.1 /usr/local/lib/node_modules/bitly-cli
└── bitly@1.2.5
root@8fe314df42de:/# bitly -u "http://www.locaweb.com.br"
You can access your short url at http://bit.ly/1qS5jSL

Se na sequência abrirmos uma nova aba do terminal e digitarmos docker ps veremos o resultado abaixo:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8fe314df42de        node:latest         "/bin/bash"         12 minutes ago      Up 12 minutes                           stoic_almeida

Perceba que CONTAINER ID exibido é o mesmo que aparece no prompt onde estamos conectados na outra aba. Está na hora de criarmos o nosso próprio container com o bitly-cli embarcado. Crie uma conta ou faça login no Docker Registry ao digitar docker login e preencha os dados da conta. Em seguida, faça commit das alterações:

$ docker commit 8fe314df42de kemelzaidan/artigo_docker
c30cbbdfe63ed6448b9fbb8f88cbb7d46e39af2f1e898b153790a32e9fc867cd

Você deve utilizar o seu próprio login e nome da imagem. Se digitar docker images novamente, poderá ver a imagen recém-criada. Para compartilhar a imagem com alguém, basta publicá-la no Registry: docker push kemelzaidan/artigo_docker. Se você digitar docker search artigo_docker, poderá ver a imagem que eu acabei de enviar:

$ docker search artigo_docker
NAME                        DESCRIPTION   STARS     OFFICIAL   AUTOMATED
kemelzaidan/artigo_docker                 0

Gostou? Pois há muito mais o que aprender sobre o Docker. Instale o programa, siga o tutorial, baixe a imagem que acabamos de subir e conte para nós o que achou do artigo. Suas aplicações estão esperando para subir às nuvens!

Texto publicado originalmente na revista iMasters número 13