Olá pessoal, tudo bem?

A alguns meses comecei a estudar Docker, que é uma das plataformas de conteinerização mais utilizadas atualmente, e gostaria de compartilhar um pouco do que aprendi até agora com vocês. Vou começar com uma breve introdução e nos próximos posts detalharei os principais pontos.

Linux containers

Antes de falar sobre Docker, irei comentar sobre Linux Containers, ou LXC. O LXC é uma tecnologia que habilita a virtualização a nível de SO. Diferentemente das máquinas virtuais, containers não necessitam de um Hypervisor e duas camadas de Sistema Operacional (Host e Guest) para possibilitarem esta virtualização. Para isto, são utilizados alguns recursos do kernel como CGroups, Namespaces e Capabilities para permitir que o mesmo seja compartilhado entre várias aplicações de forma isolada, possibilitando inclusive que distribuições diferentes do Linux executem sobre um mesmo Kernel.

containers

Atualmente, a Microsoft está trabalhando no Windows Server Containers para suportar containers no Windows em um futuro próximo.

Vantagens 

Algumas das vantagens de containers sobre outros mecanismos de virtualização:

  • Melhor aproveitamento de recursos (Não são necessárias duas camadas de SO e o Hypervisor);
  • Agilidade (não é necessário iniciar e manter um SO Guest e o deploy de containers é rápido);
  • Portabilidade.

Desvantagens

Na minha humilde opinião, são poucas as desvantagens (uma neste caso):

  • É restrito a SOs compatíveis com o Kernel compartilhado.

Docker

Docker é uma tecnologia desenvolvida em Go, que abstrai a complexidade de criação e gerenciamento de containers. Inicialmente, o LXC era utilizado como driver de execução no Docker, porém, apesar de ainda ter suporte, agora o Docker tem seu próprio driver, o libcontainer.

docker-execdriver-diagram

Docker Daemon e Client

O Docker Daemon é a runtime do Docker propriamente dita. Ela não é acessada diretamente, e para efetuar qualquer tipo de comunicação com o Daemon é necessário o Docker Client.

Ambos podem estar em um mesmo computador, ou o Docker Client pode ser usado para acessar um Daemon remotamente.

Docker Images e Containers

Uma imagem do Docker é a base para criação de Containers. A partir de uma única imagem, é possível criar quantos containers forem necessários. O container em si, é um ambiente totalmente isolado onde a aplicação é executada, e cada container criado a partir de uma imagem é totalmente independente.

 

ContainerAndImages

Dockerfile

É possível criar imagens customizadas manualmente a partir de uma imagem existente, porém não é indicado devido ao trabalho excessivo para este fim. Por este motivo existe o Dockerfile, que é  uma “receita” para criar imagens para o Docker.  No exemplo abaixo, o fluxo de comandos cria uma nova imagem com base em uma já existe do Node 5.6, configura o sistema de arquivos, instala as dependências do Nodejs, copia a aplicação para dentro da imagem, abre a porta 3000 (apenas dentro do ambiente do Docker) e inicia a aplicação.

 Dockerfile

Docker Registry

O Docker registry é um repositório de imagens do Docker. Dele é possível obter imagens utilizando o comando FROM no Dockerfile, ou enviar uma imagem criada. O repositório oficial do Docker é o Docker Hub, mas é possível criar repositórios privados também.

Continua…

No próximo post, falarei um pouco sobre como funciona a “compilação” de um Dockerfile em uma imagem, com exemplos práticos.

Até a próxima!