Zpět na blog

Jak hostovat repozitář Docker obrazů a sestavovat Docker obrazy pomocí GitLab Self-Managed instance na Ubuntu 20.04

Jak hostovat repozitář Docker obrazů a sestavovat Docker obrazy pomocí GitLab Self-Managed instance na Ubuntu 20.04

Technologie kontejnerizace zaznamenala v technologickém prostoru vývoje softwaru obrovský pokrok jako nejuznávanější metoda balení a nasazování aplikací v cloudových prostředích. To si vyžádala potřeba průběžné integrace (CI) a průběžného nasazování (CD), což jsou definující aspekty DevOps. Vývojáři softwaru a inženýři využívají kontejnery k dosažení aspektu CI/CD v softwarové architektuře. Kontejner je v podstatě plně zabalená, přenosná a samostatná výpočetní platforma. I když na webu existuje několik kontejnerových platforem, Docker je tou nejběžnější.

Docker je open-source kontejnerová platforma, která činí vývoj efektivním a předvídatelným. Docker nabízí veřejný repozitář Docker obrazů dostupný na Docker Hub. Obsahuje mnoho open-source Docker obrazů pro nejběžnější implementace, které si můžete stáhnout a použít. Vzhledem k tomu, že se jedná o veřejný repozitář, můžete také zdarma přidávat své vlastní Docker obrazy a sdílet je s veřejností. Pokud však máte soukromý/vlastnický kód, možná budete muset platit za soukromý repozitář obrazů nebo si vytvořit vlastní službu repozitáře obrazů. A zde přichází na řadu GitLab.

GitLab je webový Git repozitář, který je víc než jen nástroj pro správu verzí. Poskytuje DevOps nástroje pro průběžnou integraci a nasazování, sledování problémů (issue-tracking), registry Docker obrazů a další. Nabízí tři možnosti: GitLab Community Edition (CE), GitLab Enterprise Edition (EE) a GitLab SaaS. GitLab CE and GitLab EE jsou samostatně spravovaná řešení, která vám umožňují stáhnout, nainstalovat a spravovat instanci GitLabu sami. GitLab SaaS je hostován společností GitLab Inc. a pro jeho používání se nemusíte starat o instalaci ničeho.

V předchozím návodu jsme vám ukázali, jak nastavit instanci GitLabu na serveru CloudSigma a hostovat svůj vlastní Git repozitář. Také jsme vám ukázali, jak implementovat pipeline pro průběžnou integraci s GitLab runnerem, aby se automaticky sestavovaly a spouštěly vaše testy, kdykoli dojde k novému commitu. Pokud jste si zmíněné návody neprošli, učiňte tak, protože jsou stavebními kameny pro tento návod.

V tomto návodu si ukážeme, jak sestavit jednoduchý Docker obraz a hostovat jej na vlastní instanci GitLabu (ať už používáte Community Edition nebo Enterprise Edition – postup kroků je stejný).

Požadavky

Chcete-li postupovat podle všech kroků v tomto návodu, ujistěte se, že máte GitLab CI runner a vlastní GitLab server, jak je vysvětleno níže.

1. Zabezpečený GitLab server

Ten použijeme k ukládání zdrojového kódu, spouštění úloh CI/CD a hostování registru Docker obrazů. Měli byste mít server s alespoň 2 CPU jádry a 4GB operační paměti RAM, jak doporučuje GitLab pro instalaci samostatně spravované instance GitLabu. Budete také potřebovat registrovanou doménu nasměrovanou na server, protože ji použijeme k získání SSL certifikátu od Let’s Encrypt pro zabezpečení serveru. Níže naleznete několik odkazů, podle kterých můžete nastavit vlastní instanci GitLabu.

2. GitLab CI runner

GitLab CI runner je nezbytný pro spouštění automatizovaných úloh nad vašimi testovacími případy. Návod na jak nastavit pipeline pro průběžnou integraci GitLabu na Ubuntu 20.04 vám poskytne přehled o GitLab CI serveru a ukáže vám, jak spouštět úlohy. Pokud jste tak ještě neučinili, postupujte podle kroků v návodu a nastavte službu GitLab CI runner. Návod obsahuje ukázkovou aplikaci v Node.js s testovacími případy – v tomto návodu ji budeme používat.

Nyní začněme!

Krok 1: Konfigurace privilegovaného GitLab CI runneru

V návodu, jak nastavit GitLab CI Runner, jsme nakonfigurovali GitLab runner pomocí sudo gitlab-runner register příkaz, který nám umožnil interaktivně přidat požadované parametry. I když to fungovalo pro náš předchozí případ použití, což bylo spouštění sestavení a testů v izolovaných kontejnerech Docker, nemusí to zvládnout sestavování obrazů Docker. Sestavování obrazů Docker vyžaduje, aby měl runner plný přístup ke službě Docker. Této konfigurace můžete dosáhnout použitím oficiálního docker-in-docker obrazu pro spouštění úloh. Taková konfigurace zahrnuje udělení runneru privilegovaného režimu spuštění.

Zatímco udělení privilegovaného režimu spuštění je nezbytné pro sestavování obrazů Docker, přináší to s sebou bezpečnostní rizika. Je to proto, že to zahrnuje odstranění bezpečnostních výhod kontejnerů. Možná si myslíte, že ostatní runnery Docker jsou bezpečné, ale mají stejné problémy, jak je vysvětleno v oficiální dokumentaci Dockeru.

Vytvoříme další runner s privilegovaným režimem spuštění. Půjde o runner specifický pro projekt kvůli výše zmíněným bezpečnostním důsledkům. Bude přijímat úlohy z projektu Node Pipeline který jsme vytvořili v návodu na jak nastavit kontinuální CI pipelines s GitLabem.

První věc, kterou byste měli udělat, je zkontrolovat, zda jsou Shared Runners zakázány pro tento projekt. Na stránce projektu Node Pipeline klikněte na Settings v nabídce vlevo dole a vyberte CI/CD v podnabídce:

Docker Image 1

Najděte tlačítko Expand v sekci Runners a kliknutím na něj zobrazte podrobnosti o dostupných runnerech:

runners

Kliknutím na přepínač Disable Shared Runners pro tento projekt jej zakážete. Pokud jste v předchozí části přidali runner specifický pro projekt, zakažte jej také. Pro spouštění úloh pro tento projekt budeme přidávat privilegovaný runner specifický pro projekt. To zaručuje, že neskončíme s chybami sestavení v případě, že GitLab náhodně přiřadí úlohy runnerům, které nebyly registrovány s privilegovaným režimem spuštění. Na snímku obrazovky výše, pod záložkou Specific runners, byste měli vidět registrační token vašeho projektu. Poznamenejte si jej, protože jej použijete níže.

Poznámka: Runner specifický pro projekt lze také přiřadit k jiným projektům ze sekce Admin panel > Runners section. Když vyberete runner ze seznamu runnerů, dostanete se na stránku konfigurace runneru. Přejděte dolů na sekci Restrict projects for this runner:

assigned projects

Je čas spustit terminál. Pokud jste neprovedli kroky v návodu na jak nastavit GitLab Continuous Integration Pipelines na Ubuntu 20.04, dejte si od tohoto návodu pauzu a postupujte podle těchto kroků, abyste měli server se službou runneru GitLab CI. V opačném případě se připojte pomocí SSH k serveru s runnerem GitLab CI s vaším sudo uživatelem pro další kroky.

Chcete-li nastavit privilegovaný runner specifický pro projekt, zadejte do terminálu následující příkaz a nahraďte svůj název domény a registrační token zkopírovaný výše:

Tento výstup ukazuje úspěšnou registraci:

output

Chcete-li ověřit, že vaše instance GitLabu runner rozpoznala, vraťte se do prohlížeče a obnovte stránku Settings > CI/CD. Rozbalte sekci Runners a měli byste vidět svůj runner pod Specific Runners:

Docker Image 2

Volitelně, pokud přejdete do Admin Panel (kliknutím na tlačítko Menu v horní liště a výběrem Admin), poté vyberte Runners v možnostech nabídky:

admin

Měli byste se dostat na tuto stránku zobrazující všechny dostupné runnery připojené k vaší instanci GitLabu, jak sdílené, tak runnery specifické pro projekt:

GitLab instance

Do tohoto okamžiku jste úspěšně nastavili runner, který dokáže sestavovat obrazy Docker.

Krok 2: Konfigurace Docker registru v GitLabu

Některé klíčové pracovní postupy vyžadují nezávislost na externích službách. A právě zde přichází na řadu self-managed verze GitLabu Docker Registry. Je nejen bezpečný, ale také zajišťuje flexibilitu pro přizpůsobení vašich úloh a pipeline podle vašich potřeb. Chcete-li nastavit Docker Registry, budete upravovat konfigurační soubor GitLabu. Nejprve se připojte přes SSH k instanci GitLabu a poté otevřete soubor pomocí následujícího příkazu:

Sjeďte dolů, dokud neuvidíte Container Registry Settings:

Docker Image 3

Odkomentujte řádek s registry_external_url a nastavte jej na doménové jméno vaší instance GitLabu, přičemž na konci uveďte port 8888 na konci:

Dále musíme přidáním následujících řádků určit, kde registr najde certifikáty Let’s Encrypt. Nezapomeňte je upravit podle skutečného doménového jména vaší instance GitLabu:

Jakmile budete hotovi, soubor uložte a zavřete. Pro rekonfiguraci GitLabu zadejte do terminálu následující příkaz:

Poté počkejte několik sekund, než se příkaz dokončí. V případě úspěchu byste měli vidět následující výstup:

gitlab reconfigured

Dále musíme zajistit, aby firewall (ufw) povoloval provoz na portu registru, který jsme přiřadili, a to pomocí příkazu:

Poté musíte otestovat, zda Docker Registry běží, a to tak, že se k němu přihlásíte z jiného počítače s nainstalovaným Dockerem pomocí příkazu docker login. Pokud jste Docker ve svém lokálním prostředí nenastavili, můžete se připojit přes SSH k serveru GitLab CI runneru, protože ten již má Docker nainstalovaný. Poté spusťte následující příkaz, přičemž samozřejmě uveďte doménové jméno vaší instance GitLabu:

Ve výstupu se zobrazí zpráva Login Succeeded takto:

login succeeded

To znamená, že registr byl úspěšně nakonfigurován a funguje. Když vytvoříte obrazy, budou uloženy lokálně v souborovém systému serveru GitLab. To je v pořádku pro soukromý firemní registr. Pokud však plánujete nechat svůj registr přístupný veřejnosti, možná budete potřebovat větší úložiště. GitLab naštěstí nabízí možnosti připojení k úložným bucketům. Více se dozvíte v oficiální GitLab container registry docs, kde se dozvíte, jak nakonfigurovat úložný bucket pro vaši instanci GitLabu.

Krok 3: Upravte soubor gitlab-ci.yml a sestavte Docker obraz

Chcete-li pokračovat v tomto kroku, měli byste mít na své instanci GitLabu projekt Node Pipeline. Zde je pohled na tento projekt v GitLabu:

Node Pipeline

O souboru gitlab-ci.yml jsme mluvili jako o souboru, který GitLab CI runner čte při spuštění, aby věděl, jak sestavit vaši aplikaci a provést automatizované testy. Tento soubor musíme upravit a přidat do něj instrukce pro sestavení Docker obrazů. Tento soubor se můžete rozhodnout upravit přímo v rozhraní GitLabu. Můžete jej také naklonovat do svého lokálního počítače, upravit ve svém oblíbeném editoru a poté provést commit a git push zpět do GitLabu. Pro stručnost použijeme rozhraní GitLabu.

Kliknutím na soubor jej otevřete a poté klikněte na tlačítko Upravit tlačítko:

Edit

Tím se otevře soubor připravený k úpravám. Smažte ze souboru vše a přidejte následující kód:

Během přidávání výše uvedeného fragmentu kódu nezapomeňte aktualizovat zvýrazněnou část o vaše skutečné údaje. Jakmile budete hotovi, uložte změny stisknutím tlačítka Commit changes. Pokud jste pracovali mimo GitLab, proveďte commit a push svých změn.

Pojďme si vysvětlit, co dělá kód, který jsme přidali do souboru .gitlab-ci.yml. První řádek říká GitLabu, aby použil oficiální obraz Docker-in-Docker a připojil jej ke službě docker-in-docker (docker:dind). Poté definujeme fáze pro build, test a release. Fáze build sestaví image pomocí instrukcí v souboru Dockerfile a poté jej nahraje do Docker Registry, který jsme nastavili v předchozím kroku.

Jakmile je fáze build úspěšná, fáze test stáhne image, spustí jej jako kontejner a provede příkaz npm test pro spuštění automatizovaných testů uvnitř kontejneru. Pokud fáze test uspěje, přebírá řízení fáze release. Ve fázi release je image stažen a označen tagem node_pipeline:latest. Poté je odeslán zpět do registru.

Toto je pouze základní konfigurace pro ukázkový projekt. Pro vaše reálné projekty můžete mít další fáze, například staging, production atd. Když soubor po úpravách uložíte, spustí se pipeline. Ta následně začne spouštět jednotlivé úlohy. Vraťte se na stránku Node Pipeline. Měli byste vidět, že úloha aktuálně běží:

staging

Klikněte na ikonu indikátoru CI, abyste si zobrazili různé fáze úlohy:

Docker Image 7

Jak můžete vidět na snímku obrazovky výše, všechny fáze byly úspěšné, což indikují zelené ikony zaškrtnutí. Kliknutím na každou fázi si můžete zobrazit výstup dané úlohy:

Docker Image 6

V levém menu klikněte na Packages & Registries a vyberte Container Registry:

Docker Image 5

Tím se otevře stránka se seznamem dostupných Docker imagů pro vybraný projekt. Image, který jsme sestavili a vydali, by se měl objevit v seznamu s přiřazeným tagem přiřazeným:

container registryKliknutím zobrazíte různé tagy pro tento image:

Docker Image 4

Pokud máte Docker nainstalovaný ve svém lokálním prostředí, můžete image stáhnout a otestovat, zda běží podle očekávání. Klikněte na ikonu Kopírovat vedle názvu tagu image. Do schránky se zkopíruje celý název image, který můžete použít s docker pull příkazem:

Výše uvedené příkazy stáhnou image a spustí jej uvnitř kontejneru:

pull the image and run

Aplikace je nyní dostupná na portu 8090. Pokud otevřete prohlížeč a přejdete na vase-IP-adresa:8090 měli byste vidět zobrazenou stránku:

hello, world

Pokud takovou stránku ve svém prohlížeči vidíte, úspěšně jste sestavili Docker image a sdíleli jej v soukromém Docker Registry. V budoucnu, pokud provedete jakékoli změny v master větvi, fáze definované v souboru .gitlab-ci.yml se spustí, a pokud uspějí, nový Docker image s tagem latest bude znovu sestaven a odeslán do registru.

Závěr

V tomto projektu jste se naučili, jak přidat privileged GitLab runner do vaší self-managed instance GitLabu, abyste mohli sestavovat Docker image. Také jste nakonfigurovali soukromý registr Docker imagů pro hostování vašich imagů. Pomocí projektu Node pipeline jste mohli otestovat každou součást nastavení a ujistit se, že se propojily a komunikují podle očekávání. Jakmile byl váš image k dispozici v registru, mohli jste jej stáhnout a potvrdit, že běží uvnitř kontejneru.

Toto je úvodní návod, který vám poskytne základy, na kterých můžete stavět. Postupujte prosím podle oficiální dokumentace GitLabu, abyste se o GitLabu dozvěděli více. Tento odkaz může poskytnout informace o GitLab Container Registry.

Další zdroje o využívání Dockeru naleznete v dalších návodech na našem blogu:

Příjemnou práci!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.