"kontajner" je termin pre akekolvek oddelene prostredie pre beh aplikacie. Kontajner sa da velmi vagne predstavit ako virtualna masina, ktora ale bezi na rovnakom kerneli, a teda vie selektivne zdielat resources s vonkajsim svetom. Linux ma na vytvaranie kontajnerov nastroje cgroups a namespaces, Windows ma HCS (Host Compute Service, alebo aj Windows Containers).
Tieto nastroje umoznuju na nizkej urovni nastavit potrebne urovne izolacie (izolaciu diskov (kontajner vidi svoj obraz disku, nie vonkajsie disky (C:, D:, ...), ale vie vidiet aj ich casti, alebo celky, podla toho ako mu to dovolis), izolaciu sieti (kontajner vie vidiet niektore tvoje sietove adaptery, alebo nemusi mat ziadny, alebo mu vies vytvorit bridge, ...), izolaciu CPU/Memory (kontajner vie pripadne vidiet iba cast tvojich CPU alebo pamati), izolaciu procesov (kontajner moze nemusi byt informovany o tom, co sa deje mimo neho), .........)
Docker je jednoduchy user interface pre pouzivanie tychto low level nastrojov. Jeho najvyraznejsia funkcia je, ze umoznuje jednoducho vytvarat obraz kontajneru pomocou prikazov vykonavanych nad existujucim obrazom disku (zober zakladny Windows Core, nainstaluj donho tento .msi subor, pridaj tychto X suborov, etc..), a jednoducho distribuovat obrazy kontajnerov cez verejne aj sukromne registre obrazov. Pouzivam termin "obraz kontajneru", a nie "obraz disku", lebo docker image nie je len obraz disku, ale obsahuje aj rozne metadata o tom, akym sposobom z toho obrazu sa ma vytvorit kontajner ak clovek neuvedie inak (i.e. informacie, ktore porty forwardnut (defaultne Docker vytvara pre kontajner podsiet za NATom), informacie, ktoru aplikaciu a s akym cmdline z dockeru defaultne pustit, s akymi ENV premennymi pustit danu aplikaciu, ...).
Cely backend Windows Containers bol dost prisposobovany Docker-u, ale pouzivaju ho aj ine Windows sluzby, napr. Windows Sandbox a WSL2 (Da sa teda povedat, ze ked pouzivas na Windows-e Linuxovy Docker cez WSL2, bezis kontajner vnutri kontajnera).
Docker okrem toho umoznuje so standardizovanym User Interface / API robit vselijake veci, ako napr. spustat veci vzdialene na inych pocitacoch, spustat veci pre inu architekturu vo virtualnej masine (napr. viem na x86-64 procesore spustit ARM64 image a Docker ho automaticky spusti v QEMU), vytvarat klastre pocitacov na ktorych vedia sluzby bezat redundantne (docker swarm), umoznuje existenciu rovnako nazvaneho image pre rozne platformy a teda pouzitie toho isteho prikazu pre spustenie dockerizovanej aplikacie na ARM64 aj na x86-64, apod...,