Przewodnik po kontenerach systemu Linux: wprowadzenie do kontenerów

Kontenery to modne hasło od lat... ale jakie one są dokładnie?

Kontenery to metoda uruchamiania zwirtualizowanych aplikacji na komputerze, podobna do maszyn wirtualnych, ale wykorzystująca inny zestaw podstawowych technologii. Mogą być trudne do zrozumienia, ale są niezbędne do uruchomienia wszystkiego Minecrafta serwerów do Google. A my pokażemy Ci, jak je skonfigurować.

Będziemy używać Linuksa, systemu operacyjnego zbudowanego z naciskiem na przenośność, modułowość i stabilność. Linux jest obecny we wszystkim, od serwerów po kuchenki mikrofalowe i konsole do gier wideo. Kontenery nie ograniczają się do działania w systemie Linux, ale stojące za nimi technologie najlepiej pasują do systemu Linux i działają najlepiej na nim. Jeśli dopiero zaczynasz przygodę z Linuksem, zalecamy zapoznanie się z naszym poradnikiem Przewodnik dla początkujących przed nurkowaniem.

Czy kontenery są maszynami wirtualnymi?

Kontenery mogą być złożonym tematem, ale najlepiej zacząć od jednego kluczowego punktu: kontener jest

nie maszynę wirtualną. Maszyna wirtualna to symulowana wersja określonego sprzętu i jego oprogramowania działająca w tzw. hiperwizorze. Jeśli kiedykolwiek korzystałeś z oprogramowania takiego jak VirtualBox lub wieloprzebiegowy, oznacza to, że użyłeś hypervisora.

Hiperwizor zwykle działa albo jako własny system operacyjny (znany jako hiperwizor typu 1), albo w ramach innego systemu operacyjnego, takiego jak Windows lub Ubuntu (hiperwizor typu 2). Obowiązkiem hiperwizora jest przedstawienie systemowi operacyjnemu gościa symulowanego sprzętu wymaganego do działania. Pełny system operacyjny może wtedy działać na wierzchu. Obejmuje to wszystko, od symulowanego procesora i pamięci RAM po magistrale danych, dyski twarde lub karty sieciowe. Ta symulacja jest kosztowna obliczeniowo, więc maszyny wirtualne zazwyczaj wiążą się ze znacznym obciążeniem.

Czym zatem jest kontener?

Kontener jest podobny do maszyny wirtualnej, ponieważ zawiera i uruchamia oprogramowanie w izolowanym środowisku w systemie hosta. Jednak kontenery zastępują tradycyjną wirtualizację sprzętu, opierając się bezpośrednio na systemie operacyjnym hosta. Kontenery współdzielą biblioteki i pliki binarne systemu operacyjnego hosta i mają tylko zasoby i zależności potrzebne do uruchomienia określonej aplikacji, którą zawierają. Oznacza to, że nie ma potrzeby posiadania pełnego systemu operacyjnego na kontener, ponieważ wszystkie kontenery działające na platformie system może współużytkować system operacyjny pojedynczego hosta, zachowując jednocześnie segregację, jaką uzyskuje się w przypadku rozwiązań wirtualnych maszyny.

Kontenery uzyskują dostęp do systemu operacyjnego hosta za pośrednictwem silnika kontenerów, który zarządza działającymi kontenerami i kontroluje ich dostęp do bazowego systemu operacyjnego. Może to obejmować egzekwowanie zabezpieczeń między kontenerami oraz udzielanie lub odmawianie dostępu do plików systemu operacyjnego lub połączeń sieciowych.

Jakie są kompromisy związane z używaniem kontenerów?

Chociaż maszyny wirtualne i kontenery są podobne, korzystanie z kontenerów ma swoje wady. Po pierwsze, maszyny wirtualne są uważane za bezpieczniejsze, ponieważ powierzchnia ataku, na której można „uciec” przed maszyną wirtualną, jest znacznie mniejsza i trudniejsza do penetracji. Kontener może na przykład nie nadawać się do testowania złośliwego oprogramowania.

Główną zaletą korzystania z kontenerów jest to, że są lekkie, a uniknięcie konieczności wirtualizacji całego systemu operacyjnego oznacza minimalny czas uruchamiania i mniejsze obciążenie systemu. Oznacza to, że na jednym hoście można uruchomić znacznie więcej kontenerów, co nie byłoby możliwe w przypadku maszyn wirtualnych.

Ponieważ kontenery nie wymagają pełnego systemu operacyjnego, można je łatwo spakować w mniejsze obrazy i dystrybuować. Podczas gdy pełny obraz maszyny wirtualnej może z łatwością mieć dziesiątki gigabajtów, kontenery mogą mieć obrazy tak małe, jak 15 KB. Dzięki temu dystrybucja i użytkowanie pojemników jest niezwykle łatwe. Zademonstrujemy to, uruchamiając kilka prostych przykładowych kontenerów w Dockerze.

Instalowanie Dockera

To dużo teorii, więc przejdźmy do praktyki. Aby pokazać, jak skonfigurować kontener, zainstalujemy Docker w Ubuntu 23.10 i użyjemy go do uruchomienia prostego kontenera Hello World. Nasze kroki są testowane na maszynie wirtualnej, ale możesz także wykonać podwójny rozruch z komputera z systemem Windows lub użyć pliku świetny laptop dla Linuksa.

Docker szybko stał się de facto narzędziem do konteneryzacji. Chociaż istnieją inne narzędzia, Docker jest powszechnie stosowany i jest idealny do wszystkich aplikacji oprócz najbardziej wymagających. Jest dokumentację dotyczącą różnych sposobów instalacji Dockera, ale będziemy używać wygodnego skryptu instalacyjnego. To polecenie pobierze skrypt z get.docker.com na komputer lokalny:

$ curl -fsSL https://get.docker.com -o get-docker.sh

Następnie możesz uruchomić ten skrypt, aby zainstalować Docker. Możesz sprawdzić, czy Docker jest poprawnie zainstalowany, sprawdzając wersję za pomocą:

$ sudo sh ./get-docker.sh

Następnie następuje sprawdzenie wersji za pomocą:

$ sudo docker version

Możesz także sprawdzić, czy usługa dokowania działa w tle za pomocą:

$ sudo systemctl status docker

Powinien wskazywać „aktywny (działa)” zielonym tekstem, jak zaznaczono na zrzucie ekranu poniżej. Wersja silnika Dockera również powinna zostać wydrukowana bez błędów.

Uruchomienie prostego przykładu

Teraz, gdy Docker jest zainstalowany, możesz go użyć do pobrania obrazu kontenera. Obrazy kontenerów przypominają obrazy ISO maszyn wirtualnych, z tą różnicą, że zazwyczaj są mniejsze i łatwiejsze do zbudowania. Pobierz prosty obraz kontenera hello-world za pomocą następującego polecenia:

$ sudo docker pull hello-world

Po pobraniu obrazu możesz to sprawdzić, wyświetlając listę obrazów pobranych w systemie, korzystając z następujących poleceń:

$ sudo docker images

Powinieneś teraz zobaczyć pobrany plik hello-world. Zwróć uwagę na bardzo mały rozmiar (13 KB na naszej maszynie testowej), a także na jego etykietę. Znacznik obrazu jest w rzeczywistości jego wersją. Domyślnie Docker pobierze najnowszą wersję obrazu. Uruchom kontener na podstawie tego obrazu, używając:

$ sudo docker run hello-world: latest

Spowoduje to wyświetlenie komunikatu hello-world Dockersa, który działa z bardzo małego programu w języku C (który możesz sprawdzić na GitHub).

Gratulacje; uruchomiłeś swój pierwszy kontener! W tym przypadku program wypisał wynik i zakończył wykonywanie. Kontener jest teraz martwy i nie działa.

Jak utrzymać kontenery przy życiu

Po uruchomieniu podstawowego kontenera możemy teraz zbudować bardziej złożony przykład, który nie kończy się natychmiast po wykonaniu zadania. Kontenery są często budowane wokół jednego procesu, co może skutkować powstaniem większej liczby procesów. Po zakończeniu tego procesu podstawowego, cały kontener zakończy się wraz z nim. Może to brzmieć jak ograniczenie, ale w rzeczywistości jest bardzo podobne do sposobu inicjowania systemów w ramach pełnej funkcji jądra Linuksa.

Aby uruchomić trwały przykład, możemy pobrać obraz Nginx, który jest serwerem internetowym używanym do hostowania znacznego odsetka stron internetowych na świecie. Do tego przykładu wybraliśmy Nginx, ponieważ jest prosty, nie wymaga zaawansowanej konfiguracji i jest lekki. Pobierz najnowszy obraz Nginx za pomocą następującego polecenia:

$ sudo docker pull nginx

Dodaliśmy -P flagę tutaj, aby skonfigurować przekierowanie portów z kontenera do systemu operacyjnego hosta. Port 80 jest używany do niezaszyfrowanego ruchu HTTP (tj. sieciowego). Umożliwi to dostęp do kontenera z komputera hosta:

$ sudo docker run -p 80:80 nginx

To polecenie zostanie uruchomione w twoim terminalu w trybie podłączonym, co oznacza, że ​​kontener jest dosłownie podłączony do twojego terminala, więc wszystkie logi z kontenera zostaną tam wydrukowane. Po uruchomieniu pojemnika otwórz go http://localhost w Twojej przeglądarce internetowej. Zobaczysz ekran powitalny Nginx podobny do poniższego:

Kontener Nginx działa teraz w silniku kontenera. Chociaż Nginx działa w trybie podłączonym, będzie działał tylko tak długo, jak długo będzie otwarty. Możesz opuścić kontener Nginx, naciskając Ctrl + C w swoim terminalu.

Jak uruchomić kontenery w tle

Aby uruchomić Nginx w tle, dodamy kolejną flagę, -D, dla trybu odłączonego. Spowoduje to uruchomienie kontenera odłączonego od terminala, co oznacza, że ​​będzie on działał w tle. Na przykład:

$ sudo docker run -d -p 80:80 nginx

Możesz wyświetlić listę uruchomionych kontenerów w systemie. Zwróć uwagę, że Twój kontener Nginx działa teraz w tle i ma przypisany identyfikator.

$ sudo docker ps

Działający kontener działający w tle można zabić przy użyciu jego identyfikatora. Możesz także zauważyć, że kontenerowi nadano nazwę. Jeśli nie zostanie on określony, Docker nada każdemu kontenerowi losową, unikalną nazwę.

$ sudo docker kill 

Można to jednak przetestować za pomocą bardziej interesujących obrazów. Jest mnóstwo dostępnych na Centrum Dockera, który pełni funkcję centralnego repozytorium obrazów kontenerów publicznych.

Nurkowanie głębiej z kontenerami

To było krótkie wprowadzenie do kontenerów. Kontenery mogą być nieskończenie złożone, ale stanowią podstawowy element składowy wysoce rozproszonych systemów, na których działa większość współczesnego Internetu. Ta moc nie przeszkadza jednak w ich użyciu na mniejszą skalę. Znajomość podstaw kontenerów i Dockera może być bramą do uruchomienia przydatnych usług lokalnych, takich jak serwer Minecrafta lub Plex na starym komputerze.