Powrót do bloga

Jak hostować repozytorium obrazów Docker i budować obrazy Docker za pomocą GitLab Self-Managed Instance na Ubuntu 20.04

Jak hostować repozytorium obrazów Docker i budować obrazy Docker za pomocą GitLab Self-Managed Instance na Ubuntu 20.04

Technologia konteneryzacji poczyniła ogromne postępy w obszarze technologii tworzenia oprogramowania jako najbardziej akceptowana metoda pakowania i wdrażania aplikacji w środowiskach chmurowych. Stało się to konieczne ze względu na potrzebę ciągłej integracji (CI) i ciągłego wdrażania (CD), które są definiującymi aspektami DevOps. Programiści i inżynierowie oprogramowania korzystają z kontenerów, aby realizować aspekt CI/CD architektury oprogramowania. Kontener to w zasadzie w pełni spakowana, przenośna i niezależna platforma obliczeniowa. Choć w sieci dostępnych jest kilka platform kontenerowych, najpopularniejszą z nich jest Docker.

Docker to platforma kontenerowa o otwartym kodzie źródłowym, która sprawia, że programowanie jest wydajne i przewidywalne. Docker oferuje publiczne repozytorium obrazów Docker dostępne pod adresem Docker Hub. Zawiera ono wiele otwartoźródłowych obrazów Docker dla najpopularniejszych wdrożeń, które można pobrać i z nich korzystać. Ponieważ jest to repozytorium publiczne, możesz również bezpłatnie dodawać własne obrazy Docker, aby udostępniać je publicznie. Jeśli jednak posiadasz prywatny/własnościowy kod, być może będziesz musiał zapłacić za prywatne repozytorium obrazów lub zbudować własną usługę repozytorium obrazów. W tym miejscu do gry wkracza GitLab.

GitLab to internetowe repozytorium Git, które jest czymś więcej niż tylko narzędziem do kontroli wersji. Zapewnia narzędzia DevOps do ciągłej integracji i wdrażania, śledzenia problemów, rejestrów obrazów Docker i nie tylko. Oferuje trzy opcje: GitLab Community Edition (CE), GitLab Enterprise Edition (EE) oraz GitLab SaaS. GitLab CE i GitLab EE to rozwiązania zarządzane samodzielnie (self-managed), które pozwalają na samodzielne pobranie, instalację i zarządzanie instancją GitLab. GitLab SaaS jest hostowany przez GitLab Inc. i nie musisz się martwić o instalowanie czegokolwiek, aby z niego korzystać.

W poprzednim samouczku pokazaliśmy, jak skonfigurować instancję GitLab na serwerze CloudSigma i hostować własne repozytorium Git. Pokazaliśmy również, jak wdrożyć potoki ciągłej integracji (CI) za pomocą GitLab Runner, aby automatycznie budować i uruchamiać testy przy każdym nowym commicie. Jeśli nie zapoznałeś się ze wspomnianymi samouczkami, zrób to, ponieważ stanowią one podstawę tego samouczka.

W tym samouczku zademonstrujemy, jak zbudować prosty obraz Docker i hostować go na własnej instancji GitLab (niezależnie od tego, czy używasz wersji Community Edition, czy Enterprise Edition – kolejność kroków jest taka sama).

Wymagania wstępne

Aby móc wykonać każdy krok tego samouczka, upewnij się, że posiadasz GitLab CI runner oraz samodzielnie hostowany serwer GitLab , jak wyjaśniono poniżej.

1. Bezpieczny serwer GitLab

Użyjemy go do przechowywania kodu źródłowego, uruchamiania zadań CI/CD i hostowania rejestru obrazów Docker. Powinieneś posiadać serwer z co najmniej 2 rdzeniami procesora (CPU) i 4 GB pamięci RAM, zgodnie z zaleceniami GitLab dotyczącymi instalacji samodzielnie zarządzanej instancji GitLab. Będziesz także potrzebować zarejestrowanej nazwy domeny wskazującej na serwer, ponieważ użyjemy jej do uzyskania certyfikatu SSL od Let’s Encrypt w celu zabezpieczenia serwera. Poniżej znajduje się kilka linków, z których możesz skorzystać, aby skonfigurować samodzielnie hostowaną instancję GitLab.

2. GitLab CI runner

GitLab CI runner jest niezbędny do uruchamiania zautomatyzowanych zadań dla Twoich przypadków testowych. Samouczek dotyczący tego, jak skonfigurować potoki ciągłej integracji GitLab na Ubuntu 20.04 zawiera omówienie serwera GitLab CI i pokazuje, jak wyzwalać zadania. Wykonaj kroki opisane w samouczku, aby skonfigurować usługę GitLab CI runner, jeśli jeszcze tego nie zrobiłeś. Samouczek zawiera aplikację demonstracyjną Node.js z przypadkami testowymi – będziemy z niej korzystać w tym samouczku.

Zaczynajmy!

Krok 1: Konfiguracja uprzywilejowanego GitLab CI Runnera

W samouczku dotyczącym konfiguracji GitLab CI Runnera skonfigurowaliśmy runnera GitLab za pomocą polecenia sudo gitlab-runner register polecenie, które pozwoliło nam na interaktywne dodanie wymaganych parametrów. Chociaż działało to w naszym poprzednim przypadku użycia, którym było uruchamianie kompilacji i testów w odizolowanych kontenerach Docker, może nie poradzić sobie z budowaniem obrazów Docker. Budowanie obrazów Docker wymaga, aby runner miał pełny dostęp do usługi Docker. Możesz osiągnąć tę konfigurację, używając oficjalnego docker-in-docker obrazu do uruchamiania zadań. Taka konfiguracja wiąże się z przyznaniem runnerowi uprzywilejowanego trybu wykonywania.

Podczas gdy przyznanie uprzywilejowanego trybu wykonywania jest niezbędne do budowania obrazów Docker, wiąże się to z problemami z bezpieczeństwem. Wynika to z faktu, że wiąże się to z rezygnacją z zalet bezpieczeństwa kontenerów. Możesz myśleć, że inne runnery Dockera są bezpieczne, ale okazuje się, że mają one te same problemy, jak wyjaśniono w oficjalnej dokumentacji Dockera.

Utworzymy kolejny runner z uprzywilejowanym trybem wykonywania. Będzie to runner specyficzny dla projektu ze względu na wspomniane wyżej implikacje bezpieczeństwa. Będzie on akceptował zadania z projektu Node Pipeline utworzonego w samouczku dotyczącym jak skonfigurować ciągłe potoki CI z GitLab.

Pierwszą rzeczą, którą powinieneś zrobić, jest sprawdzenie, czy Shared Runners są wyłączone w projekcie. Na stronie projektu Node Pipeline kliknij Settings w lewym dolnym menu i wybierz CI/CD w podmenu:

Docker Image 1

Znajdź przycisk Expand w sekcji Runners i kliknij go, aby wyświetlić szczegóły dotyczące dostępnych runnerów:

runners

Kliknij przełącznik, aby wyłączyć Shared Runners dla tego projektu. Jeśli w poprzedniej sekcji dodałeś runner specyficzny dla projektu, również go wyłącz. Będziemy dodawać uprzywilejowany runner specyficzny dla projektu do uruchamiania zadań dla tego projektu. Gwarantuje to, że nie skończymy z błędami kompilacji w przypadku, gdy GitLab losowo przypisze zadania do runnerów, które nie zostały zarejestrowane z uprzywilejowanym trybem wykonywania. Na powyższym zrzucie ekranu, w zakładce Specific runners powinieneś zobaczyć token rejestracyjny swojego projektu. Zanotuj go, ponieważ użyjesz go poniżej.

Uwaga: Runner specyficzny dla projektu może być również przypisany do innych projektów z sekcji Admin panel > Runners. Po wybraniu runnera z listy przejdziesz do strony konfiguracji runnera. Przewiń w dół, aby wyświetlić sekcję Restrict projects for this runner:

assigned projects

Czas uruchomić terminal. Jeśli nie wykonałeś kroków z samouczka dotyczącego tego, jak skonfigurować potoki ciągłej integracji GitLab na Ubuntu 20.04, zrób przerwę w tym samouczku i wykonaj te kroki, aby mieć serwer z usługą runnera GitLab CI. W przeciwnym razie zaloguj się przez SSH na serwer runnera GitLab CI jako użytkownik sudo w celu wykonania kolejnych kroków.

Aby skonfigurować uprzywilejowany runner specyficzny dla projektu, wprowadź następujące polecenie w terminalu, zastępując swoją nazwę domeny i skopiowany powyżej token rejestracyjny:

Ten wynik pokazuje pomyślną rejestrację:

output

Aby zweryfikować, czy Twoja instancja GitLab wykryła runner, wróć do przeglądarki i odśwież stronę Settings > CI/CD. Rozwiń sekcję Runners i powinieneś zobaczyć swój runner w sekcji Specific Runners:

Docker Image 2

Opcjonalnie, jeśli przejdziesz do Admin Panel (klikając przycisk Menu na górnym pasku i wybierając Admin), a następnie wybierzesz Runners w opcjach menu:

admin

Powinieneś trafić na tę stronę pokazującą wszystkie dostępne runnery połączone z Twoją instancją GitLab, zarówno runnery współdzielone, jak i specyficzne dla projektu:

GitLab instance

Do tego momentu pomyślnie skonfigurowałeś runner, który może budować obrazy Docker.

Krok 2: Konfiguracja rejestru Docker GitLab

Niektóre kluczowe przepływy pracy wymagają niezależności od usług zewnętrznych. W tym miejscu z pomocą przychodzi samodzielnie zarządzany Docker Registry GitLaba. Jest on nie tylko bezpieczny, ale także zapewnia elastyczność dostosowywania zadań i potoków do własnych potrzeb. Aby skonfigurować Docker Registry, będziesz modyfikować plik konfiguracyjny GitLaba. Najpierw połącz się przez SSH z instancją GitLab, a następnie otwórz plik za pomocą następującego polecenia:

Przewiń w dół, aż zobaczysz Container Registry Settings:

Docker Image 3

Odkomentuj linię z registry_external_url i ustaw ją na nazwę domeny swojej instancji GitLab, określając port 8888 na końcu:

Następnie musimy określić, gdzie rejestr znajdzie certyfikaty Let’s Encrypt, dodając następujące linie. Pamiętaj, aby edytować je, wpisując rzeczywistą nazwę domeny swojej instancji GitLab:

Po zakończeniu zapisz i zamknij plik. Wprowadź następujące polecenie w terminalu, aby zrekonfigurować GitLab:

Następnie odczekaj kilka sekund na zakończenie wykonywania polecenia. W przypadku powodzenia powinieneś zobaczyć następujące dane wyjściowe:

gitlab reconfigured

Następnie musimy upewnić się, że zapora sieciowa (ufw) zezwala na ruch do przypisanego portu rejestru za pomocą polecenia:

Następnie musisz przetestować, czy Docker Registry działa, logując się do niego z innej maszyny z zainstalowanym Dockerem za pomocą polecenia docker login. Jeśli nie skonfigurowałeś Dockera w swoim lokalnym środowisku, możesz połączyć się przez SSH z serwerem GitLab CI runner, ponieważ ma on już zainstalowanego Dockera. Następnie wykonaj następujące polecenie, oczywiście podając nazwę domeny swojej instancji GitLab:

W danych wyjściowych pojawi się komunikat Login Succeeded, taki jak ten:

login succeeded

Oznacza to, że rejestr został pomyślnie skonfigurowany i działa. Podczas tworzenia obrazów będą one przechowywane lokalnie w systemie plików serwera GitLab. Jest to wystarczające w przypadku prywatnego rejestru firmowego. Jeśli jednak planujesz udostępnić swój rejestr publicznie, możesz potrzebować większej przestrzeni dyskowej. Na szczęście GitLab oferuje opcje łączenia się z kontenerami pamięci masowej (storage buckets). Więcej informacji znajdziesz w oficjalnej GitLab container registry docs, aby dowiedzieć się, jak skonfigurować kontener pamięci masowej dla swojej instancji GitLab.

Krok 3: Zmodyfikuj plik gitlab-ci.yml i zbuduj obraz Dockera

Aby przejść do tego kroku, powinieneś mieć projekt Node Pipeline w swojej instancji GitLab. Oto widok projektu w GitLabie:

Node Pipeline

Wspominaliśmy o gitlab-ci.yml jako o pliku, który GitLab CI runner odczytuje po uruchomieniu, aby dowiedzieć się, jak zbudować aplikację i przeprowadzić automatyczne testy. Musimy zmodyfikować ten plik, aby dodać instrukcje dotyczące budowania obrazów Dockera. Możesz edytować ten plik bezpośrednio w interfejsie GitLab. Możesz go również sklonować na swoją lokalną maszynę i edytować w swoim ulubionym edytorze, a następnie wykonać zatwierdzenie (commit) i przesłać (git push) z powrotem do GitLab. Dla uproszczenia użyjemy instancji GitLab.

Kliknij plik, aby go otworzyć, a następnie kliknij przycisk Edytuj :

Edit

Spowoduje to otwarcie pliku gotowego do edycji. Usuń wszystko z pliku i dodaj następujący kod:

Podczas dodawania powyższego fragmentu kodu pamiętaj o zaktualizowaniu wyróżnionej części swoimi rzeczywistymi danymi. Po zakończeniu zapisz zmiany, naciskając przycisk Commit changes. Jeśli pracowałeś poza GitLabem, zatwierdź i wypchnij swoje zmiany.

Zrozummy, co robi kod, który dodaliśmy do pliku .gitlab-ci.yml. Pierwsza linia mówi GitLabowi, aby użył oficjalnego Docker-in-Docker image i dołącza go do usługi docker-in-docker (docker:dind). Następnie definiujemy etapy dla build, test, oraz release. Etap build buduje obraz, korzystając z instrukcji w pliku Dockerfile a następnie przesyła go do Docker Registry, który skonfigurowaliśmy w poprzednim kroku.

Gdy etap build zakończy się pomyślnie, etap test pobiera obraz, uruchamia go jako kontener i wykonuje polecenie npm test, aby przeprowadzić w nim automatyczne testy. Jeśli etap test zakończy się pomyślnie, kontrolę przejmuje etap release. W etapie release obraz jest pobierany i oznaczany tagiem node_pipeline:latest. Następnie jest on ponownie przesyłany do rejestru.

To jest tylko podstawowa konfiguracja dla projektu demonstracyjnego. W rzeczywistych projektach możesz mieć inne etapy, na przykład staging, production, itp. Po zapisaniu pliku po edycji uruchamiany jest potok (pipeline). Następnie rozpoczyna się uruchamianie zadań. Wróć do strony Node Pipeline. Powinieneś zobaczyć, że zadanie jest obecnie uruchomione:

staging

Kliknij ikonę wskaźnika CI, aby wyświetlić różne etapy zadania:

Docker Image 7

Jak widać na powyższym zrzucie ekranu, wszystkie etapy zakończyły się pomyślnie, co potwierdzają zielone ikony wyboru. Możesz kliknąć każdy etap, aby wyświetlić dane wyjściowe zadania:

Docker Image 6

W menu po lewej stronie kliknij Packages & Registries i wybierz Container Registry:

Docker Image 5

Spowoduje to wyświetlenie strony z listą dostępnych obrazów Docker dla wybranego projektu. Obraz, który zbudowaliśmy i wydaliśmy, powinien pojawić się na liście z tagiem przypisanym:

container registryKliknij, aby wyświetlić różne tagi dla obrazu:

Docker Image 4

Jeśli masz zainstalowanego Dockera w swoim lokalnym środowisku, możesz pobrać obraz i przetestować, czy działa zgodnie z oczekiwaniami. Kliknij ikonę Copy obok nazwy tagu obrazu. Spowoduje to skopiowanie do schowka pełnej nazwy obrazu, której można użyć z poleceniem docker pull:

Powyższe polecenia pobiorą obraz i uruchomią go wewnątrz kontenera:

pull the image and run

Aplikacja jest teraz udostępniana na porcie 8090. Jeśli otworzysz przeglądarkę i przejdziesz pod adres twój-adres-IP:8090 powinna wyświetlić się strona:

hello, world

Jeśli widzisz taką stronę w swojej przeglądarce, oznacza to, że pomyślnie zbudowałeś obraz Docker i udostępniłeś go w prywatnym Docker Registry. W przyszłości, jeśli wprowadzisz jakiekolwiek zmiany w gałęzi master, etapy zdefiniowane w pliku .gitlab-ci.yml zostaną uruchomione, a jeśli zakończą się sukcesem, nowy obraz Docker z tagiem latest zostanie ponownie zbudowany i przesłany do rejestru.

Podsumowanie

W tym projekcie dowiedziałeś się, jak dodać uprzywilejowany runner GitLab do swojej własnej instancji GitLab (self-managed), aby móc budować obrazy Docker. Skonfigurowałeś również prywatny rejestr obrazów Docker do hostowania swoich obrazów. Używając projektu Node pipeline, byłeś w stanie przetestować każdy komponent konfiguracji i upewnić się, że łączą się i komunikują zgodnie z oczekiwaniami. Gdy Twój obraz był już dostępny w rejestrze, mogłeś go pobrać i potwierdzić, że działa wewnątrz kontenera.

To jest samouczek wprowadzający, dający podstawy do dalszego rozwoju. Postępuj zgodnie z oficjalną dokumentacją GitLab, aby dowiedzieć się więcej o GitLab. Ten link może dostarczyć informacji o GitLab Container Registry.

Aby uzyskać więcej zasobów na temat korzystania z Dockera, możesz zapoznać się z innymi samouczkami na naszym blogu:

Udanego kodowania!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev jest projektantem kreatywnym w CloudSigma, skupiającym się na spójnej tożsamości biznesowej przy wykorzystaniu tradycyjnych i innowacyjnych kanałów marketingowych. Biegle łączy wizję artystyczną ze strategicznym marketingiem, tworząc wywierające wpływ narracje marki.

Komentarze

Brak komentarzy. Bądź pierwszy.