Como entender que você precisa de um Docker, não de uma VM? Vamos tentar entender as principais diferenças entre o isolamento de máquinas virtuais (VMs) e os contêineres do Docker, se eles podem ser intercambiáveis e como podemos usá-los.
Então, qual é a diferença entre contêineres do Docker e VM?
Uma máquina virtual (VM) é um computador virtual com todos os dispositivos virtuais e um disco rígido virtual, no qual um novo sistema operacional independente (sistema operacional convidado) é instalado junto com drivers de dispositivo virtual, gerenciamento de memória e outros componentes. Ou seja, obtemos uma abstração de equipamento físico que permite executar muitos computadores virtuais em um computador. O equipamento virtual é exibido nas propriedades do sistema e os aplicativos instalados interagem com ele como se fossem reais. Ao mesmo tempo, a própria máquina virtual é completamente isolada do computador real, embora possa ter acesso ao seu disco e dispositivos periféricos.
Uma VM instalada pode ocupar espaço no disco do computador de diferentes maneiras:
- espaço fixo no disco rígido, que permite acesso mais rápido ao disco rígido virtual e evita a fragmentação de arquivos;
- alocação dinâmica de memória. Ao instalar aplicativos adicionais, a memória será alocada dinamicamente para eles até atingir a quantidade máxima alocada a ela.
Ao usar a VM, há custos adicionais para a emulação de equipamentos virtuais e o lançamento de um SO convidado, suportando e administrando o ambiente necessário para o funcionamento do aplicativo. Além disso, quando você implanta um grande número de máquinas virtuais no servidor, a quantidade de espaço que elas ocupam no disco rígido aumenta apenas porque cada VM requer espaço, pelo menos para o SO convidado e os drivers para dispositivos virtuais.
O Docker é um software para criar aplicativos baseados em contêiner. Contêineres e máquinas virtuais resolvem um problema, mas o fazem de maneira diferente. Os contêineres ocupam menos espaço porque Reutilize mais recursos compartilhados do sistema host que a VM ao contrário da VM, fornece virtualização no nível do SO, não hardware. Essa abordagem fornece menos espaço no disco rígido, implantação mais rápida e redimensionamento mais fácil.
O contêiner do docker fornece um mecanismo de encapsulamento de aplicativo mais eficiente, fornecendo as interfaces necessárias do sistema host. Esse recurso permite que os contêineres dividam o núcleo do sistema, onde cada contêiner trabalha como um processo separado do sistema operacional principal, que possui seu próprio espaço de endereço virtual, para que os dados pertencentes a diferentes áreas da memória não possam ser alterados.
O Docker é a tecnologia mais comum para usar contêineres no aplicativo. Tornou-se o padrão nessa área, com base nos cgroups e no namespace fornecidos pelo kernel do Linux. O SO nativo do Docker é o Linux, portanto, o lançamento dos contêineres do Docker no Windows ocorrerá dentro de uma máquina virtual Linux.
De que é feito o contêiner?
Uma imagem é o elemento principal a partir do qual os contêineres são criados. A imagem é criada a partir do Dockerfile adicionado ao projeto e é um conjunto de sistemas de arquivos (camadas) em camadas entre si e agrupados, somente leitura; o número máximo de camadas é 127.
No coração de cada imagem há uma imagem de base, indicada pelo comando FROM - o ponto de entrada para a formação da imagem do Dockerfile. Cada camada é uma camada somente leitura e é representada por um comando que modifica o sistema de arquivos gravado no Dockerfile. Essa abordagem permite que diferentes arquivos e diretórios de diferentes camadas de arquivos se sobreponham de forma transparente, criando um sistema de arquivos integrado em cascata. As camadas contêm metadados, permitindo salvar informações relacionadas sobre cada camada no tempo de execução e compilação. Cada camada contém um link para a próxima camada, se a camada não tiver um link, essa é a camada superior na imagem.
Iniciando com o Docker EE versão 06.17.02-ee5 e o Docker Engine - Community, Overlay2 ou Overlay é usado, e versões anteriores usam AuFS (sistema de arquivos Union multi-camadas avançado).
Container - como funciona?
Um contêiner é uma abstração no nível do aplicativo que combina código e dependências. Os contêineres são sempre criados a partir de imagens, adicionando uma camada superior gravável e inicializando vários parâmetros. Como o contêiner possui sua própria camada de gravação e todas as alterações são salvas nessa camada, vários contêineres podem compartilhar o acesso à mesma imagem. Cada contêiner pode ser configurado por meio de um arquivo no projeto docker-compose.yml, configurando vários parâmetros, como nome do contêiner, portas, identificadores, dependências entre outros contêineres. Se você não especificar um nome de contêiner nas configurações, o Docker criará um novo contêiner a cada vez, atribuindo-lhe um nome aleatoriamente.
Quando o contêiner inicia a partir da imagem, o Docker monta o sistema de arquivos para leitura e gravação sobre qualquer camada abaixo. É aqui que todos os processos serão executados. Quando você inicia o contêiner pela primeira vez, a camada inicial de leitura e gravação fica vazia. Quando ocorrem mudanças, elas se aplicam a essa camada; por exemplo, se você deseja modificar um arquivo, esse arquivo será copiado da camada somente leitura inferior para a camada de leitura e gravação. Uma versão somente leitura do arquivo ainda existirá, mas agora está oculta na cópia.
Como um sistema de arquivos federados em cascata funciona?
Um sistema de arquivos integrado em cascata (FS) implementa um mecanismo de cópia de cópia na gravação (COW). A unidade de trabalho é uma camada, cada camada deve ser considerada como um sistema de arquivos completo separado com uma hierarquia de diretórios a partir da própria raiz. Essa abordagem usa a montagem unificada de sistemas de arquivos, permitindo, de forma transparente para o usuário, combinar arquivos e diretórios de vários sistemas de arquivos (chamados ramificações) em um único sistema de arquivos conectado. O conteúdo dos diretórios com os mesmos caminhos será exibido juntos em um diretório combinado (em um único espaço de nome) do sistema de arquivos resultante.
As camadas são mescladas de acordo com os seguintes princípios:
- uma das camadas se torna uma camada do nível superior, a segunda e as camadas subseqüentes se tornam camadas do nível inferior;
- objetos de camada são acessíveis ao usuário "de cima para baixo", ou seja, se o objeto solicitado estiver na camada "superior", ele será retornado, independentemente da presença de um objeto com esse nome na camada "inferior"; caso contrário, o objeto da camada "inferior" é retornado; se o objeto solicitado não estiver lá ou ali, o erro "Nenhum arquivo ou diretório" será retornado;
- a camada de trabalho é "superior", ou seja, todas as ações do usuário para alterar dados são refletidas apenas na camada de nível superior, sem afetar o conteúdo das camadas de nível inferior.
Conclusão
Se você precisar virtualizar um sistema com recursos dedicados garantidos e hardware virtual, escolha uma VM. O que fornece o uso da VM:
- a capacidade de instalar vários sistemas operacionais diferentes em um computador;
- distribuição de recursos do sistema entre máquinas virtuais;
- não há necessidade de reiniciar para alternar entre sistemas operacionais;
- a capacidade de tirar uma "captura instantânea" do estado atual do sistema e do conteúdo das unidades para retornar o sistema ao seu estado original;
- isolamento de falhas e violações do sistema de segurança no nível do hardware;
- a capacidade de simular uma rede de computadores em um computador.
Se você deseja isolar os aplicativos em execução como processos separados, o Docker é adequado para você. O que fornece o uso do Docker:
- fornece virtualização no nível do SO;
- os contêineres compartilham o núcleo do sistema, funcionando como um processo separado do sistema operacional principal;
- o consumo de recursos do sistema, como consumo de memória e carga da CPU, pode ser limitado separadamente para cada contêiner usando cgroups;
- O FS para contêineres é criado usando o mecanismo COW, que permite acelerar a implantação de aplicativos, reduzir o consumo de memória e economizar espaço em disco;
- o sistema de arquivos alterado de um contêiner pode ser usado como base para a formação de novas imagens básicas de outros contêineres.