Docker – Fundamentos, conceito e arquitetura

Docker o que é e para que server?


Você provavelmente já ouviu falar alguma coisa sobre o Docker. Quase todos os dias surgem notícias sobre ele, seja por menções nas redes sociais ou em eventos promovidos por diversas empresas do segmento de tecnologia. Muitas dessas notícias falam sobre as constantes evoluções que o Docker vem passando.

Puxa, mas como posso acompanhar toda essa evolução tecnologica do Docker, sem saber o que realmente é e onde devo utilizá-lo?

Se fazermos uma breve pesquisa sobre o Docker, veremos que é um tanto quanto confuso todo o seu conceito, suas constantes versões, a maneira como podemos implementarmos e muito mais…

Mas enfim, vamos lá, tentarei ser o mais simplista possível para explicar o pouco que aprendi sobre ele.

O início.
O Docker nasceu na empresa dotCloud. A empresa dotCloud na época era um empresa de hospedagem, e basicamente utilizava Containers Linux em quase todo seu ambiente.

Você deve estar se perguntando:
Ops… Pera lá, muita calma nessa hora, afinal o que é Container Linux?

LXC.
Container Linux (LXC) é um tipo de virtualização em nível de sistema operacional que proporciona a execução de múltiplas instâncias isoladas de um determinado sistema operacional dentro de um único hospedeiro. O conceito é simples e antigo, sendo o comando chroot seu precursor mais famoso. Com o chroot é possível segregar os acessos de diretórios e evitar que o usuário possa ter acesso à estrutura raiz (“/” ou root).

Com o passar do tempo, a dotCloud percebeu tudo quanto tinha feito, e eis que era muito bom, e então em 2013 eles resolveram disponibilizar todas as suas ferramentas.

Com a disponibilização dessas ferramentas, diversas empresas resolveram apostar no projeto, tornando então um dos maiores projetos da atualidade chamado Docker.

O conceito.
O conceito nada mais é do que um isolar os recursos e as suas aplicações através de uma imagem (template), otimizando deploy, performance, agilidade, entrega e principalmente a forma de como é possível compartilhar todos os recursos sejam eles físicos ou lógicos.

Arquitetura do Docker.
O back-end do Docker é feito com base no LXC. O Docker é como um Container em um navio, que pode conter vários serviços como já comentado acima. Sua arquitetura é composta por um hospedeiro (host físico ou virtual). Ele trabalha com um sistema de arquivo chamado aufs, que permite que os passos para configuração do Container funcionem de forma incremental. Além de utilizar e compartilha as bibliotecas e os binários do Sistema Operacional hospedeiro. Com o Docker não é necessário instalar um Sistema Operacional em cima de outro Sistema Operacional, basta apenas instalar o Docker e pronto.

Como funciona o Docker?
A parte mais legal dos Containers Docker é que eles não precisam de um sistema operacional completo rodando. Basta baixar as imagens de um repositório, que geralmente são imagens bem enxutas e em seguida utilizá-las em diversos tipos de aplicações. As partes principais que compõe o Docker são:

docker daemon: Gerencia os Containers.
docker CLI: Gerenciar a comunicação com o Docker Daemon.
docker image index: Gerencia o repositório (público ou privado).

Imagens Docker.
As imagens Docker nada mais é que um template de um determinado Sistema Operacional, contendo ou não um software específico. Geralmente faz uso do UFS (Sistema de Arquivos Unix), e podem serem criadas através do arquivo de configuração Dockerfile.
Com o Docker É possível controlar os recursos de CPU, Memória e Disco através dos parâmetros de configuração, que são passados no Start do Container, ou durante a execução do Container.
Um Container não pode ser iniciado sem que aja uma imagem. Através de uma imagem iniciada por um Container é possível gerar novas imagens, bastando apenas aplicar um commit a cada mudança realizada.
Agora se houver uma mudança na imagem em execução (Container), e por algum motivo for encerrado (exit) sem que tenha sido aplicado o commit, todas as alterações serão perdidas. Fui claro?

Exemplo:

Vamos supor que eu já tenha um imagem default do Sistema Operacional Linux Ubuntu. Quando eu iniciar o Container, será preciso informar qual a imagem que pretendo utilizá-la, neste caso a imagem default do Ubuntu. Com o Container já iniciado, vamos supor que eu precise instalar o software Nginx (Web Service), até ai normal, mas… se eu não aplicar um commit dessa alteração na imagem default Ubuntu (instalação do Nginx), tudo será perdido quando o Container for encerrado. Por isso a cada alteração será necessário aplicar um commit, gerando então o versionamento da imagem default. Complexo né?! Na prática é bem mais fácil.

Você deve estar se perguntando:
Se a cada mudança eu preciso aplicar um commit, o que faço então com os arquivos que são dinâmicos? 🙁

Volumes.

No Docker existe um parâmetro muito importante, o parâmetro volumes.
Através do volumes é possível mapear uma área do Host hospedeiro para dentro do Container Docker, desta forma os arquivos dinâmicos (que precisam serem alterados), não serão afetados com o fim da execução do Container. 😉

Dockerfiles.
Dockerfiles são arquivos de compilação simples que descrevem como criar uma imagem para um Container a partir de um ponto inicial conhecido (Imagem default). As vantagens em utilizar o Dockerfiles são:

Versionamento Fácil – controle de versão;
Previsibilidade – Ajuda a remover erros humanos;
Responsabilidade – fornece o histórico dos passos utilizados para criar a imagem;
Flexibilidade – permite que substitua os padrões que a compilação interativa fornece;

Network.
Creio que seja um dos pontos mais importantes para quem deseja utilizar o Docker. Existem várias maneiras de utilizarmos a Network do Docker, porém neste artigo, não irei aprofundar muito neste assunto, devido a sua complexiadade e pelo fato de estarmos iniciando no mundo dos Containers.
Da mesma forma que utilizamos o parâmetro volumes para mapear um diretório do Host hospedeiro, também é possível mapear um porta do Host hospedeiro para dentro do Container Docker.
Podemos também utilizar os Containers Docker através de redes Bridge, None e Host.

Bridge
Cada container iniciado no docker é associado a uma rede especifica, e essa é a rede padrão para qualquer container que não foi explicitamente especificado.

None
Essa rede tem como objetivo isolar o container para comunicações externas, ou seja, ela não receberá nenhuma interface para comunicação externa. A sua única interface de rede IP será a localhost.

Host
Essa rede tem como objetivo entregar para o container todas as interfaces existentes no docker host. De certa forma isso pode agilizar a entrega dos pacotes.

Você deve estar se perguntando:
E como faço para mapear uma porta, como defino um IP para o Container…?

Essas perguntas infelizmente não poderei responder neste artigo, terei que deixar para um outro artigo devido a sua complexidade.


Não devo utilizar o Docker para:
Não trate o Container Docker como uma máquina virtual. Ele é apenas um serviço, nada mais que um processo do Host hospedeiro. O Container não pode ter uma vida longa (uptime), como ele é um processo do host hospedeiro, ele precisa ser encerrado e iniciado quando possível. Não armazene dados dentro do Container Docker, utilize sempre o parâmetro volumes para armazenar os dados dinâmicos. E por fim, assegure que o host hospedeiro possui os recursos necessários de segurança para acesso nos Containers Docker.

Onde devo utilizar o Docker.
Com certeza em ambientes de Desenvolvimento e produção.

Você deve estar se perguntando:
Como assim?

Sim, claro que podemos utilizá-lo nos ambientes de produção, afinal o seu nível de maturidade já está bem elevado. Com o Docker é possível utilizar um mesmo Container que perpassa todas as fazes do desenvolvimento chegando até a produção, passando pelos testes até o seu deploy, sem muito esforço.
Desta maneira, todo o ciclo de desenvolvimento à produção do aplicativo se dão dentro de um mesmo ambiente, evitando suas inconsistências e até o famoso “funcionava perfeitamente na minha máquina”… 😉

Escalabilidade.
Com o Container Docker eu posso simplesmente pegar a minha imagem e movê-la para qualquer nuvem que eu deseja usar, desde que eu tenho o Docker disponível para uso. Desta forma, é possível escalar a minha aplicação bem mais rápido do que a forma tradicional. Além de ter a possibilidade de não ficar preso em uma única Nuvem pública ou privada.
Porque usar Containers?

Velocidade;
Economia de recursos;
É possível subir vários Containers Docker ao mesmo tempo, consumindo o minimo de recursos dos hardwares físicos ou virtuais.

Por fim.
Em poucas palavras, o Docker oferece a você um conjunto completo de ferramentas de alto nível para transportar tudo que constitui uma aplicação.

Conclusão.
O Docker fornece os blocos construtivos fundamentais necessários às implantações de Containers distribuídos. Através do empacotamento dos componentes, das aplicações em seus próprios Containers e da sua escalabilidade horizontal torna-se um simples processo de lançar ou desligar múltiplas instâncias de cada componente.

Docker – Fundamentos, conceito e arquitetura
Tagged on:

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

%d blogueiros gostam disto: