Container 101, Como instalar Docker? – Part I

O assunto do momento é Container(em pt-br Contêiner). Não os Container que são transportados nos navios, mas daquela “baleinha” que tem feito sucesso e acabou girando a cabeça dos desenvolvedores e dos analistas de operações para ela. Mas a razão pela qual eles tem o mesmo nome (Container) é a mesma.

Antigamente, o carregamento dos navios era muito lento, pois eram muitos produtos para transportar, como, por exemplo, sacas de café, arroz, feijão, produtos acabados, minérios, etc. Não existia um padrão para estocar e transportar esses produtos, então o carregamento de um navio demorava semanas e os produtos acabavam se misturando. Além disso, alguns tipos de carga eram até saqueados. Como resolver um problema de transposição de ambiente entre os produtos transportados. Foi buscada uma solução que trouxesse padrão,  isolamento e autonomia.

Padrão: Container trouxe um padrão para estocar os produtos e transportá-los dentro de um lugar para outro.

Isolamento: Produtos não se misturam e estão protegidos.

Autonomia: Um container é independente de outro container ou do seu conteúdo. Por exemplo, um container que leva carnes, tem sua refrigeração e seu sistema interno para dar as condições necessárias para transportar seu produto. Caso, em um navio, um container deste tipo tenha problemas na refrigeração, este fato não influenciará outros Containers do mesmo tipo, pois eles são independentes.

Mas o que Docker tem com isso?

Containers Docker foram criados com o mesmo objetivo: Padrão, Isolamento e Autonomia.

Mas quais os problemas que vieram pra resolver?

Na minha máquina funciona!

Em qualquer empresa que realize desenvolvimento de software, o cenário existente é:

Desenvolvedores criam e aperfeiçoam softwares críticos para o negócio.

Testam em ambientes diferentes de seus desktops/laptops (local de desenvolvimento).

Que, por sua vez, enviam o produto final para ambientes estáveis e controlados pela equipe de operações/produção/infra/etc(Cada empresa emprega um nome para a equipe responsável).

Devido ao cenário apresentado,  são encontradas divergências entre ambientes, como configurações, infraestrutura, recursos, etc. E ter o ambiente de homologação e produção dfierente do ambiente de desenvolvimento ou “máquina” do desenvolvedor, acabamos que ouvindo a famosa frase “Na minha máquina funciona!”. Porém no ambiente de homologação e/ou produção da sua empresa, as coisas acabam não funcionando como o esperado.

Para resolver este tipo de problema, onde as coisas costumam ter resultados diferentes do esperado, Containers foram criados para trazer padrão, isolamento e autonomia.

Padrão: Mesmo ambiente, configuração, infraestrutura, tanto na máquina do desenvolvedor, quanto em homologação, produção, nuvem, etc.

Isolamento: Aplicações diferentes  que costumavam dividir recursos(Memória, CPU) do servidor de aplicação, e até influenciando no comportamento de outras aplicações, agora passam a estar isoladas.

Autonomia: Uma aplicação dentro de um container não irá influenciar outra aplicação. Mesmo em ocasiões onde a aplicação para de funcionar ou reiniciar, outra aplicação continuará funcionando.

Estas características tem como bases algumas tecnologias Linux que possibilitam trazer Containers para o cenário de tecnologia.

cgroups: Provê isolamento de recursos computacionais para o container. Consumo de memória e CPU do cluster destinado para container. O Consumo de recurso de um container não influencia no consumo de outro container ou do host.

namespaces: Provê o isolamento dos processos no ambiente.

SELinux: Provê regras e políticas para garantir que o processo execute suas tarefas nos espaços do contexto de aplicação a qual ele pertence. Por exemplo, um apache sempre deverá escrever na pasta /var/www/html e não em /root.

Ao topo destas características foi criada uma engine que gerencia e controla o uso das funcionalidades citadas acima, logo temos Containers.

containers

Na imagem acima, podemos ver que através da engine instalada, podemos ter aplicações independentes e isoladas em Containers. No exemplo, vemos a engine docker que cria, e executa (docker run) os Containers.

container-docker

Na imagem anterior podemos ver os componentes docker.

A Docker Engine, responsável por gerenciar os recursos Linux é instalada.

Acima da engine temos o docker client, que se conecta na engine para execução de comandos, como inicialização de container.

Para se criar Containers, precisamos ter uma imagem base, ou seja, um container é criado a partir de uma imagem de container. Uma analogia à classe e objeto. Um ou mais objeto(s) é(são) criado(s) a partir de uma classe. Ou uma ou mais máquina(s) virtual(ais) é(são) criada(s) a partir de um template, ou arquivo.

As imagens de container são armazenadas em um Registry. Lugar responsável por armazenar as imagens do ambiente.

Usando o Sistema Operacional Fedora, você pode executar o comando e instalar:
sudo dnf install docker

Depois de instalado, basta habilitar o serviço, e iniciar:

docker

Neste cenário, temos a engine de container Docker, rodando no sistema.

Para iniciar um container basta executar:

docker run -p 80:80 -d docker.io/nginx

docker-run

Em background, a engine procura por uma imagem de container com o nome especificado no parâmetro do comando (docker.io/nginx), que significa o nome do registry e o nome da imagem. O parâmetro -p, representa que a porta 80 do container está para a porta 80 do host.

Portanto ao executar o comando curl localhost:80 no meu laptop, na verdade o conteúdo retornado é do web server nginx via porta 80 do container.

Como pode ser visto na imagem acima, o a engine de container docker foi instalada, e um container foi executado.

Da mesma forma que foi executado um container com conteúdo web, poderíamos subir containers de banco de dados, de aplicação de vários sabores e ainda sim, usufruir de um dos maiores benefícios desta tecnologia, que é o isolamento entre tecnologias, que torna melhor a forma de aproveitar os recursos disponíveis do servidor com melhor eficiência. E ainda com algo a mais, o mesmo container que coloquei a aplicação que desenvolvi, vai para o ambiente de testes, e posteriormente produção. Desta forma, temos uma padronização de ambiente, configuração e comportamento, onde o temos nossa tecnologia funcionando em diferentes ambientes.

 

Como faço para escalar containers? Como o container grava dados? O container que subi já está usando a porta 80, como faço? Essas perguntas serão respondidas no próximo post!

 

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s