Os contêineres do Docker têm seu próprio kernel ou não?

66

Vejo que muitas imagens do docker no repositório do docker são feitas com uma base do Ubuntu.

O que isso significa? Cada contêiner compacta uma versão simplificada do kernel do Linux?

Os contêineres ficam em cima de seus próprios grãos? Mas achei que os contêineres compartilhavam o kernel do host (que em alguns casos é o boot2docker, uma compilação personalizada do Tiny Core Linux e, em outros, algo como o CoreOS).

EDIT: Esclarecendo um pouco a pergunta. Sim, eu sei que o docker é um contêiner de processo, não uma VM completa. Mas como existem contêineres "Ubuntu" no registro oficial do docker hub e outros sistemas operacionais como o CentOS, o que significa executar o Ubuntu em um contêiner?

Resposta: Ahh, isso me ocorreu. São os processos de terra do usuário do Ubuntu, contendo o apt-get e outros processos de configuração para uma compilação específica do Ubuntu. Da mesma forma para o CentOS. O Docker não é um processo único, apenas uma entrada. Portanto, para essas distribuições, o ponto de entrada é algum tipo de processo init que gera outros processos.

stewart99
fonte
2
"São os processos de terra dos usuários do Ubuntu" - não apenas processos, mas também bibliotecas.
osgx

Respostas:

38

O Docker usa o kernel do SO host, não há kernel personalizado ou adicional dentro do contêiner. Todos os contêineres executados em uma máquina estão compartilhando esse kernel "host".

A Wikipedia diz http://en.wikipedia.org/wiki/Docker_(software) que

O Docker usa recursos de isolamento de recursos do kernel Linux, como cgroups e namespaces do kernel, para permitir que "contêineres" independentes sejam executados em uma única instância do Linux, evitando a sobrecarga de iniciar máquinas virtuais.

cgroups, namespaces e LXC são recursos do kernel do Linux para isolar grupos de processos; ainda existe um único kernel, um planejador único e uma instância do gerenciador de memória do kernel.

O Boot2docker e o CoreOS são apenas distribuições Linux leves com alguns kernel do host; eles podem ser usados ​​para carregar contêineres do Docker.

http://boot2docker.io/

O boot2docker é uma distribuição leve do Linux baseada no Tiny Core Linux, criada especificamente para executar contêineres do Docker. Ele roda completamente da RAM, pesa ~ 27MB e é inicializado em ~ 5s (YMMV).

http://en.wikipedia.org/wiki/CoreOS

Um host de controle único (instância CoreOS) executa vários sistemas Linux isolados (contêineres), usando o Docker como uma camada adicional de abstração e interface [14] para os recursos subjacentes de virtualização no kernel do Linux no nível do sistema operacional. ... Essa abordagem baseia-se na funcionalidade cgroups do kernel Linux, que fornece isolamento e capacidade de namespace para limitar, contabilizar e isolar o uso de recursos (CPU, memória, E / S de disco, etc.) para as coleções de processos.

osgx
fonte
11
Isso não responde à pergunta.
EML
2
EML, qual pergunta? Por padrão, todos os contêineres do Docker não possuem kernels próprios. Existe apenas um núcleo do host para todos os contêineres do Docker.
osgx 26/03
com certeza, sua resposta é ótima, mas o OP queria saber por que ele deve ter FROMuma imagem base do Ubuntu quando o host está executando o Ubuntu. Para responder à pergunta, você precisa explicar o que é uma imagem de base.
EML 26/03
2
EML, a pergunta foi editada com "Esclarecendo" ( superuser.com/posts/889472/revisions ) após a resposta da minha resposta, por isso é uma resposta à pergunta original sem esclarecimentos. Se você tiver algumas informações para compartilhar sobre imagens básicas e kernels na janela de encaixe, adicione outra resposta.
Osgx
17

Em quase todos os casos, o kernel do sistema operacional host é compartilhado. Para executar um kernel diferente, você precisa usar a virtualização. Isso é raro e usado apenas quando necessário devido à degradação do desempenho.

"O contêiner do Docker Engine compreende apenas o aplicativo e suas dependências. Ele é executado como um processo isolado no espaço do usuário no sistema operacional host, compartilhando o kernel com outros contêineres. Dessa forma, desfruta dos benefícios de alocação e isolamento de recursos das VMs, mas é muito mais portátil e eficiente. "

Isso pode ajudar a explicar como funciona: insira a descrição da imagem aqui

Fonte: https://www.docker.com/whatisdocker/

JeremiahBarrar
fonte
4
Qualquer fonte para "Pacotes podem usar kernels diferentes" ??? O Docker em si não pode usar vários kernels; sempre há apenas um kernel de host único. Somente quando combinados com o hypervisor (virtualização), podemos iniciar vários hosts, cada um com sua própria versão do kernel, e executar um Docker por host virtual; mas para qualquer host haverá apenas um kernel para acolhimento e para os seus recipientes entrados)
osgx
2
O que é pacote? O contêiner do Docker não possui kernel; Ele acabou de ser instalado e iniciado no kernel usado no host. Então: um Docker = um servidor = um kernel, como mostra a figura. Não há como usar dois núcleos com um único mecanismo Docker; todos os contêineres dentro desse mecanismo usarão o mesmo kernel. Acho resposta correta é "recipientes Não, Docker não pode usar diferentes kernels dentro única instância de Docker Motor"
osgx
11
Cada contêiner de docker pode executar o código que desejar, incluindo software de virtualização capaz de carregar qualquer kernel que seu software possa exigir. Você pode executar o Windows em um contêiner, se desejar.
JeremiahBarrar
11
JeremiahBarrar, Entendi, obrigado pela explicação. A execução do software de virtualização de dentro do contêiner do Docker está documentada e é suportada pelo Docker? Que tipo de virtualização funcionará no Docker (software qemu, qemu + kvm, xen, ...)?
Osgx 14/03/2015
2
A primeira frase é enganosa. Usar uma VM dentro de um contêiner anula o ponto de usar o Docker.
precisa saber é o seguinte