L'idée est que l'image entière est complètement autonome et fonctionne sur la couche matérielle/virtualisation. Ainsi, (le pro :) ne peut pas être influencé par autre chose que ce qui fait partie de l'image.
Chaque image contient un os complet. Les OS spéciaux créés par Docker sont livrés avec quelques méga-octets : par exemple linux Alpine qui est un système d'exploitation de 8 mégaoctets !
Mais les systèmes d'exploitation plus importants comme ubuntu/Windows peuvent représenter quelques gigaoctets. Les deux ont leurs avantages puisque docker découpe une image en couches, de sorte que lorsque vous utilisez une image de base deux fois (commande FROM, voir N20 Answers), vous ne téléchargez cette couche qu'une seule fois.
Un système d'exploitation plus petit présente l'avantage de ne nécessiter que le téléchargement de quelques mégaoctets, mais pour chaque bibliothèque (linux) que vous souhaitez utiliser, vous devrez la télécharger et l'inclure vous-même. Cette couche personnalisée n'est alors utilisée que dans votre propre image et n'est donc pas réutilisée dans d'autres images, ce qui crée une couche de téléchargement supplémentaire pour le client et des mégaoctets que les gens devront télécharger pour utiliser votre image.
Si vous souhaitez créer une image à partir de rien, vous pouvez démarrer votre dockerfile avec :
FROM scratch
Mais ce n'est pas conseillé, à moins que vous ne sachiez vraiment ce que vous faites et/ou que vous fassiez du bricolage.