O que é o Docker?

Gorjeta

Este conteúdo é um trecho do eBook, .NET Microservices Architecture for Containerized .NET Applications, disponível no .NET Docs ou como um PDF para download gratuito que pode ser lido offline.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

O Docker é um projeto de código aberto para automatizar a implantação de aplicativos como contêineres portáteis e autossuficientes que podem ser executados na nuvem ou no local. A Docker também é uma empresa que promove e evolui essa tecnologia, trabalhando em colaboração com fornecedores de nuvem, Linux e Windows, incluindo a Microsoft.

Diagram showing the places Docker containers can run.

Figura 2-2. O Docker implanta contêineres em todas as camadas da nuvem híbrida.

Os contêineres do Docker podem ser executados em qualquer lugar, localmente, no datacenter do cliente, em um provedor de serviços externo ou na nuvem, no Azure. Os contêineres de imagem do Docker podem ser executados nativamente no Linux e no Windows. No entanto, as imagens do Windows podem ser executadas apenas em hosts Windows e as imagens do Linux podem ser executadas em hosts Linux e hosts Windows (usando uma VM Linux Hyper-V, até agora), onde host significa um servidor ou uma VM.

Os desenvolvedores podem usar ambientes de desenvolvimento no Windows, Linux ou macOS. No computador de desenvolvimento, o desenvolvedor executa um host do Docker onde as imagens do Docker são implantadas, incluindo o aplicativo e suas dependências. Os desenvolvedores que trabalham no Linux ou no macOS usam um host Docker baseado em Linux e podem criar imagens apenas para contêineres Linux. (Os desenvolvedores que trabalham no macOS podem editar código ou executar a CLI do Docker a partir do macOS, mas, no momento em que este artigo foi escrito, os contêineres não são executados diretamente no macOS.) Os desenvolvedores que trabalham no Windows podem criar imagens para contêineres Linux ou Windows.

Para hospedar contêineres em ambientes de desenvolvimento e fornecer ferramentas de desenvolvedor adicionais, o Docker envia o Docker Desktop para Windows ou macOS. Esses produtos instalam a VM necessária (o host do Docker) para hospedar os contêineres.

Para executar contêineres do Windows, há dois tipos de tempos de execução:

  • Os Contêineres do Windows Server fornecem isolamento de aplicativos por meio da tecnologia de isolamento de processos e namespaces. Um Contêiner do Windows Server compartilha um kernel com o host do contêiner e com todos os contêineres em execução no host.

  • Os Contêineres do Hyper-V expandem o isolamento fornecido pelos Contêineres do Windows Server executando cada contêiner em uma máquina virtual altamente otimizada. Nessa configuração, o kernel do host de contêiner não é compartilhado com os contêineres do Hyper-V, proporcionando um melhor isolamento.

As imagens para esses contêineres são criadas da mesma maneira e funcionam da mesma maneira. A diferença está em como o contêiner é criado a partir da imagem que executa um contêiner Hyper-V requer um parâmetro extra. Para obter detalhes, consulte Contêineres do Hyper-V.

Comparando contêineres do Docker com máquinas virtuais

A Figura 2-3 mostra uma comparação entre VMs e contêineres do Docker.

Máquinas Virtuais Contêineres do Docker
Diagram showing the hardware/software stack of a traditional VM. Diagram showing the hardware/software stack for Docker containers.
As máquinas virtuais incluem o aplicativo, as bibliotecas ou binários necessários e um sistema operacional convidado completo. A virtualização completa requer mais recursos do que a conteinerização. Os contêineres incluem o aplicativo e todas as suas dependências. No entanto, eles compartilham o kernel do sistema operacional com outros contêineres, rodando como processos isolados no espaço do usuário no sistema operacional host. (Exceto em contêineres Hyper-V, onde cada contêiner é executado dentro de uma máquina virtual especial por contêiner.)

Figura 2-3. Comparação de máquinas virtuais tradicionais com contêineres do Docker

Para VMs, há três camadas base no servidor host, de baixo para cima: infraestrutura, sistema operacional host e um hipervisor e, além de tudo, cada VM tem seu próprio sistema operacional e todas as bibliotecas necessárias. Para o Docker, o servidor host tem apenas a infraestrutura e o sistema operacional e, além disso, o mecanismo de contêiner, que mantém o contêiner isolado, mas compartilhando os serviços básicos do sistema operacional.

Como os contêineres exigem muito menos recursos (por exemplo, eles não precisam de um sistema operacional completo), eles são fáceis de implantar e começam rapidamente. Isto permite-lhe ter uma maior densidade, o que significa que lhe permite executar mais serviços na mesma unidade de hardware, reduzindo assim os custos.

Como efeito colateral da execução no mesmo kernel, você obtém menos isolamento do que as VMs.

O principal objetivo de uma imagem é tornar o ambiente (dependências) o mesmo em diferentes implantações. Isso significa que você pode depurá-lo em sua máquina e, em seguida, implantá-lo em outra máquina com o mesmo ambiente garantido.

Uma imagem de contêiner é uma maneira de empacotar um aplicativo ou serviço e implantá-lo de forma confiável e reproduzível. Pode-se dizer que o Docker não é apenas uma tecnologia, mas também uma filosofia e um processo.

Ao usar o Docker, você não ouvirá os desenvolvedores dizerem: "Ele funciona na minha máquina, por que não na produção?" Eles podem simplesmente dizer: "Ele é executado no Docker", porque o aplicativo Docker empacotado pode ser executado em qualquer ambiente Docker suportado e é executado da maneira que foi planejado em todos os destinos de implantação (como Dev, QA, preparo e produção).

Uma analogia simples

Talvez uma simples analogia possa ajudar a compreender o conceito central do Docker.

Voltemos no tempo aos anos 1950 por um momento. Não havia processadores de texto, e as fotocopiadoras eram usadas em todos os lugares (tipo de).

Imagine que você é responsável por emitir rapidamente lotes de cartas, conforme necessário, enviá-las aos clientes, usando papel e envelopes reais, para serem entregues fisicamente no endereço de cada cliente (não havia e-mail na época).

Em algum momento, você percebe que as letras são apenas uma composição de um grande conjunto de parágrafos, que são escolhidos e organizados conforme necessário, de acordo com o propósito da carta, então você cria um sistema para emitir cartas rapidamente, esperando obter um aumento pesado.

O sistema é simples:

  1. Você começa com um conjunto de folhas transparentes contendo um parágrafo cada.

  2. Para emitir um conjunto de letras, você escolhe as folhas com os parágrafos de que precisa, depois empilha-as e alinha-as para que pareçam e leiam bem.

  3. Finalmente, coloque o conjunto na fotocopiadora e pressione start para produzir quantas letras forem necessárias.

Então, simplificando, essa é a ideia central do Docker.

No Docker, cada camada é o conjunto resultante de alterações que acontecem no sistema de arquivos após a execução de um comando, como a instalação de um programa.

Assim, quando você "olha" para o sistema de arquivos depois que a camada foi copiada, você vê todos os arquivos, incluídos na camada quando o programa foi instalado.

Você pode pensar em uma imagem como um disco rígido auxiliar somente leitura pronto para ser instalado em um "computador" onde o sistema operacional já está instalado.

Da mesma forma, você pode pensar em um contêiner como o "computador" com o disco rígido de imagem instalado. O contentor, tal como um computador, pode ser ligado ou desligado.