Dlaczego kontenery są ważne?
- 7 min
W tej lekcji będziesz śledzić zespół Tailspin, gdy omawia kilka bardzo potrzebnych ulepszeń swojego procesu DevOps. W tym scenariuszu zespół używa platformy Docker do konteneryzowania aplikacji internetowej. Następnie zespół aktualizuje pipeline CI/CD, aby go wspierać.
To było szorstkie kilka tygodni
Ostatnie kilka tygodni było trudnym czasem w Tailspin. Zespoły walczą o spełnienie terminów ostatecznych z wielu powodów i pojawiły się obawy dotyczące produktywności w całej firmie. Andy wezwał kilku kluczowych interesariuszy zespołu witryny Space Game, aby zebrać opinie na temat nadchodzącej prezentacji dla kierownictwa.
Andy: Dzięki, że wpadłeś(-aś). Wiem, że ostatnie kilka tygodni były szorstkie dla wszystkich, ale mam kilka dobrych wiadomości. Kierownictwo organizuje jutro spotkanie wyjazdowe, aby wysłuchać propozycji dotyczących zmian, które możemy wprowadzić w celu poprawy wydajności. Zaprosili mnie do przedstawienia analizy przypadku na temat naszych sukcesów DevOps i powiedzieli, że są one również otwarte na wszelkie inne pomysły, które możemy mieć. Miałem nadzieję, że uda nam się wykorzystać to spotkanie jako okazję do burzy mózgów. Kto chce iść najpierw?
Wszyscy patrzą na Amitę. Ostatnio była szczególnie sfrustrowana.
Amita: Pójdę najpierw. Jak wiesz, testuję dla wielu zespołów i może to być trudne, ponieważ każdy zespół używa własnego stosu technologicznego. Nawet jeśli korzystają z tych samych technologicznych podstaw, takich jak .NET lub Java, często są skierowane na różne wersje. Czuję się, jakbym czasami spędzał połowę mojego dnia po prostu doprowadzając środowiska testowe do stanu, w którym mogą uruchomić potrzebny kod testowy. Jeśli coś nie działa, trudno stwierdzić, czy w kodzie występuje usterka, czy przypadkowo skonfigurowano wersję 4.2.3 zamiast 4.3.2.
Andy pisze "Wyzwania wersjonowania zależności dla kontroli jakości" na tablicy.
Tim: Chciałbym podjąć działania wobec tej frustracji. Mamy kilka zespołów z unikatowymi wymaganiami dotyczącymi wersji, dlatego musimy publikować swoje aplikacje na własnych maszynach wirtualnych tylko w celu zapewnienia, że ich wymagania dotyczące wersji i składników nie powodują konfliktu z innymi aplikacjami. Poza nakładem pracy związanym z utrzymywaniem dodatkowego zestawu maszyn wirtualnych, ponosimy również większe koszty niż w przypadku, gdyby te aplikacje mogły działać równocześnie.
Andy pisze na tablicy "Overhead wynikający z rozwiązywania izolacji aplikacji za pomocą maszyn wirtualnych".
Mara: Mam coś z działu rozwoju. Kilka tygodni temu pracowałem nad systemem aktualizacji peer-to-peer i wszystko działało na mojej maszynie, ale kiedy przekazałem do wdrożenia, nie działało w środowisku produkcyjnym. Zapomniałem, że muszę otworzyć port 315 w ramach usługi. Zajęło nam to ponad dzień rozwiązywania problemów, aby uświadomić sobie, co się dzieje. Gdy otworzyliśmy to w środowisku produkcyjnym, wszystko działało zgodnie z oczekiwaniami.
Andy pisze na tablicy "Niespójności konfiguracji między etapami wdrażania".
Andy: Myślę, że ta rozmowa jest dobrym początkiem. Pozwólcie mi zbadać te problemy i zobaczyć, co mogę wymyślić. Oto obawy, które usłyszałem:
- Wyzwania związane z wersjonowaniem zależności w kontroli jakości
- Obciążenie związane z rozwiązywaniem problemów z izolacją aplikacji za pomocą maszyn wirtualnych
- Niespójności konfiguracji między etapami wdrażania
Łączenie wszystkich elementów (w jednym kontenerze)
Następnego ranka Andy wzywa spotkanie, aby przedstawić zespołowi nowy pomysł.
Andy: Rozmawiałem z kilkoma kolegami wczoraj o wyzwaniach, przed którymi stoimy, i dokonali ciekawych sugestii. Nie mogę się doczekać, żeby wypróbować Docker. Jest to technologia pakowania całych aplikacji jako kontenerów.
Amita: Co to jest kontener? Czy to jest jak plik .zip ?
Andy: Nie dokładnie. Bardziej przypomina uproszczoną maszynę wirtualną przeznaczoną do uruchamiania bezpośrednio w systemie operacyjnym hosta. Podczas tworzenia projektu dane wyjściowe są kontenerem zawierającym oprogramowanie i jego zależności. Nie jest to jednak kompletny zwirtualizowany system, więc może on być uruchamiany w mniej niż jednej sekundzie.
Tim: Jak obsługuje zabezpieczenia i izolację?
Andy: Zabezpieczenia i izolacja są obsługiwane przez system operacyjny hosta. Gdy kontener jest uruchamiany w procesie systemu hosta, jest odizolowany od innych procesów na tym samym hoście. Ta izolacja umożliwia kontenerowi ładowanie dowolnych potrzebnych wersji składników, niezależnie od tego, co robią inne kontenery. Oznacza to również, że można łatwo uruchamiać wiele kontenerów na tym samym hoście jednocześnie.
Amita: To brzmi świetnie w środowisku produkcyjnym, ale czy rozwiązuje to wyzwania, z którymi się mierzymy wcześniej w łańcuchu?
Andy: Absolutnie! Zamiast wysyłać kod źródłowy lub zestaw plików binarnych, cały kontener staje się artefaktem. Oznacza to, że podczas tworzenia aplikacji Mara jej sesje debugowania są uruchamiane lokalnie względem kontenera hostowanego na jej maszynie. Podczas testów Amita testuje kopię tego samego kontenera, która zawiera już wszystkie wymagane wersje jego zależności. Gdy Tim zarządza naszym środowiskiem produkcyjnym, kontenery, które nadzoruje, są samodzielnymi kopiami tych samych kontenerów opracowanych przez Marę i testowanych przez Amitę.
Mara: Jak trudno jest opracować aplikację kontenera? Czy musimy wprowadzić znaczące zmiany w istniejącym kodzie?
Andy: Kontenery to bardziej technologia pakowania i wdrażania. Nie wpływają one na podstawowe oprogramowanie, które piszemy. Możemy po prostu poinstruować nasze narzędzia o utworzeniu kontenera platformy Docker na końcu kompilacji. Następnie, podczas debugowania, aplikacja działa z tego lokalnego kontenera zamiast z naszego lokalnego serwera webowego. W rzeczywistości narzędzia, takie jak Visual Studio, umożliwiają nawet przełączanie się między środowiskami debugowania, takimi jak Docker i IIS Express, aby zapewnić nam elastyczność, której potrzebujemy. Tak naprawdę zforkowałem nasz projekt strony internetowej ostatniej nocy i przekonwertowałem go, aby kompilował się jako kontener Dockera, aby przetestować proces. Muszę tylko dodać podstawową konfigurację kontenera; Nie musiałem zmieniać żadnego z naszych istniejących kodów.
Mara: Dobrze to wiedzieć. Założę się, że możemy nawet zaktualizować potok ciągłego dostarczania w usłudze Azure Pipelines z twojego rozwidlenia, aby zbudować i wdrożyć wersję Dockera.
Andy: Czytasz mój umysł.
Co to jest platforma Docker?
Docker to technologia służąca do automatycznego pakowania i wdrażania przenośnych, samowystarczalnych kontenerów. Kontenery platformy Docker mogą działać w dowolnym miejscu, w jakim znajduje się host platformy Docker, niezależnie od tego, czy znajduje się na komputerze deweloperskim, serwerze działu, centrum danych przedsiębiorstwa, czy w chmurze. Platforma Azure oferuje wiele sposobów uruchamiania aplikacji opartych na kontenerach, w tym usługi App Service lub w ramach klastrów zarządzanych za pomocą technologii aranżacji, takich jak Kubernetes.
Zespół Tailspin wybrał kontenery platformy Docker dla tego scenariusza, ponieważ spełnia wszystkie ich potrzeby:
Wyzwania związane z przechowywaniem wersji zależności dla kontroli jakości: aplikacje są pakowane jako kontenery, które zapewniają poprawne wersje ich zależności.
Obciążenie związane z rozwiązywaniem izolacji aplikacji z maszynami wirtualnymi: wiele izolowanych kontenerów może działać na tym samym hoście z korzyściami w porównaniu z maszynami wirtualnymi, w tym krótszy czas uruchamiania w celu zwiększenia wydajności zasobów.
Nieścisłości konfiguracji pomiędzy etapami DevOps: Kontenery są dostarczane z manifestami, które automatyzują wymagania dotyczące konfiguracji, takie jak porty, które muszą być otwarte.
Wdrażanie kontenerów platformy Docker może być kluczowym krokiem w kierunku architektury mikrousług. Omówimy więcej na ten temat w dalszej części.