Compreendendo o Docker

Estou usando o Docker há vários meses para estruturar o processo de desenvolvimento/entrega de projetos web. Ofereço aos leitores do Habrakhabr uma tradução do artigo introdutório sobre o docker - "Compreendendo o docker".

O que é docker?

Docker é uma plataforma aberta para desenvolvimento, entrega e operação de aplicativos. Docker foi projetado para entregar seus aplicativos com mais rapidez. Com o docker, você pode dissociar seu aplicativo da infraestrutura e tratar a infraestrutura como um aplicativo gerenciado. O Docker ajuda você a enviar seu código com mais rapidez, testar com mais rapidez, enviar aplicativos com mais rapidez e reduzir o tempo entre a escrita e a execução do código. O Docker faz isso por meio de uma plataforma leve de virtualização de contêineres, usando processos e utilitários que ajudam você a gerenciar e hospedar seus aplicativos.

Basicamente, o docker permite executar praticamente qualquer aplicativo, isolado com segurança em um contêiner. O isolamento seguro permite executar vários contêineres no mesmo host ao mesmo tempo. A natureza leve do contêiner, que funciona sem a carga adicional de um hipervisor, permite que você aproveite melhor seu hardware.

A plataforma e as ferramentas de virtualização de contêineres podem ser úteis nos seguintes casos:

  • empacotar seu aplicativo (e os componentes que você usa) em contêineres docker;
  • distribuição e entrega desses containers para suas equipes para desenvolvimento e testes;
  • colocando esses contêineres em seus locais de produção, tanto em data centers quanto nas nuvens.

Para que posso usar o docker?

Publique rapidamente seus aplicativos

Docker é ótimo para organizar o ciclo de desenvolvimento. Docker permite que os desenvolvedores executem contêineres locais com aplicativos e serviços. O que posteriormente permite a integração com o processo de integração contínua e fluxo de trabalho de implantação.

Por exemplo, seus desenvolvedores escrevem código localmente e compartilham sua pilha de desenvolvimento (um conjunto de imagens Docker) com colegas. Quando estiverem prontos, eles enviam o código e os contêineres para o local de teste e executam os testes necessários. Do site de teste, eles podem enviar código e imagens para produção.

Disposição e desdobramento mais fáceis

A plataforma baseada em contêiner docker facilita a portabilidade de sua carga útil. Os contêineres Docker podem ser executados em sua máquina local, seja real ou em uma máquina virtual em um data center, ou na nuvem.

A portabilidade e a leveza do docker facilitam o gerenciamento dinâmico de sua carga de trabalho. Você pode usar o docker para implantar ou encerrar seu aplicativo ou serviços. A velocidade do docker permite que isso seja feito quase em tempo real.

Cargas mais altas e mais cargas úteis

Docker é leve e rápido. Ele fornece uma alternativa resiliente e econômica às máquinas virtuais baseadas em hipervisor. É especialmente útil em ambientes de alta carga, por exemplo, ao criar sua própria nuvem ou plataforma como serviço. Mas também é útil para aplicativos de pequeno e médio porte quando você deseja aproveitar ao máximo os recursos de que dispõe.

Principais componentes do Docker

Docker consiste em dois componentes principais:

  • Docker: uma plataforma de virtualização de código aberto;
  • Docker Hub: nossa plataforma como serviço para distribuição e gerenciamento de contêineres Docker.

Observação! Docker é distribuído sob a licença Apache 2.0.

Arquitetura Docker

Docker usa uma arquitetura cliente-servidor. O cliente Docker se comunica com o daemon Docker, que assume a responsabilidade de criar, executar e distribuir seus contêineres. Tanto o cliente quanto o servidor podem ser executados no mesmo sistema; você pode conectar o cliente a um daemon docker remoto. O cliente e o servidor se comunicam por meio de um soquete ou API RESTful.

Compreendendo o Docker

Daemon Docker

Conforme mostrado no diagrama, o daemon é executado na máquina host. O usuário não interage diretamente com o servidor, mas utiliza o cliente para isso.

Cliente Docker

O cliente Docker, o programa docker, é a interface principal do Docker. Ele recebe comandos do usuário e interage com o daemon docker.

Dentro da janela de encaixe

Para entender em que consiste o docker, você precisa conhecer três componentes:

  • imagens
  • registro
  • contentores

Imagens

A imagem Docker é um modelo somente leitura. Por exemplo, a imagem pode conter o sistema operacional Ubuntu com Apache e um aplicativo nele. As imagens são usadas para criar contêineres. O Docker facilita a criação de novas imagens, a atualização das existentes ou o download de imagens criadas por outras pessoas. As imagens são componentes de uma construção do Docker.

Registrar

O registro Docker armazena imagens. Existem registros públicos e privados dos quais você pode fazer download ou upload de imagens. Um registro público do Docker é Hub do Docker. Há uma enorme coleção de imagens armazenadas lá. Como você sabe, as imagens podem ser criadas por você ou você pode usar imagens criadas por terceiros. Os registros são um componente de distribuição.

Containers

Os contêineres são semelhantes aos diretórios. Os contêineres contêm tudo que o aplicativo precisa para ser executado. Cada contêiner é criado a partir de uma imagem. Os contêineres podem ser criados, iniciados, interrompidos, migrados ou excluídos. Cada contêiner é isolado e fornece uma plataforma segura para o aplicativo. Os contêineres são componentes da obra.

Então, como funciona o Docker?

Até agora sabemos que:

  • podemos criar imagens nas quais nossos aplicativos estão localizados;
  • podemos criar contêineres a partir de imagens para executar aplicativos;
  • Podemos distribuir imagens através do Docker Hub ou outro registro de imagens.

Vamos ver como esses componentes se encaixam.

Como funciona a imagem?

Já sabemos que uma imagem é um modelo somente leitura a partir do qual um contêiner é criado. Cada imagem consiste em um conjunto de níveis. Docker usa sistema de arquivos união para combinar esses níveis em uma imagem. O sistema de arquivos Union permite que arquivos e diretórios de diferentes sistemas de arquivos (diferentes ramificações) se sobreponham de forma transparente, criando um sistema de arquivos coerente.

Uma das razões pelas quais o docker é leve é ​​porque ele usa camadas como esta. Quando você altera a imagem, como atualizar um aplicativo, uma nova camada é criada. Portanto, sem substituir a imagem inteira ou reconstruí-la, como seria o caso de uma máquina virtual, apenas a camada é adicionada ou atualizada. E você não precisa distribuir toda a nova imagem, apenas a atualização é distribuída, tornando mais fácil e rápida a distribuição das imagens.

No centro de cada imagem está uma imagem base. Por exemplo, ubuntu, a imagem base do Ubuntu, ou fedora, a imagem base da distribuição Fedora. Você também pode usar imagens como base para criar novas imagens. Por exemplo, se você tiver uma imagem Apache, poderá usá-la como imagem base para seus aplicativos da web.

Observação! O Docker normalmente extrai imagens do registro do Docker Hub.

Imagens Docker podem ser criadas a partir dessas imagens base; chamamos as etapas para criar essas imagens de instruções. Cada instrução cria uma nova imagem ou nível. As instruções serão as seguintes:

  • comando de execução
  • adicionando um arquivo ou diretório
  • criando uma variável de ambiente
  • instruções sobre o que executar quando o contêiner desta imagem for iniciado

Estas instruções são armazenadas em um arquivo Dockerfile. Docker lê isso Dockerfile, ao construir a imagem, executa essas instruções e retorna a imagem final.

Como funciona o registro do Docker?

O registro é um repositório para imagens do Docker. Depois que a imagem for criada, você poderá publicá-la no registro público do Docker Hub ou em seu registro pessoal.

Com o cliente docker, você pode pesquisar imagens já publicadas e baixá-las para sua máquina docker para criar contêineres.

Docker Hub fornece repositórios de imagens públicos e privados. A pesquisa e o download de imagens de repositórios públicos estão disponíveis para todos. O conteúdo dos armazenamentos privados não é incluído nos resultados da pesquisa. E somente você e seus usuários podem receber essas imagens e criar contêineres a partir delas.

Como funciona um contêiner?

Um contêiner consiste em um sistema operacional, arquivos de usuário e metadados. Como sabemos, cada container é criado a partir de uma imagem. Esta imagem informa ao docker o que está no contêiner, qual processo iniciar, quando o contêiner é iniciado e outros dados de configuração. A imagem do Docker é somente leitura. Quando o docker inicia um contêiner, ele cria uma camada de leitura/gravação na parte superior da imagem (usando o sistema de arquivos union conforme mencionado anteriormente) na qual o aplicativo pode ser executado.

O que acontece quando o contêiner é iniciado?

Ou usando o programa docker, ou usando a API RESTful, o cliente docker informa ao daemon do docker para iniciar o contêiner.

$ sudo docker run -i -t ubuntu /bin/bash

Vamos dar uma olhada neste comando. O cliente é iniciado usando o comando docker, com opção run, que diz que um novo contêiner será lançado. Os requisitos mínimos para executar um contêiner são os seguintes atributos:

  • qual imagem usar para criar o contêiner. No nosso caso ubuntu
  • o comando que você deseja executar quando o contêiner for iniciado. No nosso caso /bin/bash

O que acontece nos bastidores quando executamos este comando?

Docker, em ordem, faz o seguinte:

  • baixa a imagem do Ubuntu: docker verifica a disponibilidade da imagem ubuntu na máquina local e, se não estiver lá, faça o download em Hub do Docker. Se houver uma imagem, ele a utiliza para criar um contêiner;
  • cria um contêiner: quando a imagem é recebida, o docker a utiliza para criar um contêiner;
  • inicializa o sistema de arquivos e monta o nível somente leitura: o contêiner é criado no sistema de arquivos e a imagem é adicionada ao nível somente leitura;
  • inicializa a rede/ponte: cria uma interface de rede que permite ao docker se comunicar com a máquina host;
  • Configurando o endereço IP: encontra e define o endereço;
  • Inicia o processo especificado: inicia seu aplicativo;
  • Processa e produz resultados do seu aplicativo: conecta e registra a entrada, a saída e o fluxo de erros padrão do seu aplicativo para que você possa acompanhar o desempenho do seu aplicativo.

Agora você tem um contêiner funcional. Você pode gerenciar seu contêiner, interagir com seu aplicativo. Quando você decidir interromper o aplicativo, exclua o contêiner.

Tecnologias utilizadas

Docker é escrito em Go e usa alguns recursos do kernel Linux para implementar a funcionalidade acima.

Espaços para nome

Docker usa tecnologia namespaces para organizar espaços de trabalho isolados, que chamamos de contêineres. Quando iniciamos um contêiner, o docker cria um conjunto de namespaces para esse contêiner.

Isso cria uma camada isolada, com cada aspecto do contêiner rodando em seu próprio namespace e não tendo acesso ao sistema externo.

Lista de alguns namespaces que o docker usa:

  • pid: isolar o processo;
  • líquido: para gerenciar interfaces de rede;
  • ipc: para gerenciar os recursos do IPC. (ICP: Comunicação InterProcessos);
  • mt: gerenciar pontos de montagem;
  • UTC: para isolar o kernel e controlar a geração de versão (UTC: Unix timesharing system).

Grupos de controle

Docker também usa tecnologia cgroups ou grupos de controle. A chave para executar um aplicativo isoladamente é fornecer ao aplicativo apenas os recursos que você deseja fornecer. Isso garante que os contêineres serão bons vizinhos. Os grupos de controle permitem compartilhar recursos de hardware disponíveis e, se necessário, definir limites e restrições. Por exemplo, limite a quantidade possível de memória para o contêiner.

Sistema de arquivos de união

Union File Sysem ou UnionFS é um sistema de arquivos que funciona criando camadas, tornando-o muito leve e rápido. Docker usa UnionFS para criar os blocos a partir dos quais o contêiner é construído. Docker pode usar diversas variantes de UnionFS incluindo: AUFS, btrfs, vfs e DeviceMapper.

Formatos de contêiner

O Docker combina esses componentes em um wrapper que chamamos de formato contêiner. O formato padrão é chamado libcontainer. Docker também oferece suporte ao formato de contêiner tradicional no Linux usando LXC. No futuro, o Docker poderá suportar outros formatos de contêiner. Por exemplo, integração com BSD Jails ou Solaris Zones.

Fonte: habr.com

Adicionar um comentário