Gdy nie ma kontenerów…

Na początek dobrze żebyśmy zdali sobie sprawę czym po co jest nam Docker, po co to wszystko, po co się tego uczyć, kogo to obchodzi. Chciałbym żebyście wyobrazili sobie taką sytuację: Pracujecie w małej firmie, jesteście takim człowiekiem-orkiestrą. Odpowiadajcie za wszystko, konfigurujecie serwery, piszecie programy i tak dalej. Jeżeli ktoś pracował w małej firmie, to wie jak to wygląda.

I przychodzi do was szef i mówi:

– Zainstalujcie mi Wordpressa. Chcemy postawić blog firmowy.

– Okej, nic trudnego! Stawiamy Apache, stawiamy MySQLa, stawiamy PHP. Instalujemy paczki, konfigurujemy… Wszystko działa.

Potem przychodzi do nas inna programistka, Alicja:

– Ja mam tutaj taką swoją aplikację na PHP5. Czy możesz mi zainstalować na tym naszym serwerze?

Jest trochę zabawy, bo tutaj mieliśmy PHP7, teraz mamy PHP5. (Oczywiście nie chodzi mi o dokładną kompatybilność pomiędzy wersjami PHP, ale wyobraźcie sobie taką sytuację, w której jedna z tych aplikacji nie chce działać razem z tą inną). W końcu się udaje. Jakieś obejścia, haki, coś tam… Udaje się uruchomić i ten blog i tę aplikację – wszystko działa.

Wtedy przychodzi do was trzeci programista, Bogdan, i mówi:

– Ja tutaj mam taką aplikację napisaną w Pythonie. Czy możesz mi ją zainstalować na tym naszym serwerze.

Sprawa nie jest taka prosta, bo musimy zainstalować jakieś różne paczki pythonowe, musimy zainstalować Pythona w dobrej wersji. Niestety okazuje się, że na wersji systemu operacyjnego, jaką mamy na naszym serwerze, akurat Python 3.8 jest niedostępny. Jest tylko 3.7, więc już jest problem. Bogdan przerabia swoją aplikację. Jakoś udaje się uruchomić na Pythonie 3.7, ale musimy i tak zainstalować wszystkie te paczki z PIPa. Siedzimy po nocy, jakoś instalujemy i okazuje się, że nie działa.

Ale jak to?! Przecież Bogdan mówi: – U mnie wszystko działało, na moim komputerze śmiga wspaniale, nawet po tej zmianie wersji. Coś musiałeś źle zainstalować!

I teraz siedzicie i głowicie się dlaczego nie działa… Jaka jest różnica między waszym firmowym serwerem a laptopem Bogdana, że w niego działa, a u mnie nie działa? O co chodzi?

W tym czasie Alicja weszła na wasz serwer, bo potrzebowała zmienić konfigurację PHP pod swoją aplikację. Okazuje się, że blog przestał działać. Przychodzi szef, mówi:

– Dlaczego nic nie działa?! Dlaczego te aplikacje nie działają?! Dlaczego Wordpress nie działa?!

Jest kaszana… Albo rzucacie papierami od razu albo szef robi to za was. CV leci na portal bezrobotny.pl.

Czy można inaczej?

Czy można tego uniknąć? Oczywiście, że można inaczej! Nie byłoby tych zajęć (i filmików i artykułów :), gdyby nie było można. Ludzie wpadli na różne rozwiązania takich problemów. Podstawowym są maszyny wirtualne czyli VMki. Mam nadzieję, że wiecie czym są VMki – to są takie wirtualne komputery. Tak naprawdę, one udają prawdziwe maszyny. Służą do tego, żeby można było odizolować jedne aplikacje od drugich. Stawiamy wiele niezależnych systemów operacyjnych na jednej fizycznej maszynie.

Jest też drugie rozwiązanie: kontenery.

Kontenery

O kontenerach powiemy o tym trochę więcej za sekundę. Jednym z przykładów kontenerów, jedną implementacją kontenerów jest Docker. Ponieważ Docker teraz zdobył wielką popularność, to wiele osób utożsamia Dockera z kontenerami (ja też będę często używał tych słów zamiennie). Ale konteneryzacja ogólnie to jest szersze pojęcie, niż tylko Docker. Docker to jest, po prostu, jedna z implementacji systemu kontenerów.

Czym jest kontener?

Kontener to jest bliski kuzyn maszyny wirtualnej. Można go porównać do maszyny wirtualnej.

Tutaj chcę uprzedzić wszystkich purystów – tak są różnice, ale mimo wszystko, najłatwiej jest koncepcyjnie wyobrazić sobie kontener, jako po prostu maszynę wirtualną.

Kontener to też paczka z oprogramowaniem. Jest to jakieś oprogramowanie, wszystkie jego zależności spakowane razem w jeden plik, który możemy następnie udostępniać, uruchamiać na innych komputerach, przesyłać.

No właśnie – uruchamiać na innych komputerach. Docker, czy też konteneryzacja ogólnie, składa się zawsze z platformy uruchomieniowej. Jest to taki system, który pozwala nam uruchamiać te nasze paczki z oprogramowaniem. Dzięki temu, mamy jednolitą platformę, czyli nie ma różnic pomiędzy różnymi serwerami. Tak jak my mieliśmy w tym przykładzie, nie ma różnicy pomiędzy laptopem deweloperskim a serwerem firmowym. Docker, czy też kontenery ogólnie, dają nam taką abstrakcję, która umożliwia nam uruchamianie tych samych programów, dokładnie w takim samym środowisku – niezależnie od tego, jaki to jest fizyczny komputer.

Ostatnia cecha kontenerów to izolacja procesów. Wszystkie kontenery działają niezależnie od siebie. Nieważne jaka jest konfiguracja. Nieważne co robi jeden z kontenerów. Nieważne co tam się dzieje: czy nastąpiło, na przykład, włamanie do tamtego kontenera. Inne kontenery działają bez problemu, dokładnie tak samo, jak działały wcześniej.

Kontener vs VM

Porównanie warstw kontenerów i maszyn wirtualnych.

Porównanie warstw kontenerów i maszyn wirtualnych. Źródło: docs.docker.com

Tutaj mamy bardzo fajną ilustrację: porównanie konteneryzacji i maszyn wirtualnych. Jak widzicie, mamy na dole infrastrukturę, czyli warstwę fizycznego sprzętu: procesor, płyta główna, pamięć operacyjna i tak dalej. To jest współdzielone. Tak samo w kontenerach i maszynach wirtualnych. Nie ma różnic.

Różnice zaczynają się poziom wyżej. W maszynach wirtualnych, następną warstwą jest tak zwany hipervisor, czyli, w skrócie, taki rodzaj systemu operacyjnego dla maszyn wirtualnych. Ten system zarządza stawianiem nowych maszyn wirtualnych. VMki składają się z systemu operacyjnego i aplikacji, które w nich umieścimy.

Na tym polega podstawowa różnica, między maszynami i kontenerami. Dla kontenerów mamy jeden wspólny system operacyjny (właściwie to samo jądro systemu operacyjnego Linux), współdzielony między wszystkimi aplikacjami. Już widzimy podstawową zaletę: nie potrzebujemy mieć różnych systemów operacyjnych na każdej z maszyn.

Czasami jednak tego właśnie potrzebujemy. Jeżeli chcemy na jednym komputerze uruchomić aplikacje dla Windowsa, MacOS i Linuxa, potrzebujemy wtedy mieć różne systemy operacyjne.

Jeżeli jednak nie potrzebujemy mieć różnych systemów operacyjnych, to nie musimy instalować za każdym dla każdego kontenera oddzielnego systemu. Czyli już zyskujemy. Po pierwsze, gigabajty przestrzeni dyskowej, które oszczędzamy, nie musząc instalować wielu kopii tego samego systemu operacyjnego.

Po drugie, oszczędzamy też dużo czasu. Czasu procesora, bo nie ma tutaj tej podwójnej abstrakcji, którą musimy pokonać, żeby wykonać nasz program. Jeżeli korzystamy z maszyn wirtualnych, to nasz kod jest najpierw obsługiwany przez system operacyjny, potem przez hypervisor, a dopiero na końcu, jest fizycznie wykonywany na sprzęcie.

W Dockerze nie mamy tego problemu. Aplikacje są uruchamiane praktycznie identycznie, tak jak byłyby uruchamiane zwykłe aplikacje na naszym systemie operacyjnym. Kontenery są bardzo lekkie. Nie wprowadzają dodatkowego narzutu.

Docker

Teraz trochę więcej o samym Dockerze. Powiedzieliśmy sobie, czym są kontenery ogólnie. Docker implementuje te wszystkie cechy.

Jest jeszcze jedna dodatkowa rzecz: Dockerfile. (O Dockerfile też będziemy mówić później). Jest to zautomatyzowany sposób budowania obrazów. Docker to jest też standard, czy też standardowy format, tych obrazów. Jest też właśnie samo narzędzie do budowania, nie tylko automatyczne, ale też ręczne. Można ręcznie budować obrazy, można budować obrazy automatycznie.

Jest też środowisko uruchomieniowe, czyli to, w jaki sposób możemy później te obrazy uruchamiać. Jest też Docker Hub. Jest to takie scentralizowane miejsce przechowywania różnych obrazów i udostępniania ich innym użytkownikom. Dzięki temu możemy opublikować nasze obrazy, ktoś inny może je ściągnąć i może ich używać. (Więcej o Docker Hubie też powiemy później).

Korzystanie z Dockera na różnych systemach operacyjnych

Linux

Docker jest o tyle specyficzny, że to jest technologia linuksowa. Nie ma jak tego ukryć, tak po prostu jest. Docker jest tworzony na Linuxie, dla Linuxa i z nim działa najlepiej.

Docker na Windows i MacOS

Jeżeli uruchamiamy Dockera na Windowsie albo na Macu, na przykład używając Docker Toolbox albo Docker Desktop, to tworzy nam się maszyna wirtualna z Linuxem. Docker Toolbox tworzy maszynę wirtualną z Linuksem, której potem używa do uruchamiania kontenerów. Wynika to z faktu, że tak naprawdę, Docker na Windowsa i Docker na Maca służy głównie do dewelopowania, do tworzenia obrazów, a nie do uruchamiania ich na środowiskach produkcyjnych. One są uruchamiane na środowiskach produkcyjnych linuksowych.

Kontenery windowsowe

Tutaj trzeba zaznaczyć, że istnieją kontenery windowsowe dla Dockera i wtedy mamy programy windowsowe uruchamiane na systemie Windows. To jest dosyć niedawno wprowadzona rzecz do Dockera i owszem, mamy taką opcję. Dlatego jeżeli ktoś korzysta z Docker Desktop, należy przełączyć opcję z Windows containers na Linux containers (o ile to nie jest zrobione domyślnie).

Docker Toolbox a przekierowanie portów

Jeżeli chodzi o Docker Toolbox, to jest taka specyficzna rzecz, która wynika właśnie z tego, że używamy maszyny wirtualnej. Trzeba będzie wykonać polecenie docker-machine ip, żeby uzyskać IP tej maszyny wirtualnej, na której będą uruchamiane nasze kontenery. To IP będzie potrzebne, gdy będziemy chcieli uruchomić jakieś aplikacje webowe (na przykład) i zobaczyć co się w nich dzieje, przekierowując porty z kontenera na komputer hosta.