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

Acabei de começar 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 sandbox dentro da qual todo um sistema de arquivos isolado é executado.

Também li que um contêiner não tem um sistema operacional convidado instalado. Em vez disso, ele depende do Kernel do sistema operacional subjacente.

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

Meu ponto é: o que são essas imagens, realmente? Como é diferente criar um contêiner baseado na imagem Debian do que criar uma máquina Virtual e instalar Debian?

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

Além disso, em exemplos que vi quando o fazemos docker run ubuntu echo "hello world", parece que estamos girando uma VM com o Ubuntu e fazendo-a executar o comando echo "hello world".

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

De qualquer forma, Quais são essas imagens em homenagem aos sistemas operacionais? Quão diferente é executar um contêiner com uma dessas imagens e girar uma VM com o sistema operacional convidado correspondente?

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

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

Entao leve virtualização é como ter compartimentos isolados dentro do mesmo sistema operacional. Au contraire real virtualization está tendo outro sistema operacional completo dentro do sistema operacional host. É por isso que o docker não pode executar o FreeBSD ou o Windows dentro do Linux.

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

Eu estava lutando com a mesma pergunta que você está fazendo, e isso é o que eu vim a entender.

Container não tem um sistema operacional convidado, você está certo sobre isso.

Então, por que baseamos o contêiner em uma imagem do sistema operacional?

Porque você gostaria de usar alguns comandos como (apt, ls, cd, pwd).Esses comandos são chamadas para arquivos binários que podem estar disponíveis para você em seu sistema operacional host sem que você instale anything.In para que você possa executar esses comandos dentro de sua imagem do docker, você deve ter os binários para eles dentro de sua imagem, por causa do isolamento, você não apenas executa binários do sistema operacional host.

Veja esta resposta para entender melhor por que precisamos de uma imagem base: https://stackoverflow.com/a/62384611

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

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

Na minha opinião, seus objetivos na virtualização são as chaves. Se você precisar de bibliotecas, idiomas, etc. no sistema operacional, os contêineres so são adequados à sua necessidade. Mas se sua necessidade é apenas o aplicativo como componentes, não é necessário usar o sistema operacional como sua imagem base. Acho que este artigo poderia explicar claramente Operating System Containers vs. Application Containers - RisingStack Engineering