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 caixa de proteção dentro da qual todo um sistema de arquivos isolado é executado.
Também li que um contêiner não possui 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 do Docker com nomes de sistemas operacionais. Vemos imagens como Ubuntu, Debian, Fedora, CentOS e assim por diante.
Meu ponto é: o que são essas imagens, realmente? Qual a diferença entre criar um contêiner baseado na imagem do Debian e criar uma máquina virtual e instalar o Debian?
Achei que os contêineres não tivessem um sistema operacional convidado instalado, mas quando criamos imagens, as baseamos em alguma imagem com o nome de um sistema operacional.
Além disso, nos exemplos que vi quando fazemos docker run ubuntu echo "hello world"
, parece que estamos girando uma VM com o Ubuntu e fazendo com que ela execute o comando echo "hello world"
.
Da mesma forma, quando o fazemos docker run -it ubuntu /bin/bash
, parece que estamos ativando uma VM com o Ubuntu e acessando-a usando a linha de comando.
De qualquer forma, sobre o que são essas imagens com nomes de sistemas operacionais? Quão diferente é executar um contêiner com uma dessas imagens e ativar uma VM com o sistema operacional 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 suportar qualquer aplicativo que queremos executar?
Como todas as distribuições do Linux executam o mesmo (sim, é um pouco simplificado) kernel do Linux e diferem apenas no software de usuário, é muito fácil simular um ambiente de distribuição diferente - apenas instalando esse software de usuário e fingindo que é outra distribuição. Sendo específico, instalar o contêiner CentOS dentro do sistema operacional Ubuntu significa que você obterá a área de usuário do CentOS, enquanto ainda estiver executando o mesmo kernel, nem mesmo outra instância do kernel.
Portanto , a virtualização leve é como ter compartimentos isolados no mesmo sistema operacional. Au contraire real virtualization é ter outro sistema operacional completo dentro do sistema operacional host. É por isso que o docker não pode rodar FreeBSD ou Windows dentro do Linux.
Se isso for mais fácil, você pode pensar que o docker é um ambiente chroot muito sofisticado e avançado.
Os contêineres são executados em um único kernel. Em outras palavras, todos os contêineres têm um único kernel (Host OS). Considerando que, por outro lado, os hipervisores têm vários kernais. Cada máquina virtual é executada em um kernel diferente.
E "docker run ubuntu" é como criar um ambiente chroot.
Eu estava lutando com a mesma pergunta que você está fazendo, e é isso que eu entendi.
O contêiner não possui 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 nada. 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
Para dar mais clareza na resposta @drookie:
o que está acontecendo é que no macOS/windowsOS, depois de instalar o docker desktop , ele instalou a VM do Linux executando o Docker Engine.
Para adicionar mais clareza aprofundada: Algumas das coisas mágicas que o Docker Desktop cuida para os desenvolvedores incluem :
caso você instale o docker-engine diretamente em um sistema operacional, ele usará o mesmo kernel Linux HOST.