O que é o Docker?
Dica
Esse conteúdo é um trecho do eBook, arquitetura de microsserviços do .NET para aplicativos .NET em contêineres, disponível em do .NET Docs ou como um PDF para download gratuito que pode ser lido offline.
O Docker é um projeto de código aberto usado para automatizar a implantação de aplicativos como contêineres portáteis e autônomos que podem ser executados na nuvem ou localmente. Docker também é uma empresa que promove e desenvolve essa tecnologia, trabalhando em colaboração com fornecedores de nuvem, Linux e Windows, incluindo a Microsoft.
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 só podem ser executadas em hosts do Windows, enquanto as imagens do Linux podem ser executadas em hosts Linux e, até agora, em hosts do Windows (usando uma VM Linux Hyper-V), em que 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 em que 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 do Docker baseado em Linux e podem criar imagens apenas para contêineres do Linux. (Os desenvolvedores que trabalham no macOS podem editar o código ou executar a CLI do Docker no macOS, mas a partir do momento dessa gravação, os contêineres não são executados diretamente no macOS.) Os desenvolvedores que trabalham no Windows podem criar imagens para contêineres do Linux ou do Windows.
Para hospedar contêineres em ambientes de desenvolvimento e fornecer ferramentas de desenvolvedor adicionais, o Docker envia o Docker Desktop para Windows ou para 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 runtimes:
Os Contêineres do Windows Server fornecem isolamento do aplicativo por meio da tecnologia de isolamento de namespace e processo. Um Contêiner do Windows Server compartilha um kernel com o host de 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 de Hyper-V, proporcionando um isolamento melhor.
As imagens desses 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 em execução; 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 |
---|---|
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 contêinerizaçã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, em execução como processos isolados no espaço do usuário no sistema operacional host. (Exceto em contêineres Hyper-V, em que cada contêiner é executado dentro de uma máquina virtual especial dedicada.) |
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 só tem 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 de sistema operacional base.
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 rápido. Isso permite que você tenha maior densidade, o que significa que permite que você execute 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 objetivo principal de uma imagem é que ela torne o ambiente (dependências) o mesmo em diferentes implantações. Isso significa que é possível depurá-la em seu computador e, em seguida, implantá-la em outro computador com o mesmo ambiente garantido.
Uma imagem de contêiner é uma maneira de empacotar um aplicativo ou serviço e implantá-lo de maneira confiável e reproduzível. Você poderia 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: "Funciona no meu computador, por que não em produção?" Eles podem simplesmente dizer: "Ele é executado no Docker", porque o aplicativo do Docker empacotado pode ser executado em qualquer ambiente do Docker com suporte e é executado da maneira que se destina a todos os destinos de implantação (como Desenvolvimento, QA, preparo e produção).
Uma analogia simples
Talvez uma analogia simples possa ajudar a entender o conceito principal do Docker.
Vamos voltar no tempo para os anos 50 por um momento. Não havia processadores de palavras, e as fotocopiadoras eram usadas em todos os lugares (meio que).
Imagine que você é responsável por emitir rapidamente lotes de cartas conforme necessário, para enviá-las aos clientes, usando papel real e envelopes, para serem entregues fisicamente ao endereço de cada cliente (não havia e-mail naquela época).
Em algum momento, você percebe que as cartas são apenas uma composição de um conjunto extenso de parágrafos, que são escolhidos e organizados conforme necessário, de acordo com a finalidade da carta, então você cria um sistema para emitir cartas rapidamente, esperando obter um aumento substancial.
O sistema é simples:
Você começa com um baralho de folhas transparentes contendo um parágrafo cada.
Para emitir um conjunto de cartas, você escolhe as planilhas com os parágrafos que precisa e, em seguida, empilha-as e alinha-as para que elas possam ser lidas corretamente e fiquem aparência organizada.
Por fim, coloque o conjunto na fotocopiadora e pressione o botão iniciar para produzir quantas cópias forem necessárias.
Então, simplificar, essa é a ideia central do Docker.
No Docker, cada camada é o conjunto resultante de alterações que ocorrem no sistema de arquivos após a execução de um comando, como a instalação de um programa.
Portanto, quando você "olha" para o sistema de arquivos depois que a camada é 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 somente leitura auxiliar pronto para ser instalado em um "computador" em que o sistema operacional já está instalado.
Da mesma forma, você pode pensar em um contêiner como o "computador" com o disco rígido da imagem instalado. O contêiner, assim como um computador, pode ser ativado ou desligado.