Docker: Vamos falar sobre virtualização?

- 6 mins

No desenvolvimento de aplicações, podemos optar por usar máquinas virtuais (VMs) para facilitar o gerenciamento e provisionamento de serviços. Para isso, podemos citar o Vagrant. Mas, o provisionamento de máquinas virtuais demanda grande quantidade de tempo, além do fato do consumo demasiado de espaço em disco, recursos em geral da máquina que será o host.

Sumário

Introdução

Sim, eu fiquei alguns meses sem escrever! Sorry!

Sem ressentimentos, o assunto deste artigo é muito importante. Falaremos sobre virtualização, isso mesmo. Sim, eu sei que se fôssemos descrevê-lo em muitos detalhes, levaríamos longos e diversos artigos. Portanto, o objetivo deste artigo é trazer um “resumão” sobre este assunto. Falarei sobre virtualização tradicionalvirtualização por contêineres e apresentarei o Docker (caso não o conheça).

O objetivo deste artigo é descrever as teorias por volta do tema, farei um segundo artigo, que será um na prática com o Docker.

Sem mais delongas, chega mais que vai ser muito foda!

Pegue um café

Corre lá e pegue um pouco de café, o assunto será bem interessante.

https://rifeli.me/img/posts/2016/11/03/get-coffee.gif

Um pouco sobre Virtualização

No desenvolvimento de aplicações, podemos optar por usar máquinas virtuais (VMs) para facilitar o gerenciamento e provisionamento de serviços. Para isso, podemos citar o Vagrant. Mas, o provisionamento de máquinas virtuais demanda grande quantidade de tempo, além do fato do consumo demasiado de espaço em disco, recursos em geral da máquina que será o host.

Assim surgiu o LXC. O Linux Container, ou LXC, foi lançado em 2008 e é uma tecnologia que permite a criação de múltiplas instâncias isoladas de um determinado sistema operacional. Ou seja, uma maneira de virtualizar aplicações dentro de uma máquina (hospedeira) usando todos os recursos disponíveis no mesmo Kernel da máquina hospedeira.

Tendo como precursor, o comando chroot, que foi lançado em 1979 pelo Unix V7, como intuito de segregar acessos de diretórios e evitar que os usuários possam acessar à estrutura raiz (/). Este conceito evoluiu alguns anos, com o lançamento do comando jail, no SO FreeBSD 4.

Com relação à virtualização, a diferença está no fato do LXC não necessitar de uma camada de sistema operacional para cada aplicação. Como você pode verificar na imagem abaixo.

https://rifeli.me/img/posts/2016/11/03/c-structure.png

Ao compararmos o LXC com a virtualização tradicional, fica mais claro que uma aplicação sendo executada em um LXC demanda muito menos recursos, consumindo menos espaço em disco e com um nível de portabilidade muito mais abrangente.

O que é o Docker?

https://rifeli.me/img/posts/2016/11/03/docker.png

Nasceu como um projeto da DotCloud, uma empresa PaaS (Platform as a Service).

Basicamente, Docker é uma plataforma open-source, escrita em Go, tendo como finalidade, criar e gerenciar ambientes isolados para aplicações. O Docker garante que, cada contêiner tenha tudo que uma aplicação precisa para ser executada.

Em outras palavras, o Docker é uma ferramenta de empacotamento de uma aplicação e suas dependências em um contêiner virtual que pode ser executado em um servidor linux.

Então, Docker é uma VM?

Não, contêineres docker possuem uma arquitetura diferente que permite maior portabilidade e eficiência.

https://rifeli.me/img/posts/2016/11/03/docker-system.png

Tecnologias e ideias utilizadas

Cara, contêiner não é nada novo, Docker surgiu para facilitar o uso deles. Abaixo um resumo de tecnologia e o ano da primeira versão:

https://rifeli.me/img/posts/2016/11/03/technologies-year.png

O que é um contêiner?

Vamos fazer uma comparação prática. Contêiner nada mais é que uma caixa de metal, onde é colocado tudo o que couber. Contêineres possuem dimensões e interfaces comuns, onde guindastes e guinchos podem ser acoplados para colocá-los em navios ou caminhões.

Beleza e, no contexto do artigo?

A virtualização em contêineres é muito mais leve, onde, temos cada contêiner como uma instância isolada em um kernel de sistema operacional. Os contêineres possuem interfaces de redes virtuais, processos e sistemas de arquivos independentes.

Algumas características de um contêiner Docker:

Namespaces

O Docker utiliza os recursos de Namespaces para dispor um espaço de funcionamento isolado para os contêineres. Contudo, quando um contêiner é criado, também é criado um conjunto de namespaces e este, por sua vez, cria uma camada para isolamento para os grupos de processos. Abaixo seguem os tipos de namespaces:

Algumas Vantagens do Docker

Principais Funcionalidades

E uma das principais:

https://rifeli.me/img/posts/2016/11/03/dependency-hell.png

Docker Image

Uma imagem Docker nada mais é que, um arquivo inerte, imutável, que é essencialmente instanciado por um contêiner. As imagens são criadas com o comando build (entrarei em mais detalhes na segunda parte do artigo) e elas serão consumidas por um contêiner, ou seja, um contêiner é a instância de uma imagem. Como as imagens podem ser muito grandes, as imagens são projetadas para serem compostas por camadas de outras imagens.

Basicamente, uma imagem é um conjunto de camadas que você descreve e, quando você inicia uma imagem, você terá um contêiner em execução desta imagem e você pode ter muitos contêineres da mesma imagem. Portanto, uma imagem em execução é um contêiner.

E como criar uma imagem, ou seja, como descrever as camadas de uma imagem? Chega mais…

Leonardo Rifeli

Leonardo Rifeli

I'm a brazilian 🇧🇷 Data Engineering. Co-founder & CTO at Harmo.

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora