Jak działają kontenery platformy Docker

Ukończone

Wcześniej odkryliśmy, że kontener staje się jednostką używaną do dystrybuowania aplikacji. Wiesz również, że kontener jest w standardowym formacie używanym zarówno przez zespoły deweloperów, jak i zespołów operacyjnych.

W tym przykładzie tworzysz portal śledzenia zamówień dla różnych placówek firmy do użycia. Po skompilowaniu obrazu platformy Docker twój zespół operacyjny jest teraz odpowiedzialny za wdrażanie, wdrażanie aktualizacji i zarządzanie portalem śledzenia zamówień.

W poprzedniej lekcji przedstawiono sposób tworzenia obrazu platformy Docker. W tej lekcji przyjrzysz się cyklowi życia kontenera platformy Docker oraz sposobom zarządzania kontenerami. Dowiesz się również, jak myśleć o konfigurowaniu magazynu danych i opcjach sieciowych dla kontenerów.

Jak zarządzać kontenerami platformy Docker

Kontener platformy Docker ma cykl życia, którego można użyć do zarządzania stanem kontenera i śledzenia go.

Diagram przedstawiający cykl życia kontenera oraz przejścia między fazami cyklu życia.

Aby umieścić kontener w stanie uruchomienia, użyj polecenia run . Możesz również ponownie uruchomić kontener, który jest już uruchomiony. Podczas ponownego uruchamiania kontenera otrzymuje sygnał zakończenia, aby umożliwić bezproblemowe zamykanie wszystkich uruchomionych procesów przed zakończeniem jądra kontenera.

Przyjmuje się, że kontener jest w stanie uruchomionym, dopóki nie zostanie wstrzymany, zatrzymany lub zamknięty. Kontener może jednak samodzielnie zamknąć stan działania. Kontener może samodzielnie zakończyć swoje działanie po ukończeniu uruchomionego procesu lub w przypadku, gdy proces przejdzie w stan błędu.

Aby wstrzymać uruchomiony kontener, użyj pause polecenia . To polecenie wstrzymuje wszystkie procesy w kontenerze.

Aby zatrzymać uruchomiony kontener, użyj stop polecenia . Polecenie stop umożliwia bezproblemowe zamknięcie procesu roboczego przez wysłanie sygnału zakończenia. Jądro kontenera kończy działanie po zamknięciu procesu.

Jeśli chcesz zakończyć działanie kontenera, użyj kill polecenia , aby wysłać sygnał kill. Jądro kontenera przechwytuje sygnał kill, ale uruchomiony proces nie. To polecenie wymusza zakończenie procesu roboczego w kontenerze.

Na koniec, aby usunąć kontenery, które są w stanie zatrzymanym, użyj remove polecenia . Po usunięciu kontenera wszystkie przechowywane w nim dane zostaną zniszczone.

Jak wyświetlić dostępne kontenery

Aby wyświetlić działające kontenery, użyj polecenia docker ps. Aby zobaczyć wszystkie kontenery we wszystkich stanach, przekaż argument -a.

Oto przykład:

docker ps -a

Oto dane wyjściowe tego polecenia:

CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS        NAMES
d93d40cc1ce9    tmp-ubuntu:latest  "dotnet website.dll …"  6 seconds ago    Up 5 seconds        8080/tcp      happy_wilbur
33a6cf71f7c1    tmp-ubuntu:latest  "dotnet website.dll …"  2 hours ago     Exited (0) 9 seconds ago            adoring_borg

W poprzednich danych wyjściowych należy przejrzeć trzy elementy:

  • Nazwa obrazu wymieniona w kolumnie IMAGE (OBRAZ ), w tym przykładzie tmp-ubuntu: latest. Zwróć uwagę, że na podstawie tego samego obrazu można było utworzyć więcej niż jeden kontener. Jest to zaawansowana funkcja zarządzania, której można użyć do włączenia skalowania w rozwiązaniach.

  • Stan kontenera wymieniony w kolumnie STAN . W tym przykładzie masz jeden kontener, który jest uruchomiony, i jeden kontener, który zakończył działanie. Stan kontenera jest zwykle pierwszym wskaźnikiem kondycji kontenera.

  • Nazwa kontenera wyświetlana w kolumnie NAMES . Oprócz identyfikatora kontenera w pierwszej kolumnie kontenery również otrzymują nazwę. W tym przykładzie nie podano jawnie nazwy dla każdego kontenera, dlatego platforma Docker nadała kontenerowi nazwę losową. Aby nadać kontenerowi jawną nazwę przy użyciu flagi --name , użyj run polecenia .

Dlaczego kontenery mają nazwę?

Ta funkcja umożliwia uruchamianie wielu wystąpień kontenera tego samego obrazu. Nazwy kontenerów są unikatowe, co oznacza, że jeśli określisz nazwę, nie można ponownie użyć tej nazwy, aby utworzyć nowy kontener. Jedynym sposobem ponownego użycia określonej nazwy jest usunięcie poprzedniego kontenera.

Jak uruchomić kontener

Aby uruchomić kontener, użyj docker run polecenia . Aby uruchomić kontener na podstawie obrazu, wystarczy wskazać obraz do uruchomienia oraz jego nazwę lub identyfikator. Kontener uruchomiony w ten sposób zapewnia interaktywne środowisko.

Tutaj dodaj flagę -d, aby uruchomić w tle kontener zawierający naszą witrynę internetową.

docker run -d tmp-ubuntu

W tym przypadku to polecenie zwraca tylko identyfikator nowego kontenera.

Po określeniu obrazu do uruchomienia platforma Docker znajduje obraz, ładuje kontener z obrazu i wykonuje polecenie określone jako punkt wejścia. W tym momencie kontener jest dostępny do zarządzania.

Jak wstrzymać kontener

Aby wstrzymać kontener, uruchom polecenie docker pause. Oto przykład:

docker pause happy_wilbur

Wstrzymywanie kontenera zawiesza wszystkie procesy. Dzięki temu poleceniu procesy kontenera będą mogły kontynuować działanie na późniejszym etapie. Polecenie docker unpause usuwa wszystkie procesy w określonych kontenerach.

Jak ponownie uruchomić kontener

Aby uruchomić ponownie kontenery, uruchom polecenie docker restart. Oto przykład:

docker restart happy_wilbur

Kontener otrzymuje polecenie zatrzymania, a następnie polecenie uruchamiania. Jeśli kontener nie odpowiada na polecenie zatrzymania, wysyłany jest sygnał zabicia.

Jak zatrzymać kontener

Aby zatrzymać działający kontener, uruchom polecenie docker stop. Oto przykład:

docker stop happy_wilbur

Polecenie stop wysyła sygnał zakończenia do kontenera i procesy uruchomione w kontenerze.

Jak usunąć kontener

Aby usunąć kontener, uruchom polecenie docker rm. Oto przykład:

docker rm happy_wilbur

Po usunięciu kontenera wszystkie dane w kontenerze zostaną zniszczone. W kwestii przechowywania danych ważne jest, aby zawsze traktować kontenery jako obiekty tymczasowe.

Konfiguracja magazynu kontenerów platformy Docker

Jak opisano wcześniej, zawsze należy traktować kontenery jako tymczasowe, gdy aplikacja w kontenerze musi przechowywać dane.

Załóżmy, że portal śledzenia tworzy plik dziennika w podfolderze do katalogu głównego aplikacji; oznacza to, że bezpośrednio do systemu plików kontenera. Gdy aplikacja zapisuje dane w pliku dziennika, system zapisuje dane w zapisywalnej warstwie kontenera.

Mimo że to podejście działa, niestety ma kilka wad.

  • Magazyn kontenerów jest tymczasowy.

    Plik dziennika nie zostanie utrwalony między wystąpieniami kontenera. Przyjmijmy na przykład, że zatrzymasz i usuniesz kontener. Po uruchomieniu nowego wystąpienia kontenera nowe wystąpienie opiera się na określonym obrazie, a wszystkie poprzednie dane będą brakujące. Jak pamiętasz, wszystkie dane znajdujące się w kontenerze są niszczone razem z nim po jego usunięciu.

  • Magazyn kontenerów jest powiązany z podstawową maszyną hosta.

    Uzyskiwanie dostępu do pliku dziennika z kontenera lub przenoszenie go z kontenera jest trudne, ponieważ kontener jest powiązany z podstawową maszyną hosta. Aby uzyskać dostęp do pliku, musisz nawiązać połączenie z wystąpieniem kontenera.

  • Dyski magazynu kontenerów są mniej wydajne.

    Kontenery implementują sterownik magazynu, dzięki czemu aplikacje mogą zapisywać dane. Ten sterownik wprowadza dodatkową abstrakcję do komunikowania się z jądrem systemu operacyjnego hosta i jest mniej wydajny niż zapisywanie bezpośrednio w systemie plików hosta.

Istnieją dwie opcje utrwalania danych przez kontenery. Pierwsza opcja polega na wykorzystaniu woluminów, a druga instalacji powiązanych.

Co to jest wolumin?

Wolumin jest przechowywany w systemie plików hosta w określonej lokalizacji folderu. Wybierz folder, w którym wiadomo, że dane nie zostaną zmodyfikowane przez procesy spoza platformy Docker.

Platforma Docker tworzy nowy wolumin i zarządza nim za pomocą polecenia docker volume create. To polecenie może stanowić część naszej definicji pliku Dockerfile, co oznacza, że można tworzyć woluminy w ramach procesu tworzenia kontenera. Platforma Docker tworzy wolumin, jeśli nie istnieje podczas próby zainstalowania woluminu w kontenerze po raz pierwszy.

Woluminy są przechowywane w katalogach w systemie plików hosta. Platforma Docker instaluje woluminy w kontenerze i zarządza nimi. Po zainstalowaniu te woluminy są izolowane od maszyny hosta.

Wiele kontenerów może jednocześnie korzystać z tych samych woluminów. Woluminy nie są automatycznie usuwane, gdy kontener przestaje ich używać.

W tym przykładzie można utworzyć katalog na hoście kontenera i zainstalować ten wolumin w kontenerze podczas tworzenia kontenera tracking-portal. Kiedy portal śledzenia rejestruje dane, możesz uzyskać dostęp do tych informacji za pośrednictwem systemu plików hosta kontenera. Będziesz mieć dostęp do tego pliku dziennika nawet wtedy, gdy kontener zostanie usunięty.

Platforma Docker umożliwia również firmom innych firm tworzenie dodatków do użycia jako woluminy. Na przykład usługa Azure Storage udostępnia wtyczkę do instalowania usługi Azure Storage jako woluminów w kontenerach platformy Docker.

Co to jest instalacja powiązana?

Instalacja powiązania jest koncepcyjnie taka sama jak wolumin; Jednak zamiast używać określonego folderu, można zainstalować dowolny plik lub folder na hoście. Oczekujesz również, że host może zmienić zawartość tych instalacji. Podobnie jak woluminy, instalacja powiązania jest tworzona, jeśli ją zainstalujesz i jeszcze nie istnieje na hoście.

Instalacje powiązane mają ograniczoną funkcjonalność w porównaniu z woluminami i mimo że są bardziej wydajne, są zależne od hosta mającego określoną strukturę folderów.

Woluminy są uważane za preferowaną strategię przechowywania danych do użycia z kontenerami.

W przypadku kontenerów systemu Windows dostępna jest inna opcja: możesz zainstalować ścieżkę SMB jako wolumin i przedstawić ją kontenerom. Dzięki temu kontenery na różnych hostach mogą używać tego samego magazynu trwałego.

Konfiguracja sieci kontenera platformy Docker

Domyślna konfiguracja sieci platformy Docker umożliwia izolowanie kontenerów na hoście platformy Docker. Ta funkcja umożliwia tworzenie i konfigurowanie aplikacji, które mogą bezpiecznie komunikować się ze sobą.

Platforma Docker udostępnia różne ustawienia sieciowe dla systemów Linux i Windows.

W przypadku systemu Linux istnieje sześć wstępnie skonfigurowanych opcji sieci:

  • Mostek
  • Gospodarz
  • Nakładka
  • IPvLan
  • MACvLan
  • Brak

W przypadku systemu Windows istnieje sześć wstępnie skonfigurowanych opcji sieci:

  • Translator adresów sieciowych (translacja adresów sieciowych)
  • Transparent
  • Nakładka
  • L2Bridge
  • L2Tunnel
  • Brak

W zależności od wymagań sieciowych można wybrać konfiguracje sieci, które mają być stosowane do kontenera.

Co to jest sieć mostka?

Sieć mostka jest domyślną konfiguracją zastosowaną do kontenerów podczas uruchamiania bez określania innej konfiguracji sieci. Ta sieć jest wewnętrzną, prywatną siecią używaną przez kontener i izoluje sieć kontenerów od sieci hosta platformy Docker.

Każdy kontener w sieci mostka ma przypisany adres IP i maskę podsieci z nazwą hosta domyślną nazwą kontenera. Kontenery połączone z domyślną siecią mostka mogą uzyskiwać dostęp do innych kontenerów połączonych mostem za pomocą adresu IP. Sieć mostka nie zezwala na komunikację między kontenerami przy użyciu nazw hostów.

Domyślnie platforma Docker nie publikuje żadnych portów kontenerów. Aby włączyć mapowanie portów między kontenerem i hostem platformy Docker, użyj polecenia port z flagą --publish.

Ta flaga publikowania efektywnie konfiguruje regułę zapory, która mapuje porty.

W tym przykładzie portal śledzenia jest dostępny dla klientów za pośrednictwem portu 80. Będzie konieczne zamapowanie portu 80 z kontenera do dostępnego portu na hoście. Na hoście jest otwarty port 8080, który umożliwia ustawienie flagi w następujący sposób:

--publish 8080:80

Każdy klient przechodzący do adresu IP hosta platformy Docker i portu 8080 może uzyskać dostęp do portalu śledzenia.

Oprócz konfiguracji specyficznych dla systemu Linux sieć TRANSLATOR adresów sieciowych w systemie Windows działa tak samo jak sieć mostka. Ponadto translator adresów sieciowych jest siecią domyślną w systemie Windows, a wszystkie kontenery będą się z nią łączyć, chyba że określono inaczej.

Co to jest sieć hosta?

Sieć hosta umożliwia uruchamianie kontenera bezpośrednio w sieci hosta. Ta konfiguracja skutecznie usuwa izolację między hostem i kontenerem na poziomie sieci.

W tym przykładzie przyjmijmy, że chcesz zmienić konfigurację sieci na opcję sieci hosta. Portal śledzenia jest nadal dostępny przy użyciu adresu IP hosta. Teraz możesz użyć dobrze znanego portu 80 zamiast zamapowanego portu.

Należy pamiętać, że kontener może używać tylko portów, których host jeszcze nie używa.

W systemie Windows sieć hosta jest niedostępna. Na hostach z systemem Windows nie ma możliwości współużytkowania tego samego adresu IP (stosu sieciowego) między hostem a kontenerem. Sieć TRANSLATOR adresów sieciowych działa podobnie jak sieć mostka, a opcja Nakładka udostępnia adres IP kontenerowi z tej samej sieci co host, ale nie ten sam adres IP.

Nakładka i inne opcje sieciowe

W przypadku bardziej zaawansowanych scenariuszy systemy Linux i Windows udostępniają dodatkowe opcje sieciowe. Na przykład opcja nakładki tworzy przełącznik wirtualny z sieci hosta, więc kontenery w tej sieci mogą pobierać adresy IP z serwerów DHCP lub działać z adresami IP z tego segmentu sieci. Ponadto platforma Docker umożliwia dostawcom innych firm tworzenie wtyczek sieciowych.

Co to jest sieć „brak”?

Aby wyłączyć sieć dla kontenerów, użyj opcji brak sieci. Może to być przydatne, jeśli masz aplikację, która nie korzysta z sieci, lub jeśli chcesz tylko zweryfikować, czy aplikacja działa zgodnie z oczekiwaniami w kontenerze.

Zagadnienia dotyczące systemu operacyjnego

Należy pamiętać, że istnieją różnice między systemami operacyjnymi pulpitu dla opcji konfiguracji sieci platformy Docker. Na przykład interfejs sieciowy platformy Docker0 nie jest dostępny w systemie macOS w przypadku korzystania z sieci mostka, a konfiguracja sieci hosta nie jest obsługiwana zarówno dla komputerów stacjonarnych z systemem Windows, jak i macOS.

Te różnice mogą mieć wpływ na to, jak deweloperzy konfigurują swój przepływ pracy w procesie zarządzania programowaniem kontenerów. Ponadto orkiestratory kontenerów mogą również udostępniać inne konfiguracje sieci na podstawie konfiguracji platformy Docker.

Sprawdź swoją wiedzę

1.

Kontener jest uruchamiany przy użyciu flagi --publish 8080:80. Która z poniższych opcji jest najbardziej prawdopodobną konfiguracją sieci używaną dla kontenera?

2.

Która opcja magazynu jest najlepszym wyborem, który umożliwia hostowi i kontenerowi współużytkowanie pliku w celu zarządzania rozpoznawaniem serwera nazw; na przykład plik resolve.conf w systemie Linux?