Qual é a diferença entre o Docker e uma VM?

Docker e máquinas virtuais (VMs) são duas tecnologias usadas na implantação de aplicações. No ciclo de vida do desenvolvimento de software, a implantação prepara o código do aplicação para ser executado por seus usuários finais. O Docker é uma plataforma de código aberto que os desenvolvedores usam para empacotar software em unidades padronizadas chamadas de contêineres. O contêiner tem o código da aplicação e seu ambiente, incluindo bibliotecas, ferramentas do sistema e tempo de execução. Usando o Docker, você pode implantar e escalar aplicações em qualquer máquina e garantir que seu código seja executado de maneira consistente. Por outro lado, uma máquina virtual é uma cópia digital de uma máquina física. Você pode ter várias máquinas virtuais com seus próprios sistemas operacionais individuais em execução no mesmo sistema operacional host. Os desenvolvedores configuram a máquina virtual para criar o ambiente da aplicação. Também é possível executar contêineres do Docker em máquinas virtuais.

Leia sobre o Docker »

Virtualização: Docker versus máquina virtual

A virtualização permite a criação de uma instância virtual de recursos reais, como servidores e redes. Na computação, a virtualização permite que várias instâncias isoladas de um componente virtualizado operem no componente real.

Por exemplo, vários servidores virtuais podem ser executados em um servidor físico. Ao compartilhar recursos reais entre várias instâncias virtuais, eles são mais bem utilizados, e sua execução é mais econômica. A virtualização é a base de uma quantidade significativa de desenvolvimento e implantação de aplicações.

Máquinas virtuais

Como o nome sugere, as máquinas virtuais (VMs) fornecem a virtualização de uma máquina inteira (servidor). Uma máquina virtual emula os componentes de hardware de uma máquina física, como CPU, memória, placa de interface de rede, controladores USB e placas de som. Você pode executar um sistema operacional convidado e várias aplicações no ambiente virtual. 

As máquinas virtuais possibilitaram as tecnologias de nuvem e, na Amazon Web Services (AWS), uma máquina virtual é chamada de instância. Essas instâncias de nuvem são de propriedade e mantidas da/pela AWS e podem ser usadas por meio de APIs.

Leia sobre instâncias na nuvem »

Docker

Uma VM permite que você execute uma máquina virtual em qualquer hardware. O Docker permite que você execute uma aplicação em qualquer sistema operacional. Ele usa instâncias isoladas do espaço do usuário, conhecidas como contêineres.

Os contêineres do Docker têm seu próprio sistema de arquivos, estrutura de dependências, processos e recursos de rede. A aplicação tem tudo o que precisa dentro do contêiner e pode ser executada em qualquer lugar. A tecnologia de contêiner do Docker usa diretamente os recursos subjacentes do kernel do sistema operacional host. 

Quais são as outras semelhanças entre o Docker e as máquinas virtuais?

Como tecnologias de virtualização, o Docker e as máquinas virtuais (VMs) têm certas semelhanças.

Imagens

Os contêineres do Docker e as máquinas virtuais são criados a partir de imagens. Cada imagem serve como um modelo do ambiente virtualizado. As imagens permitem que os usuários criem e compartilhem ambientes consistentes sem precisar configurá-los todas as vezes.

Uma imagem especifica todos os recursos do sistema necessários para executar aplicações. Por exemplo, uma imagem de VM cria backups do sistema operacional, enquanto a imagem do contêiner do Docker cria um backup do ambiente da aplicação.

Controle de versão

Tanto as imagens do contêiner do Docker quanto as imagens da máquina virtual podem ser versionadas para rastrear as alterações na configuração do ambiente ao longo do tempo.

O versionamento no Docker refere-se à capacidade de rastrear e gerenciar alterações nas imagens do Docker ao longo do tempo. Ele permite que os desenvolvedores acompanhem as diferentes versões de suas aplicações, revertam para as versões anteriores, se necessário, e implantem versões diferentes de uma aplicação simultaneamente. 

Da mesma forma, versionamento em máquinas virtuais refere-se ao processo de rastrear e gerenciar alterações na imagem da máquina virtual ao longo do tempo. O versionamento de máquinas virtuais controla alterações, como atualizações e patches, na configuração do hardware virtual ou do sistema operacional.

Portabilidade

Tanto as máquinas virtuais quanto o Docker foram projetados para resolver as dificuldades de ter que desenvolver diferentes configurações de aplicações para diferentes tipos de arquiteturas de base. Embora adotem abordagens diferentes para os desafios, as imagens do Docker e da VM são altamente portáteis em todas as arquiteturas, seja on-premises ou na nuvem. 

Principais diferenças: Docker versus máquina virtual

Tanto as máquinas virtuais (VMs) quanto o Docker abordam o desafio de executar aplicações em diferentes ambientes. Porém, eles fazem isso por motivos ligeiramente diferentes e com abordagens diferentes.

Objetivo

Máquinas virtuais foram originalmente projetadas para permitir que vários sistemas operacionais sejam executados em uma única máquina física. O objetivo é permitir que os usuários criem um ambiente virtual isolado do hardware subjacente. As VMs abstraem os detalhes do hardware para facilitar a execução de aplicações em diferentes arquiteturas de hardware e usar os recursos de hardware com mais eficiência.

O Docker, por outro lado, foi projetado para fornecer uma maneira leve e portátil de empacotar e executar aplicações em um ambiente isolado e reproduzível. O Docker abstrai os detalhes do sistema operacional para enfrentar o desafio de implantar aplicações em diferentes ambientes, como desenvolvimento, teste e produção. Pode ser muito desafiador gerenciar as atualizações do ambiente de software e manter a consistência do ambiente em todos os lugares. Isso é especialmente válido para organizações que executam centenas de aplicações ou decompõem aplicações em centenas de microsserviços. O Docker resolve esse problema por meio da estruturação em contêiner. 

Produto final

Docker é o nome da plataforma de contêineres de código aberto que pertence e é operada pela empresa Docker. Existem plataformas alternativas como o Podman, embora sejam muito menos populares; Docker é sinônimo de estruturação em contêiner. O contêiner é o artefato, a parte utilizável para o usuário final.

A máquina virtual propriamente dita é a parte utilizável para o usuário final. A tecnologia não está associada a uma marca específica. Você pode implantar VMs em datacenters locais ou acessá-las por meio de APIs como um serviço de nuvem gerenciado.

Arquitetura

Uma máquina virtual executa seu próprio kernel e sistema operacional host, junto com aplicações e suas dependências, como bibliotecas e outros arquivos binários. Um hipervisor coordena entre o hardware (máquina host ou servidor) e a máquina virtual. Ele aloca os recursos físicos de hardware descritos durante a instanciação para a máquina virtual para seu uso exclusivo. Várias máquinas virtuais podem existir em um único servidor poderoso, gerenciado por um único hipervisor, com centenas de aplicações em execução em cada máquina virtual.

Um contêiner do Docker contém somente suas dependências. O software Docker Engine potencializa a virtualização no Docker. Ele fornece coordenação entre os contêineres em execução e o sistema operacional subjacente, seja uma máquina física ou virtual.

Para um gerenciamento de virtualização mais avançado com o Docker, use o Kubernetes. Para obter mais informações, leia Qual é a diferença entre o Kubernetes e o Docker?

Compartilhamento de recursos

Tanto as máquinas virtuais quanto os contêineres do Docker usam a multiplexação de recursos ou o compartilhamento de recursos entre instâncias virtualizadas.

As máquinas virtuais solicitam antecipadamente uma quantidade específica do recurso do hardware e continuam ocupando essa quantidade de forma constante, desde que a máquina virtual esteja em execução. 

Os contêineres do Docker, por outro lado, usam recursos sob demanda. Em vez de solicitarem uma quantidade específica de recursos de hardware físico, como fazem as máquinas virtuais, eles simplesmente solicitam o que precisam de um único kernel do sistema operacional. Vários contêineres compartilham o mesmo sistema operacional. Os contêineres do Docker direcionam o compartilhamento de recursos com os líderes do kernel e podem usar menos recursos do sistema em comparação com uma VM. 

Segurança

Como os contêineres do Docker compartilham o kernel com o sistema operacional host, para um consumo leve de recursos, eles correrão riscos se houver vulnerabilidades no kernel. No entanto, o Docker também fornece muitos controles de segurança avançados.

Por outro lado, como uma VM executa um sistema operacional inteiro, há um nível adicional de isolamento ao executar aplicações. VMs oferecem maior segurança, desde que o sistema operacional tenha medidas de segurança rígidas.

Quando usar: Docker vs máquina virtual

Os contêineres do Docker são executados na arquitetura Linux e exigem recursos específicos do kernel Linux, como namespaces e grupos de controle (cgroups). Os desenvolvedores geralmente executam a plataforma Docker em máquinas virtuais baseadas em Linux. O Docker empacota o código da aplicação em contêineres que são executados em qualquer lugar. As atualizações do ambiente são feitas somente uma vez no contêiner. Não é necessário atualizar seu ambiente de aplicações. 

Por exemplo, você pode ativar uma instância na AWS e carregá-la imediatamente com uma imagem de máquina da Amazon (AMI) que vem pré-configurada com o Docker. 

 

No entanto, se você está decidindo especificamente se vai usar uma máquina virtual (VM) ou o Docker para implantar aplicações, a escolha depende dos requisitos de execução da aplicação.

Quando usar uma máquina virtual

É melhor usar uma máquina virtual se você está executando aplicações com estes requisitos: 

  • Dependências específicas do sistema operacional
  • Requisitos de recursos de hardware substanciais
  • A necessidade de definir vários controles nos sistemas operacionais
  • Aplicações legadas que não são mais executadas em sistemas operacionais modernos
  • Diferentes requisitos de sistema operacional com uma única infraestrutura física subjacente disponível

Quando usar o docker

É melhor usar o Docker ao executar aplicações com estes requisitos: 

  • Requisitos de recursos leves ou uma arquitetura de microsserviços
  • Um ambiente de infraestrutura física distribuída, incluindo servidores baseados em nuvem
  • Ciclos de implantação rápidos (já que Dockerfiles são mais fáceis de gerenciar do que configurações de VM)
  • Um requisito de escalabilidade rápida

Resumo da diferença: Docker vs. VM

 

Contêiner do Docker

VM

O que é isso?

O Docker é uma plataforma de software para criar e executar contêineres do Docker. Um contêiner do Docker é uma emulação de uma instância do espaço do usuário, a parte do sistema operacional em que os processos do usuário são executados.

Uma emulação de uma máquina física, incluindo hardware virtualizado, executando um sistema operacional.

Virtualização

O contêiner abstrai os detalhes do sistema operacional do código da aplicação.

A VM abstrai os detalhes do hardware do código da aplicação.

Objetivo

Abstrair os detalhes do hardware e aumentar a utilização do hardware.

Melhorar o gerenciamento do ambiente de aplicações e oferecer consistência em vários ambientes.

Gerenciado por

O Docker Engine coordena entre o sistema operacional e os contêineres do Docker.

O hipervisor coordena entre o hardware físico da máquina e as máquinas virtuais.

Arquitetura

Compartilha recursos com o kernel host subjacente.

Executa seu próprio kernel e sistema operacional.

Compartilhamento de recursos

Sob demanda.

Um valor fixo, definido nos requisitos de configuração de uma imagem da máquina virtual.

Como a AWS pode apoiar seus requisitos de implantação de aplicações?

A Amazon Web Services (AWS) tem uma variedade de serviços projetados especificamente para máquinas virtuais (VMs) e gerenciamento do Docker:

  • O Amazon Elastic Cloud Compute (Amazon EC2) oferece mais de 600 tipos diferentes de instâncias seguras, confiáveis e escaláveis. Ao carregar um modelo Amazon Machine Image (AMI), você pode ter um servidor de ambiente de desenvolvimento, teste ou produção totalmente especificado e pronto para ser usado em poucos minutos.
  • O Amazon Elastic Container Service (Amazon ECS) é um serviço de orquestração de contêineres totalmente gerenciado que facilita a implantação e o dimensionamento de aplicações em contêineres. Os clientes podem configurar suas instâncias de contêiner para acessar um registro privado de imagens do Docker em uma nuvem privada virtual (VPC) ou um registro acessível fora da VPC.
  • O Amazon Elastic Container Registry (Amazon ECR) permite armazenar, compartilhar e implantar contêineres facilmente em qualquer lugar. O Amazon ECR integra-se à interface de linha de comando (CLI) do Docker para simplificar fluxos de trabalho de desenvolvimento e produção. Por exemplo, você pode enviar suas imagens de contêiner ao Amazon ECR usando a CLI do Docker na sua máquina de desenvolvimento. E os orquestradores de contêineres da Amazon podem extrai-las diretamente para implantações de produção.
  • O AWS Fargate é um serviço sem servidor que permite implantar e gerenciar contêineres sem exigir o gerenciamento de um servidor físico ou máquinas virtuais.

Comece a desenvolver aplicações na AWS criando uma conta hoje mesmo.