Brakuje podstawowych koncepcji Dockera. To zupełnie inna sprawa.
Pierwszą rzeczą, którą musisz wiedzieć, jest filozofia Dockera: uruchom jeden proces izolowany w kontenerze. Nie uruchomisz systemu operacyjnego w kontenerze Docker, uruchomisz proces w kontenerze z zawartością głównego systemu plików w oparciu o wybraną przez ciebie dystrybucję linux. Ubuntu to wybór między innymi.
Teraz powinieneś się zastanowić, w jaki sposób można uruchomić proces w obrazie bazowym linuxa innym niż dystrybucja linuksowa, z którą działa twój host. Aby system operacyjny działał, potrzebujesz:
- System plików rozruchowych: zawiera program ładujący i jądro, które po załadowaniu pozostanie w pamięci. Nie obchodzi nas to w przypadku kontenerów Docker, ponieważ jądro jest współdzielone z hostem i jest wspólną częścią wszystkich dystrybucji Linuksa.
- Główny system plików: zawiera strukturę systemu plików. Może się różnić od jednej dystrybucji linuksa do drugiej. Jest tylko do odczytu, dopóki sekwencja rozruchowa nie zakończy się.
Docker używa UnionFS do zarządzania warstwami bloków dysku wewnątrz kontenera, aby można je było układać w stosy.
Za kulisami wykorzystuje podłączenie unii, które pozwala na podłączenie wielu systemów plików jednocześnie, wyglądając jak cały wirtualny. W rzeczywistości upuszcza podstawową warstwę obrazu jako tryb odczytu i zapisu na podstawowy system plików w trybie tylko do odczytu.
Tutaj masz stos bloków dyskowych ułożonych warstwami w taki sposób, że dystrybucja linuksowa, z której pochodzi obraz podstawowy, zawierałaby ten sam system plików po zainstalowaniu na prawdziwym hoście, ale tym razem znajduje się w kontenerze.
Ostatnią rzeczą, której teraz brakuje, jest: jak uruchomić tę rzecz w izolacji?
Odpowiedź brzmi: przestrzenie nazw. Nie będę tutaj wchodził w szczegóły, ponieważ odbiegałoby to nieco od pierwotnego pytania. Ale musisz wiedzieć, że od czasu jądra 2.4.19 z biegiem lat pojawiły się różnego rodzaju przestrzenie nazw. Obecnie dostępne są następujące przestrzenie nazw:
- IPC: przestrzeń nazw IPC (komunikacja międzyprocesowa)
- MNT: zamontuj przestrzeń nazw
- NET: przestrzeń nazw sieci
- PID: przestrzeń nazw pid
- USER: przestrzeń nazw użytkownika (UID)
- UTS: przestrzeń nazw UTS (nazwy hostów)
Przestrzenie nazw to izolowane struktury wewnątrz jądra, które umożliwiają uruchamianie procesów w określonym środowisku. Na przykład przestrzeń nazw MNT będzie kluczową funkcją umożliwiającą uruchomienie procesu w specyfiki systemu plików głównego obrazu podstawowego. Przestrzeń nazw NET będzie kolejną kluczową funkcją dla kontenera mającego określone interfejsy sieciowe w celu komunikacji z mostem dokującym itp.
Tak, tak, głównym celem tego wszystkiego jest uruchomienie aplikacji w izolacji, wysłanie jej z lokalnego środowiska do produkcji z łatwością w pudełku zwanym kontenerem.
Dobrym pomysłem byłoby przeczytanie dokumentacji dokera przed zagłębieniem się w nią.