O Docker não é uma metodologia de virtualização. Ele se baseia em outras ferramentas que realmente implementam virtualização baseada em contêiner ou virtualização no nível do sistema operacional. Para isso, o Docker estava usando inicialmente o driver LXC e depois foi transferido para o libcontainer, que agora é renomeado como runc. O Docker se concentra principalmente em automatizar a implantação de aplicativos dentro de contêineres. Os contêineres de aplicativos são projetados para empacotar e executar um único serviço, enquanto os contêineres do sistema são projetados para executar vários processos, como máquinas virtuais. Portanto, o Docker é considerado uma ferramenta de gerenciamento de contêiner ou implantação de aplicativos em sistemas em contêiner.
Para saber como é diferente de outras virtualizações, vamos analisar a virtualização e seus tipos. Então, seria mais fácil entender qual é a diferença lá.
Virtualização
Em sua forma concebida, foi considerado um método de dividir logicamente os mainframes para permitir que vários aplicativos fossem executados simultaneamente. No entanto, o cenário mudou drasticamente quando empresas e comunidades de código aberto foram capazes de fornecer um método para lidar com as instruções privilegiadas de uma maneira ou de outra e permitir que vários sistemas operacionais fossem executados simultaneamente em um único sistema baseado em x86.
Hypervisor
O hypervisor gerencia a criação do ambiente virtual no qual as máquinas virtuais convidadas operam. Ele supervisiona os sistemas de convidados e garante que os recursos sejam alocados aos convidados conforme necessário. O hipervisor fica entre a máquina física e as máquinas virtuais e fornece serviços de virtualização para as máquinas virtuais. Para realizá-lo, ele intercepta as operações do sistema operacional convidado nas máquinas virtuais e emula a operação no sistema operacional da máquina host.
O rápido desenvolvimento de tecnologias de virtualização, principalmente na nuvem, impulsionou ainda mais o uso da virtualização, permitindo a criação de vários servidores virtuais em um único servidor físico com a ajuda de hipervisores, como Xen, VMware Player, KVM, etc., e incorporação de suporte de hardware em processadores básicos, como Intel VT e AMD-V.
Tipos de virtualização
O método de virtualização pode ser categorizado com base em como ele imita o hardware para um sistema operacional convidado e emula um ambiente operacional convidado. Principalmente, existem três tipos de virtualização:
- Emulação
- Paravirtualização
- Virtualização baseada em contêiner
Emulação
A emulação, também conhecida como virtualização completa, executa o kernel do sistema operacional da máquina virtual inteiramente em software. O hypervisor usado neste tipo é conhecido como hypervisor Tipo 2. Ele é instalado na parte superior do sistema operacional host, responsável por converter o código do kernel do SO convidado em instruções de software. A tradução é feita inteiramente em software e não requer envolvimento de hardware. A emulação possibilita a execução de qualquer sistema operacional não modificado que suporte o ambiente emulado. A desvantagem desse tipo de virtualização é uma sobrecarga adicional de recursos do sistema que leva a uma diminuição no desempenho em comparação com outros tipos de virtualização.
Exemplos nesta categoria incluem VMware Player, VirtualBox, QEMU, Bochs, Parallels, etc.
Paravirtualização
A paravirtualização, também conhecida como hipervisor Tipo 1, é executada diretamente no hardware, ou “bare-metal”, e fornece serviços de virtualização diretamente para as máquinas virtuais em execução nele. Ajuda o sistema operacional, o hardware virtualizado e o hardware real a colaborar para alcançar o desempenho ideal. Esses hipervisores normalmente têm uma pegada bastante pequena e não exigem, eles próprios, recursos extensivos.
Exemplos nesta categoria incluem Xen, KVM, etc.
Virtualização baseada em contêiner
A virtualização baseada em contêiner, também conhecida como virtualização no nível do sistema operacional, permite várias execuções isoladas em um único kernel do sistema operacional. Possui o melhor desempenho e densidade possíveis e possui gerenciamento dinâmico de recursos. O ambiente de execução virtual isolado fornecido por esse tipo de virtualização é chamado de contêiner e pode ser visualizado como um grupo de processos rastreados.
O conceito de um contêiner é possível graças ao recurso de namespaces adicionado ao kernel Linux versão 2.6.24. O contêiner adiciona seu ID a todos os processos e adiciona novas verificações de controle de acesso a todas as chamadas do sistema. É acessado pela chamada de sistema clone () que permite criar instâncias separadas de namespaces anteriormente globais.
Os espaços para nome podem ser usados de várias maneiras diferentes, mas a abordagem mais comum é criar um contêiner isolado que não tenha visibilidade ou acesso a objetos fora do contêiner. Os processos em execução no contêiner parecem estar em execução em um sistema Linux normal, embora estejam compartilhando o kernel subjacente com processos localizados em outros namespaces, o mesmo para outros tipos de objetos. Por exemplo, ao usar espaços para nome, o usuário raiz dentro do contêiner não é tratado como raiz fora do contêiner, adicionando segurança adicional.
O subsistema Linux Control Groups (cgroups), o próximo componente principal a habilitar a virtualização baseada em contêiner, é usado para agrupar processos e gerenciar seu consumo agregado de recursos. É comumente usado para limitar o consumo de memória e CPU dos contêineres. Como um sistema Linux em contêiner possui apenas um kernel e o kernel tem total visibilidade nos contêineres, há apenas um nível de alocação e programação de recursos.
Várias ferramentas de gerenciamento estão disponíveis para contêineres Linux, incluindo LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, etc.
Contêineres vs Máquinas Virtuais
Ao contrário de uma máquina virtual, um contêiner não precisa inicializar o kernel do sistema operacional; portanto, os contêineres podem ser criados em menos de um segundo. Esse recurso torna a virtualização baseada em contêiner exclusiva e desejável do que outras abordagens de virtualização.
Como a virtualização baseada em contêiner adiciona pouca ou nenhuma sobrecarga à máquina host, a virtualização baseada em contêiner tem desempenho quase nativo
Para virtualização baseada em contêiner, nenhum software adicional é necessário, ao contrário de outras virtualizações.
Todos os contêineres em uma máquina host compartilham o agendador da máquina host, economizando a necessidade de recursos extras.
Os estados do contêiner (imagens do Docker ou LXC) são pequenos em comparação às imagens da máquina virtual, portanto, as imagens do contêiner são fáceis de distribuir.
O gerenciamento de recursos em contêineres é alcançado por meio de cgroups. O Cgroups não permite que os contêineres consumam mais recursos do que os alocados. No entanto, a partir de agora, todos os recursos da máquina host estão visíveis nas máquinas virtuais, mas não podem ser usados. Isso pode ser realizado executando-se top
ou htop
em contêineres e na máquina host ao mesmo tempo. A saída em todos os ambientes será semelhante.
Atualizar:
Como o Docker executa contêineres em sistemas não Linux?
Se os contêineres são possíveis devido aos recursos disponíveis no kernel do Linux, a pergunta óbvia é como os sistemas não Linux executam os contêineres. O Docker para Mac e Windows usa VMs Linux para executar os contêineres. Caixa de ferramentas do Docker usada para executar contêineres em VMs do Virtual Box. Mas, o Docker mais recente usa o Hyper-V no Windows e o Hypervisor.framework no Mac.
Agora, deixe-me descrever como o Docker for Mac executa contêineres em detalhes.
O Docker para Mac usa https://github.com/moby/hyperkit para emular os recursos do hypervisor e o Hyperkit usa hypervisor.framework em seu núcleo. Hypervisor.framework é a solução nativa de hypervisor do Mac. O Hyperkit também usa VPNKit e DataKit para namespace de rede e sistema de arquivos, respectivamente.
A VM do Linux que o Docker executa no Mac é somente leitura. No entanto, você pode se basear nele executando:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Agora, podemos até verificar a versão do Kernel desta VM:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Todos os contêineres são executados dentro desta VM.
Existem algumas limitações no hypervisor.framework. Por esse motivo, o Docker não expõe docker0
a interface de rede no Mac. Portanto, você não pode acessar contêineres do host. A partir de agora, docker0
só está disponível dentro da VM.
O Hyper-v é o hipervisor nativo no Windows. Eles também estão tentando aproveitar os recursos do Windows 10 para executar sistemas Linux nativamente.