Por que usamos uma imagem base do sistema operacional com o Docker se os contêineres não têm sistema operacional convidado?

84

Comecei a estudar Docker e há algo que está sendo bastante confuso para mim. Como li no site do Docker, um contêiner é diferente de uma máquina virtual. Pelo que entendi, um contêiner é apenas uma caixa de areia dentro da qual um sistema de arquivos isolado inteiro é executado.

Também li que um contêiner não possui um SO convidado instalado. Em vez disso, conta com o Kernel do SO subjacente.

Tudo isso está bem. O que estou confuso é que existem imagens do Docker com o nome de sistemas operacionais. Vemos imagens como Ubuntu, Debian, Fedora, CentOS e assim por diante.

O que quero dizer é: o que são realmente essas imagens? Como é diferente criar um container baseado na imagem Debian do que criar uma Máquina Virtual e instalar o Debian?

Eu pensei que os contêineres não tinham SO convidado instalado, mas quando criamos imagens, baseamos-nos em alguma imagem com o nome de um SO.

Além disso, nos exemplos que vi quando parecemos docker run ubuntu echo "hello world", parece que estamos criando uma VM com o Ubuntu e fazendo com que ele execute o comando echo "hello world".

Da mesma maneira que fazemos docker run -it ubuntu /bin/bash, parece que estamos criando uma VM com o Ubuntu e acessando-a usando a linha de comando.

Enfim, como são essas imagens com o nome dos sistemas operacionais? Quão diferente é executar um contêiner com uma dessas imagens e girar uma VM com o SO convidado correspondente?

É a ideia de que apenas compartilhamos o kernel com o sistema operacional host (e, consequentemente, temos acesso aos recursos de hardware da máquina subjacente, sem a necessidade de virtualizar o hardware), mas ainda usamos os arquivos e binários de cada sistema diferente nos contêineres para para dar suporte a qualquer aplicativo que queremos executar?

user1620696
fonte
2
Na minha opinião, seus objetivos em virtualização são as chaves. Se você precisar de bibliotecas, idiomas etc. no SO, os contêineres do SO serão adequados à sua necessidade. Mas se sua necessidade é apenas aplicação como componentes, não é necessário usar o SO como sua imagem base. Eu acho que este artigo poderia explicá-lo claramente blog.risingstack.com/…
metamorph

Respostas:

68

Como todas as distribuições Linux executam o mesmo kernel Linux (sim, é um pouco simplificado) e diferem apenas no software da terra do usuário, é muito fácil simular um ambiente de distribuição diferente - basta instalar esse software da terra do usuário e fingir que é outra distribuição. Sendo específico, instalar o contêiner CentOS no Ubuntu OS significará que você obterá a área de usuário do CentOS, enquanto ainda estiver executando o mesmo kernel, nem mesmo outra instância do kernel.

A virtualização leve é como ter compartimentos isolados no mesmo sistema operacional. Ao contrário, a virtualização real está tendo outro sistema operacional completo no sistema operacional host. É por isso que o docker não pode executar o FreeBSD ou o Windows no Linux.

Se isso for mais fácil, você pode pensar que o docker é um ambiente chroot muito sofisticado e avançado.

drookie
fonte
3
É por isso que eu posso hospedar meu código golang compilado no contêiner do Scratch vazio - porque o código compilado precisa apenas do kernel?
Francis Norton
Então, como o SO convidado sabe usar o kernel do SO host (e como fazê-lo)? AFAIK, as bases de imagens do Docker usam imagens padrão do SO. No seu exemplo, não é como se houvesse uma compilação personalizada do CentOS que sabe usar o kernel do pai? Ou é tão simples quanto um truque do sistema de arquivos (aufs) em que o Docker redireciona as leituras de convidados (CentOS) dos / boot para o host (Ubuntu)? Nesse caso, o convidado (CentOS) instalaria sua própria cópia de / boot, mas ele nunca seria lido?
James S
Eu gosto da sua explicação, mas como você explica a execução de contêineres Linux no Windows? O Server 2016 e o ​​Windows 10 contêm um kernel do Linux para permitir o uso do Docker? É por isso que essas versões são necessárias?
duct_tape_coder 24/01
Isso é simples: eles são executados sob a pilha de virtualização completa do Hyper-V, dentro de uma VM Linux nativa: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
drookie 25/01
1

Os contêineres são executados em um único kernel. Em outras palavras, todos os contêineres têm um único kernel (Host OS). Enquanto, por outro lado, os hipervisores têm múltiplos núcleos. Cada máquina virtual é executada em um kernel diferente.

E "docker run ubuntu" é como criar um ambiente chroot.

Shiv sandhu
fonte