Quero compreender tudo o que difere um container de uma máquina virtual. Um sistema de arquivos com todos os sistemas operacionais pode ser observado para ambos os métodos de virtualização. Mas em um contêiner do Docker, por exemplo, centos 5.x, se eu executar uname -a
no shell do contêiner, a saída mostrará a versão do kernel do meu host. Como funciona e as principais diferenças de uma máquina virtual clássica (vmware, virtualbox, xen, etc)?
Ambas as formas permitem que vários sistemas operacionais sejam executados em uma única máquina física.
Com contêineres, esses sistemas operacionais são isolados (eles têm seus próprios sistemas de arquivos, processos, bibliotecas, incluindo o
libc
, endereço IP etc.), mas compartilham o mesmo kernel. Essa é a razão pela qualuname -a
mostrou sua versão do kernel do host.Com a virtualização tradicional, os sistemas operacionais têm cada um seu próprio kernel em execução. Esses vários kernels não estão sendo executados sobre o hardware real, mas sobre um hardware virtualizado fornecido por um software chamado hypervisor. Esta é uma camada extra em comparação com a virtualização baseada em contêiner.
Cada tipo de virtualização tem seus pontos fortes e fracos. Os contêineres são mais limitados na escolha dos sistemas operacionais, o contêiner deve ser suportado pelo kernel em execução (por exemplo: zonas Solaris no Solaris , LXC no Linux , WPAR no AIX ) embora tecnicamente, nada proíba os desenvolvedores do kernel de implementar o suporte para " alien" userlands (por exemplo: lxbrand = zonas Linux no Solaris 10 e SmartOS , ou mais recentemente tempo de execução do Ubuntu no Windows 10 ) enquanto com hipervisores, o sistema operacional precisa apenas ser suportado pelo hardware virtual, o que permite configurações muito heterogêneas (por exemplo: Kernels Linux de 32 bits e 64 bits, *BSDs, Solaris, Windows, Mac OS X, ...)
A principal vantagem dos contêineres é que eles são muito mais leves, o desempenho do aplicativo é essencialmente o mesmo que seria com uma verdadeira instalação de sistema operacional bare metal. A nova instanciação de contêiner é muito mais rápida porque não há kernel extra para inicializar, e a densidade do ambiente virtual pode ser muito maior porque não há kernels extras para executar.
Observe que o Docker não é uma implementação de contêiner. O Docker é um padrão de construção/embalagem/distribuição para aplicativos executados em contêineres e inclui um mecanismo para executá-los e recentemente adicionou um orquestrador também. Este motor desempenha um papel semelhante ao de um hipervisor, mas para aplicações em contêineres.
Um bom ponto de partida seria ler o artigo da Wikipédia :
Com a tecnologia de virtualização, o pacote que pode ser transmitido é uma máquina virtual e inclui um sistema operacional completo, bem como o aplicativo. Um servidor físico rodando três máquinas virtuais teria um hipervisor e três sistemas operacionais separados rodando sobre ele.
Por outro lado, um servidor executando três aplicativos em contêineres, como no Docker, executa um único sistema operacional e cada contêiner compartilha o kernel do sistema operacional com os outros contêineres. As partes compartilhadas do sistema operacional são somente leitura, enquanto cada contêiner tem sua própria montagem (ou seja, uma maneira de acessar o contêiner) para gravação. Isso significa que os contêineres são muito mais leves e usam muito menos recursos do que as máquinas virtuais.
O que mais você quer saber? Quais detalhes você está perdendo, exatamente?