VM ou Docker?

Como entender que você precisa do Docker e não de uma VM? Você precisa determinar o que exatamente deseja isolar. Se você deseja isolar um sistema com recursos garantidos e hardware virtual, a escolha deve recair sobre a VM. Se você precisar isolar aplicativos em execução como processos de sistema separados, precisará do Docker.

Então, qual é a diferença entre contêineres Docker e VMs?

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 é instalado junto com drivers de dispositivos virtuais, gerenciamento de memória e outros componentes. Ou seja, obtemos uma abstração de hardware físico que permite executar muitos computadores virtuais em um computador.
Uma VM instalada pode ocupar espaço em disco 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 para ele.

Quanto mais máquinas virtuais no servidor, mais espaço elas ocupam, além de exigirem o suporte constante do ambiente necessário para o funcionamento de sua aplicação.

Estivador é um software para construção de aplicações baseadas em containers. Contêineres e máquinas virtuais têm benefícios semelhantes, mas funcionam de maneira diferente. Os contêineres ocupam menos espaço, porque usar mais recursos compartilhados do sistema host do que a VM, porque ao contrário da VM, fornece virtualização no nível do sistema operacional, não no hardware. Essa abordagem fornece menos consumo de memória, implantação mais rápida e dimensionamento mais fácil.

O contêiner fornece um mecanismo mais eficiente para encapsular aplicativos, fornecendo as interfaces necessárias para o sistema host. Esse recurso permite que os contêineres compartilhem o núcleo do sistema, onde cada um dos contêineres é executado como um processo separado do sistema operacional principal, que possui seu próprio conjunto de áreas de memória (seu próprio espaço de endereço virtual). Como o espaço de endereço virtual de cada contêiner é próprio, os dados pertencentes a diferentes áreas de memória não podem ser alterados.
O sistema operacional nativo do Docker é o Linux (o Docker também pode ser usado no Windows e no MacOS), ele usa suas principais vantagens, que permitem organizar um kernel dividido. O lançamento dos contêineres Docker no Windows ocorrerá dentro de uma máquina virtual Linux, porque os contêineres compartilham o sistema operacional do sistema host e o sistema operacional principal para eles é o Linux.

Contêiner - como funciona?

recipiente é 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 um contêiner tem sua própria camada de gravação e todas as alterações são armazenadas nessa camada, vários contêineres podem compartilhar o acesso à mesma imagem principal.

Cada contêiner pode ser configurado por meio de um arquivo no projeto docker-compose incluído na solução principal, docker-compose.yml. Lá você pode definir vários parâmetros, como nome do contêiner, portas, identificadores, limites de recursos, 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 um nome a ele aleatoriamente.

Quando um contêiner é iniciado a partir de uma imagem, o Docker monta o sistema de arquivos de leitura/gravação sobre qualquer camada abaixo. É aqui que todos os processos que queremos que nosso contêiner Docker execute serão executados.

Quando o Docker inicia um contêiner pela primeira vez, a camada inicial de leitura/gravação está vazia. Quando ocorrem alterações, elas são aplicadas a essa camada; por exemplo, se você quiser modificar um arquivo, esse arquivo será copiado da camada somente leitura abaixo para a camada de leitura/gravação.
A versão somente leitura do arquivo ainda existirá, mas agora está oculta na cópia. Os volumes são usados ​​para armazenar dados, independentemente do ciclo de vida do contêiner. Os volumes são inicializados quando um contêiner é criado.

Como a imagem é associada ao contêiner?

Image - o elemento principal para cada contêiner. A imagem é criada a partir de um Dockerfile adicionado ao projeto e é um conjunto de sistemas de arquivos (camadas) sobrepostas e agrupadas, disponíveis apenas para leitura; o número máximo de camadas é 127.

No coração de cada imagem está uma imagem base, que é especificada pelo comando FROM - o ponto de entrada ao gerar uma imagem Dockerfile. Cada camada é somente leitura e é representada por um único comando que modifica o sistema de arquivos, escrito em um Dockerfile.
Para combinar essas camadas em uma única imagem, o Docker usa o sistema de arquivos Union multicamadas avançado (o AuFS é construído sobre o UnionFS), permitindo que diferentes arquivos e diretórios de diferentes camadas de arquivos se sobreponham de forma transparente, criando um sistema de arquivos associado.

As camadas contêm metadados que permitem armazenar informações relacionadas sobre cada camada no tempo de execução e no tempo de construção. Cada camada contém um link para a próxima camada, se a camada não tiver nenhum link, então esta é a camada superior da imagem.

O Dockerfile pode conter comandos como:

  • DE - ponto de entrada na formação da imagem;
  • MAINTAINER - o nome do proprietário da imagem;
  • RUN - execução do comando durante a montagem da imagem;
  • ADD - copiando o arquivo host para uma nova imagem, se você especificar um arquivo URL, o Docker fará o download para o diretório especificado;
  • ENV - variáveis ​​de ambiente;
  • CMD - inicia a criação de um novo container com base na imagem;
  • ENTRYPOINT - O comando é executado quando o contêiner é iniciado.
  • WORKDIR é o diretório de trabalho para executar o comando CMD.
  • USER - Define o UID para o contêiner criado a partir da imagem.
  • VOLUME - monta o diretório do host no contêiner.
  • EXPOSE é um conjunto de portas escutadas no contêiner.

Como funciona o UnionFS?

UniãoFS — sistema de arquivos de pilha de serviço (FS) para Linux e FreeBSD. Este FS implementa o mecanismo copy-on-write (Copy-On-Write, COW). A unidade de trabalho do UnionFS é uma camada, cada camada deve ser considerada como um sistema de arquivos completo separado com uma hierarquia de diretórios da própria raiz. O UnionFS cria uma montagem de união para outros sistemas de arquivos e permite mesclar de forma transparente arquivos e diretórios de diferentes sistemas de arquivos (chamados branches) em um único sistema de arquivos vinculado, de forma transparente para o usuário.

O conteúdo dos diretórios com os mesmos caminhos serão exibidos juntos em um diretório combinado (no mesmo namespace) do sistema de arquivos resultante.

UnionFS combina camadas com base nos seguintes princípios:

  • uma das camadas torna-se uma camada de nível superior, a segunda camada e as subseqüentes tornam-se camadas de 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 é retornado, independentemente da presença de um objeto com o mesmo nome na camada "inferior"; caso contrário, o objeto da camada "inferior" é retornado; se o objeto solicitado não estiver presente, o erro "No such file or directory" será retornado;
  • a camada de trabalho é a “superior”, ou seja, todas as ações do usuário para alterar os dados são refletidas apenas na camada de nível superior, sem afetar o conteúdo das camadas de nível inferior.

Docker é a tecnologia mais comum para usar contêineres no trabalho de aplicativos. Tornou-se o padrão nesta área, com base nos cgroups e namespaces fornecidos pelo kernel do Linux.

O Docker nos permite implantar aplicativos rapidamente e fazer o melhor uso do sistema de arquivos, compartilhando o kernel do sistema operacional entre todos os contêineres, executando como processos separados do sistema operacional.

Fonte: habr.com

Adicionar um comentário