O que é um contêiner?

23

Existem algumas perguntas sobre contêineres , como:

Minhas perguntas :

  • O que é realmente um "contêiner" (no contexto do DevOps)?
  • Por que eles são usados?
Pierre.Vriens
fonte
Facilmente explicado shivab.com/blog/docker/2019/01/10/…
illusionist

Respostas:

18

A primeira coisa a saber sobre um contêiner é:

É, antes de tudo, um processo.

Uma vez entendido, pode-se começar a entender como os contêineres se comparam e contrastam com as máquinas virtuais. Contêineres e VMs compartilham o isolamento de seus hosts. O método de isolamento é a diferença crítica.

Os processos de contêiner usam extensões para o host do kernel do SO em que são executados para se isolarem de outros processos. Outras extensões também fornecem isolamento de disco e recurso. Os contêineres compartilham seu kernel e memória com o sistema operacional host.

Máquinas virtuais usam um hipervisor para isolar VMs de seus hosts. Essa é uma camada de software que encaminha solicitações de recursos de "convidados" (VMs) para o hardware. O isolamento do disco é fornecido pela virtualização do disco. As VMs não compartilham um kernel com o host - elas carregam seus próprios kernels no espaço de memória dedicado à VM.

Um impacto importante dessa diferença é que um contêiner deve ser compatível com o kernel com seu host. Por exemplo, não é possível executar um contêiner baseado no Windows Nano Server em um host Linux ou um contêiner Ubuntu diretamente em um host Windows. As máquinas virtuais, por outro lado, podem executar qualquer kernel, independentemente do sistema operacional host. Ao executar um contêiner Linux em um host Windows, o Docker executa o contêiner em uma VM Linux.

As diferenças operacionais estão na agilidade: os contêineres começam e param tão rápido quanto um processo normal. As VMs são "mais pesadas", exigindo recursos dedicados reservados para elas e levam mais tempo para iniciar e desligar.

Os contêineres oferecem muita flexibilidade a um modelo operacional do DevOps:

  • Os contêineres isolam as dependências dos componentes de software. Os desenvolvedores podem usar contêineres para garantir que um módulo de aplicativo funcione tão bem em suas máquinas de desenvolvimento quanto em QA / UA / Production
  • Os contêineres usam redes definidas por software para se comunicar
  • As definições de contêiner são declarativas e podem ser controladas pela origem
  • Os sistemas de gerenciamento de contêineres (Kubernetes, DC / OS, Swarm) podem gerenciar pools de recursos de hardware (computação / RAM / armazenamento) e escalar dinamicamente contêineres
Dave Swersky
fonte
1
Eu também fazer o seu último ponto 3 no vSphere, graças ao vagabundo :)
Tensibai
8

O contêiner de palavras refere-se a uma tecnologia de virtualização leve disponível nos kernels modernos do Linux; essa tecnologia é muito semelhante às cadeias do FreeBSD.

Um kernel Linux mais antigo, sem capacidade de contêiner, é capaz de executar processos simultaneamente. Alguns atributos do sistema são particulares ao processo, como o ambiente do processo ou a memória do processo: somente o processo que possui esses atributos e o próprio sistema operacional podem acessar esses dados. (Existem muitas brechas, como algumas implementações do ps , mas isso é essencialmente verdade!) Alguns outros atributos são compartilhados entre os processos, como o sistema de arquivos e as interfaces de rede, por exemplo.

Um kernel Linux moderno, capaz de contêiner, é capaz de lidar com mais atributos do sistema como dados privados associados a um processo ou a um grupo de processos. O contexto resultante é um contêiner e, em vez de executar um programa nos “contêineres iniciais” usando o sistema de arquivos e as interfaces de rede inicializadas pelo sistema operacional, é possível executar processos em outros contêineres, para que eles vejam um sistema de arquivos diferente e um lista diferente de interfaces de rede. Portanto, dois processos em execução em contêineres distintos apenas compartilham realmente o kernel. Talvez você esteja familiarizado com o comando chroot, que pode executar um processo em uma hierarquia de arquivos distinta; os contêineres levam a idéia um passo adiante.

Obviamente, essa é apenas uma explicação muito grosseira, mas espero que ajude a esclarecer a ideia do que são os contêineres. Agora, para que servem?

Uma interface popular para os recursos de contêiner dos kernels Linux é implementada pelo docker, um utilitário de linha de comando que pode ser usado para produzir artefatos representando sistemas de arquivos ( imagens do docker ) e executar processos em contêineres onde esses sistemas de arquivos são acessíveis. Esse pacote de software também é capaz de criar sistemas de rede virtual ad-hoc para permitir que vários contêineres se comuniquem em uma rede privada.

As tecnologias baseadas em contêiner são convenientes para:

  • Descrever implantações complexas escaláveis .
  • Forneça aos desenvolvedores de aplicativos um ambiente muito semelhante ao ambiente de produção.
  • Implemente um padrão imutável de servidor, pois os artefatos de software geralmente descrevem um sistema operacional completo, não apenas um pacote de aplicativos.

(Como você parece familiarizado com outras tecnologias de virtualização como o Virtual Box, você pode observar que essas tecnologias também podem abordar convenientemente os três pontos acima. Atualmente, existe um espectro bastante pequeno de tecnologias de virtualização e podemos comparar a questão de sua popularidade em certos contextos com a popularidade das linguagens de computador: depende provavelmente dos méritos técnicos de cada solução individual, mas também de muitos fatores que chamarei de “acaso”.)

Michael Le Barbier Grünewald
fonte
1
Não se limitando a Linux mais, janelas 16 tem o mesmo tipo de habilidade
Tensibai
1
Link para dar suporte à minha reivindicação docs.microsoft.com/en-us/virtualization/windowscontainers/…
Tensibai
7

Normalmente, os contêineres se referem a algo como contêineres de docker que popularizaram o nome

Cito a partir da definição do docker:

Usando contêineres, tudo o que é necessário para executar um software é empacotado em contêineres isolados. Ao contrário das VMs, os contêineres não agrupam um sistema operacional completo - são necessárias apenas bibliotecas e configurações necessárias para fazer o software funcionar.

A nomeação raiz vem de contêineres linux (lxc) cujo objetivo era isolar um processo de seu sistema host, o primeiro objetivo era evitar o comprometimento do processo de assumir o controle do sistema host.

Agora eles são usados ​​em um escopo mais amplo. Em uma definição moderna de 'contêiner', você mais ou menos libera um pacote para tempo de execução que já inclui seu aplicativo, é um middleware subjacente, se necessário, e todas as bibliotecas necessárias e garante que ele seja executado em qualquer sistema compatível.

A segunda vantagem é que ela permite usar vários aplicativos com a mesma dependência em uma versão diferente, sem precisar ajustar muito suas variáveis ​​de ambiente para carregar a correta.

Improvável para um sistema de VM como a máquina virtual de caixa virtual ou uma instância do EC2 na AWS, os contêineres são virtuais apenas no nível do sistema de arquivos e isolados apenas na pilha de memória. Eles ainda compartilham o mesmo host e o sistema operacional sob eles arbitrará os ticks da CPU.

Uma máquina virtual é virtual no nível do hardware, e você executa um sistema operacional, um contêiner é virtual no nível do SO e você executa um processo no interior.

Tensibai
fonte
1
Hum, então algo como uma imagem do VirtualBox (ou o que quer que seja chamado no VirtualBox) também pode se qualificar como um "contêiner", ou não entendo?
Pierre.Vriens
Vi que tinha esquecido uma parte da pergunta, acrescentado a diferença enquanto estendia a resposta.
Tensibai 6/03/2017
3

Da definição da AWS :

Os contêineres são um método de virtualização do sistema operacional que permite executar um aplicativo e suas dependências em processos isolados por recursos. Os contêineres permitem empacotar facilmente o código, as configurações e as dependências de um aplicativo em blocos de construção fáceis de usar que proporcionam consistência ambiental, eficiência operacional, produtividade do desenvolvedor e controle de versão. Os contêineres podem ajudar a garantir que os aplicativos sejam implantados de maneira rápida, confiável e consistente, independentemente do ambiente de implantação. Os contêineres também oferecem um controle mais granular sobre os recursos, proporcionando maior eficiência à sua infraestrutura.

Containerizar é atender a todas as necessidades essenciais necessárias para executar uma tarefa / ambiente específico, de modo que seja auto-suficiente e possa ser executado em qualquer plataforma, o que elimina muita dor quando se trata de configurar e instalar coisas.

Dawny33
fonte