Může být užitečné rozlišovat mezi obrázky a kontejnery (dokumenty). obrázek je statický a žije pouze na disku. kontejner je spuštěná instance obrazu a zahrnuje svůj vlastní procesní strom, stejně jako RAM a další runtime zdroje.
obrázek je logické seskupení vrstev plus metadata o tom, co dělat při vytváření kontejneru a jak sestavit vrstvy. Součástí těchto metadat je, že každá vrstva zná ID svého rodiče.
Takže, co jde do vrstvy? Soubory (a adresáře), které jste přidali do nadřazeného prvku. Existují také speciální soubory ("whiteout"), které označují, že bylo něco smazáno z rodiče.
Když docker run
obrázek, docker
vytvoří kontejner:rozbalí všechny vrstvy ve správném pořadí a vytvoří nový „kořenový“ souborový systém oddělený od hostitele. docker
také čte metadata obrázku a spouští buď „vstupní bod“ nebo „příkaz“ zadaný při vytvoření obrázku – tím se spustí nový podstrom procesu. Zevnitř kontejneru se tento první proces jeví jako kořen stromu, ale z hostitele můžete vidět, že jde o podstrom procesů.
Kořenový souborový systém je to, co odlišuje jedno linuxové distro od druhého (také mohou existovat určité rozdíly v modulech jádra a rozdíly v souborovém systému bootloader/boot, ale ty jsou obvykle pro běžící procesy neviditelné). Jádro je sdíleno s hostitelem a ve skutečnosti stále spravuje své obvyklé povinnosti uvnitř kontejneru. Ale kořenový souborový systém je jiný, a tak když jste uvnitř kontejneru, vypadá a působí jako jakékoli distro bylo v obrazu Dockeru.
Kontejner má nejen svůj vlastní souborový systém a procesní strom, ale má také své vlastní logické síťové rozhraní a volitelně vlastní přidělení paměti RAM a času CPU. Jako operátor však máte nad kontejnerem kontrolu, takže se můžete rozhodnout sdílet síťové rozhraní hostitele s kontejnerem, poskytnout mu neomezený přístup k paměti RAM a CPU a dokonce připojit zařízení, soubory a adresáře z hostitele do kontejner. Výchozím nastavením je držet věci odděleně, ale máte moc rozbít model izolace, jak potřebujete.
Docker je obal nad LXC Linux Containers a dokumentace k tomu vám dá podrobně vědět, co je sdíleno a co ne.
Obecně hostitelský počítač vidí/obsahuje vše uvnitř kontejnerů od souborového systému po procesy atd. Můžete zadat příkaz ps na hostitelském vm a zobrazit procesy uvnitř kontejneru.
Pamatujte, že kontejnery dockerů nejsou virtuální počítače – vše tedy ve skutečnosti běží nativně na hostiteli a používá přímo hostitelské jádro. Každý kontejner má svůj vlastní uživatelský jmenný prostor (podobně jako ve starých kořenových věznicích). Existují nástroje/funkce, které zajišťují, že kontejnery vidí pouze své vlastní procesy, mají svůj vlastní souborový systém navrstvený na hostitelském souborovém systému a síťový zásobník, který je připojen k hostitelskému síťovému zásobníku.