Diferenças entre VMs e Containers
Tempo estimado de leitura: 3min
Recomendação de materiais
Relembrando FSO
Conceito | "Definição" |
---|---|
Sistema Operacional | Kernel + Apps de Sistema |
Kernel | coração do S.O., primeiro programa executado quando se inicia um SO; responsavel por gerenciar recursos do computador [uso da cpu, memoria ram, etc] de acordo com as demandas de Apps de Sistema e Apps comuns A interface entre Software e Hardware |
Apps de Sistema | sistema de arquivos, programas de network, drivers etc; (nao sao os programas "comuns", como navegador, vscode, discord etc) |
Aprofundando um pouco em Máquinas Virtuais
Existem dois tipos de Hypervisors (softwares que lidam com VMs):
Distinções | Tipo 2 | Tipo 1 |
---|---|---|
Conhecido como: | Virtual Machine Monitor (VMM) | Nativo/Bare Metal |
Softwares: | Qemu, VMware Workstation, Oracle Virtual Box | Xen HVM, KVM*, VMware vSphere |
Onde roda: | Em cima do sistema operacional que voce estiver utilizando | No Hardware do seu computador (usa a bios e td mais) |
Na prática: | O mais comum/conhecido: você instala um aplicativo no seu PC, e nele tem uma tela pra você adicionar os SO's que quiser. Então, voce pode bootar em qualquer um desses SO's que estarão disponiveis em janelas de aplicativo diferentes. | No geral, em vez de instalar um sistema operacional, se instala o Hypervisor, e neste você será capaz de instalar varios S.Os (chamados de guests) distintos; A diferença disso p/ um dual-boot, por exemplo, é que multiplos SOs podem ser executados simultaneamente |
Ou seja, no tipo 1, o Hypervisor pode ser considerado um Kernel; no tipo 2, o Hypervisor se aproveita do Kernel utilizado para gerenciar os recursos de suas VMs
Lembrando que cada máquina virtual, naturalmente, terá seu próprio Sistema Operacional e, consequentemente, seu próprio Kernel, também!
Fontes:
-
Pluralsight: <vídeo 5min> Type 1 vs. Type 2 Hypervisors
-
Phoenixnap: <artigo> What is a Hypervisor? Types of Hypervisors 1 & 2
Aprofundando um pouco em Containers
Containers consistem de virtualizações do Sistema Operacional (em vez do Hardware). Têm como caracteristicas o isolamento e gerenciamento de recursos. Isso é possível pela existencia das seguintes funcionalidades do Kernel Linux:
-
Namespaces: responsavel pelo isolamento [processos distintos enxergam recursos (hostnames, ids de usuarios, ids de processos, etc) distintos]
-
Cgroups: responsavel pelo gerenciamento de recursos [limita, prioriza e controla grupos de processos quanto ao uso de CPU, memória, I/O, network, etc]
Ou seja, com apenas 1 Kernel (o do computador que está utilizando agora) consegue-se instanciar inumeros containers (todos se utilizando do seu Kernel), sendo que cada um destes é apenas um processo a mais no seu computador.
Justamente por isso, você não conseguiria rodar um container com imagem Windows num pc Linux: via de regra, o kernel especificado no seu Dockerfile tem de ser compativel com o sistema operacional do seu computador.
*mas é possivel utilizar imagens linux dentro do windows, caso utilize o WSL (Windows Subsystem for Linux)
Fontes:
-
IBM Cloud: <video 8min> Containerization Explained
-
dotCloud: <artigo> PaaS under the hood, episode 1: kernel namespaces
-
McMaster University: <slides> Docker – OS Level Virtualization
-
Wikipedia:
-
Stackoverflow: How is Docker different from a virtual machine?
Resumo
Virtualização | Comportamento |
---|---|
Máquinas Virtuais | ![]() ![]() |
Container Docker | ![]() |
Ou seja, num cenário onde você gostaria de rodar seu app multiplas vezes simultaneamente (por questões de escalabilidade, por exemplo):
VMs | Containers |
---|---|
Necessitaria de 1 máquina virtual para cada instancia; cada máquina virtual necessita, normalmente, de dezenas de GB para armazenar no Host geralmente precisa-se de alguns minutos para bootar | necessita-se de apenas 1 imagem (que pesa lá seus 200mb~1gb) e pode-se instanciar infinitas vezes, de forma quase instantanea |