A Docker Registry beállítása saját, privát image-tárolóhoz

A modern szoftverfejlesztés egyik alappillére a konténerizáció, melynek élvonalában a Docker áll. A Docker image-ek kulcsfontosságúak az alkalmazások egységes és megbízható futtatásához. Gyakran azonban szükség van arra, hogy ezeket az image-eket egy saját, privát tárolóban, azaz egy Docker Registry-ben kezeljük. Ez a cikk részletesen bemutatja, hogyan állíthatod be a saját privát image-tárolódat, a kezdeti lépésektől a biztonságos éles környezetig.

Bevezetés: Miért érdemes saját Docker Registry-t üzemeltetni?

A Docker Hub az alapértelmezett, nyilvános registry, amely kiválóan alkalmas a nyílt forráskódú és nyilvánosan megosztott image-ek tárolására. De mi van akkor, ha bizalmas, céges alkalmazásokat fejlesztesz, és nem szeretnéd, hogy image-eid egy nyilvános felületen legyenek elérhetők? Ekkor jön képbe a privát Docker Registry. Ennek használata számos előnnyel jár:

  • Biztonság és Adatvédelem: Teljes kontrollt biztosítasz a saját image-eid felett, megakadályozva az illetéktelen hozzáférést.
  • Függetlenség: Nem függsz külső szolgáltatóktól, saját infrastruktúrádon belül tárolod az image-eket. Ez különösen kritikus lehet hálózati problémák vagy szolgáltatói leállások esetén.
  • Sebesség: A helyi hálózaton vagy az adatközpontodban elhelyezett registry-ből sokkal gyorsabban húzhatod le az image-eket, mint egy távoli, nyilvános szolgáltatásból.
  • Szabályozás és Compliance: Bizonyos iparágakban szigorú szabályozások írják elő az adatok (és így az image-ek) helyi tárolását.
  • Offline Elérhetőség: Ha a fejlesztői környezetednek nincs állandó internet-hozzáférése, a helyi registry elengedhetetlen.
  • Költségmegtakarítás: Nagy mennyiségű privát image esetén a saját registry hosszú távon gazdaságosabb lehet, mint a felhőalapú szolgáltatások előfizetési díjai.

Ebben az útmutatóban lépésről lépésre végigvezetünk a beállításon, kitérve a perzisztens tárolásra, a biztonságos HTTPS kapcsolatra és a hitelesítésre.

A Kezdetek: A Docker Registry Konténer Indítása

A Docker Registry önmaga is egy Docker konténerként futtatható, ami hihetetlenül leegyszerűsíti a telepítést. Először is győződj meg róla, hogy a Docker telepítve van és fut a rendszereden.

A legegyszerűbb módon így indíthatsz el egy alapvető, de még nem perzisztens és nem biztonságos registry-t:

docker run -d -p 5000:5000 --name registry registry:2

Mit is jelent ez a parancs?

  • docker run: Elindít egy új konténert.
  • -d: A konténer a háttérben fut (detached mode).
  • -p 5000:5000: Port-hozzárendelés. A gazdagép (host) 5000-es portját a konténer 5000-es portjára irányítja. Ezen a porton fogjuk elérni a registry-t.
  • --name registry: Elnevezi a konténert „registry”-nek, így könnyebb hivatkozni rá később.
  • registry:2: Ez az a Docker image, amit használni fogunk. A registry az hivatalos image neve, a :2 pedig a második főverzióra utal, ami az aktuális stabil változat.

Miután elindult a konténer, megpróbálhatsz egy image-et feltölteni (pusholni) rá. Először címkézz fel egy meglévő image-et, például az hello-world-öt:

docker pull hello-world
docker tag hello-world localhost:5000/my-hello-world
docker push localhost:5000/my-hello-world

Valószínűleg hibaüzenetet kapsz: http: server gave HTTP response to HTTPS client. Ez teljesen normális, és rámutat a következő fontos lépésre: a biztonságra. Mielőtt ebbe belevágnánk, gondoskodjunk az adatok tartós megőrzéséről.

Perzisztens Tárolás: Az Adatok Megőrzése

A fenti parancs sajnos egy „ephemerikus” konténert indít: ha a konténer leáll vagy törlődik, minden feltöltött image elveszik. Ez nem túl praktikus egy image-tároló esetében! Ahhoz, hogy az image-ek megmaradjanak, Docker volume-ot kell használnunk.

Állítsd le és töröld az előző konténert (ha van):

docker stop registry
docker rm registry

Most indítsd újra a registry-t egy volume-mal. Hozz létre egy könyvtárat a gazdagépen, például /opt/docker-registry-data, ahol az image-ek fizikailag tárolódnak majd:

mkdir -p /opt/docker-registry-data
docker run -d 
  -p 5000:5000 
  --name registry 
  -v /opt/docker-registry-data:/var/lib/registry 
  registry:2

Ebben a parancsban a -v /opt/docker-registry-data:/var/lib/registry rész a kulcsfontosságú. Ez azt mondja a Dockernek, hogy a gazdagép /opt/docker-registry-data könyvtárát csatolja be a konténeren belül a /var/lib/registry útvonalra. Ez utóbbi az a hely, ahol a Docker Registry tárolja az image-ek adatait. Így a konténer törlése esetén is megmaradnak az image-ek, hiszen azok a gazdagép fájlrendszerén élnek tovább.

A Helyi Tesztelés és az „Insecure Registries” Dilemmája

Ahogy fentebb is említettük, a Docker alapértelmezés szerint elvárja, hogy a registry-k HTTPS-en keresztül legyenek elérhetők a biztonságos kommunikáció érdekében. Ha a privát registry-d HTTP-n fut (ami a fenti példa), akkor a docker push és docker pull parancsok hibát fognak dobni.

Fejlesztési vagy tesztelési célokra ideiglenesen feloldhatod ezt a korlátozást az „insecure registries” beállításával. Ezt a Docker démon konfigurációs fájljában (daemon.json) kell megtenni, ami általában /etc/docker/daemon.json útvonalon található Linux rendszereken.

Szerkeszd a daemon.json fájlt (ha nem létezik, hozd létre):

{
  "insecure-registries": ["localhost:5000"]
}

Ha már vannak más beállításaid, egyszerűen add hozzá az "insecure-registries" sort. Mentés után újra kell indítanod a Docker démont, hogy a változások érvénybe lépjenek:

sudo systemctl restart docker

Most már megpróbálhatod újra a push/pull műveleteket:

docker tag hello-world localhost:5000/my-hello-world
docker push localhost:5000/my-hello-world

docker rmi localhost:5000/my-hello-world # Helyi image törlése teszteléshez
docker pull localhost:5000/my-hello-world

Ezeknek a parancsoknak most már sikeresen le kell futniuk. Fontos azonban megjegyezni: az insecure-registries beállítás CSAK fejlesztésre és tesztelésre alkalmas. Éles környezetben SOHA ne használd HTTP-n keresztül a registry-t! A HTTPS és az SSL tanúsítványok kulcsfontosságúak a biztonságos működéshez.

Biztonság Elsősorban: HTTPS és SSL Tanúsítványok

Éles környezetben elengedhetetlen a registry HTTPS-en keresztüli elérése. Ehhez SSL tanúsítványra van szükségünk. Két fő módszer létezik:

1. Önaláírt Tanúsítványok (Fejlesztésre és Belső Használatra)

Önaláírt tanúsítványokat gyorsan generálhatunk, de a böngészők és a Docker kliensek figyelmeztetést fognak adni, mivel ezeket nem egy megbízható tanúsítványkiadó (CA) állította ki. Belső hálózatokon, ahol te vagy az adminisztrátor, ez elfogadható lehet.

Először hozzunk létre egy könyvtárat a tanúsítványoknak, például /opt/docker-registry-certs:

mkdir -p /opt/docker-registry-certs

Generáljuk a kulcsot és a tanúsítványt az openssl segítségével. A Common Name (CN) mezőbe írd be a registry-d hosztnevét (pl. my.private.registry.com vagy az IP-címét, ha azon keresztül éred el).

cd /opt/docker-registry-certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt 
  -subj "/C=HU/ST=Budapest/L=Budapest/O=MyCompany/OU=IT/CN=my.private.registry.com"

Most, hogy megvannak a tanúsítványok, le kell állítanunk és újra kell indítanunk a registry konténert úgy, hogy ezeket használja:

docker stop registry
docker rm registry

docker run -d 
  -p 5000:5000 
  --name registry 
  -v /opt/docker-registry-data:/var/lib/registry 
  -v /opt/docker-registry-certs:/certs 
  -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 
  registry:2

Most a registry már HTTPS-en fut az 5000-es porton. Ahhoz, hogy a Docker kliens megbízzon az önaláírt tanúsítványban, fel kell venned a gazdagép megbízható CA tanúsítványai közé. Ehhez másold a domain.crt fájlt a megfelelő helyre:

sudo mkdir -p /etc/docker/certs.d/my.private.registry.com:5000
sudo cp /opt/docker-registry-certs/domain.crt /etc/docker/certs.d/my.private.registry.com:5000/ca.crt

Majd indítsd újra a Docker démont:

sudo systemctl restart docker

Most már pusholhatsz és pullolhatsz a registry-ről a hosztnevén keresztül (pl. docker push my.private.registry.com:5000/my-image).

2. Tanúsítványkezelés Éles Környezetben (Let’s Encrypt / Nginx Reverse Proxy)

Éles környezetben az önaláírt tanúsítványok nem ideálisak. Helyette egy megbízható CA által kiállított tanúsítványt érdemes használni, például a Let’s Encrypt-től. Ezt leggyakrabban egy reverse proxy, például az Nginx vagy a Caddy segítségével valósítják meg. Az Nginx kezeli a HTTPS forgalmat, a tanúsítványokat és a külső hozzáférést, majd továbbítja a kéréseket a belső, HTTP-n futó Docker Registry konténernek. Ez egy robusztusabb és rugalmasabb megoldás.

Erről részletesebben a „Professzionális Megoldás: Nginx Reverse Proxy…” részben olvashatsz.

Felhasználói Hitelesítés: Ki férhet hozzá az image-eimhez?

A privát registry létrehozásának egyik fő oka a biztonság. A HTTPS már titkosítja a kommunikációt, de még nem korlátozza a hozzáférést. Ehhez hitelesítésre van szükség.

HTTP Basic Authentication (htpasswd)

A Docker Registry támogatja az HTTP Basic Authentication-t, amit az htpasswd fájl segítségével konfigurálhatunk. Ez a legegyszerűbb hitelesítési módszer.

Először hozz létre egy könyvtárat a hitelesítési fájlnak, pl. /opt/docker-registry-auth:

mkdir -p /opt/docker-registry-auth

Most hozz létre egy felhasználót és jelszót az htpasswd paranccsal. Ha nincs telepítve, telepítsd az apache2-utils csomagot (Debian/Ubuntu) vagy httpd-tools (CentOS/RHEL).

sudo apt-get install apache2-utils # Debian/Ubuntu
# vagy
sudo yum install httpd-tools # CentOS/RHEL

htpasswd -Bc /opt/docker-registry-auth/htpasswd your_username

A -B bcrypt titkosítást használ, a -c pedig létrehozza a fájlt, ha még nem létezik (ha már van felhasználó és újat akarsz hozzáadni, ne használd a -c kapcsolót!). A parancs kérni fogja a jelszót.

Most állítsd le és indítsd újra a registry-t, hogy használja ezt a hitelesítést:

docker stop registry
docker rm registry

docker run -d 
  -p 5000:5000 
  --name registry 
  -v /opt/docker-registry-data:/var/lib/registry 
  -v /opt/docker-registry-certs:/certs 
  -v /opt/docker-registry-auth:/auth 
  -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 
  -e REGISTRY_AUTH=htpasswd 
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" 
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd 
  registry:2

Az új környezeti változók:

  • -v /opt/docker-registry-auth:/auth: Becsatolja az htpasswd fájlt tartalmazó könyvtárat a konténerbe.
  • -e REGISTRY_AUTH=htpasswd: Engedélyezi az htpasswd alapú hitelesítést.
  • -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm": Meghatározza a hitelesítési ablak nevét.
  • -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd: Megadja az htpasswd fájl elérési útját a konténeren belül.

Most, amikor pusholsz vagy pullolsz, előbb be kell jelentkezned a Docker klienssel:

docker login my.private.registry.com:5000

Ezután megadhatod a felhasználóneved és jelszavad, amit az htpasswd-vel hoztál létre. Ha sikeres a bejelentkezés, akkor már tudsz image-eket kezelni.

Professzionális Megoldás: Nginx Reverse Proxy az SSL és Hitelesítés Kezelésére

Éles környezetben gyakran célszerű egy reverse proxyt, például az Nginx-et használni a Docker Registry előtt. Az Nginx kezelheti az SSL/TLS titkosítást, a tanúsítványokat, a hitelesítést, és akár további biztonsági rétegeket is adhat. Ezáltal a Docker Registry konténer maga futhat HTTP-n, ami leegyszerűsíti a konfigurációját.

Architektúra

  1. A felhasználó kérést küld a https://my.private.registry.com címre.
  2. Az Nginx fogadja a kérést, kezeli az SSL/TLS titkosítást (Let’s Encrypt tanúsítvánnyal), és ellenőrzi a felhasználó hitelesítését (ugyancsak htpasswd vagy más módszerrel).
  3. Ha a kérés érvényes, az Nginx továbbítja (proxyzza) a kérést a belső hálózaton futó Docker Registry konténernek, HTTP protokollon keresztül (pl. http://localhost:5000).

Nginx Konfiguráció (példa)

Tételezzük fel, hogy az Nginx és a Docker Registry is ugyanazon a szerveren fut, és a Docker Registry a 5000-es porton hallgat HTTP-n, hitelesítés és SSL nélkül (mivel ezeket az Nginx fogja kezelni).

server {
    listen 443 ssl;
    server_name my.private.registry.com;

    # SSL tanúsítványok elérési útjai (pl. Let's Encrypt-től)
    ssl_certificate /etc/letsencrypt/live/my.private.registry.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/my.private.registry.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # Basic Authentication konfiguráció
    auth_basic "Private Docker Registry";
    auth_basic_user_file /etc/nginx/.htpasswd; # Ugyanaz a htpasswd fájl, mint fent

    client_max_body_size 0; # Nagyméretű image-ek feltöltéséhez

    # Proxy beállítások a Docker Registry felé
    location / {
        proxy_pass http://localhost:5000; # A belső Docker Registry címe
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 900s; # Hosszabb timeout nagyméretű feltöltéseknél
    }
}

Ez a konfiguráció feltételezi, hogy az htpasswd fájl az /etc/nginx/.htpasswd helyen van, és a Let’s Encrypt tanúsítványok a /etc/letsencrypt/live/my.private.registry.com/ könyvtárban találhatók.

Ebben az esetben a Docker Registry konténert a legegyszerűbben indíthatod el, perzisztens tárolással, de SSL és hitelesítés nélkül, mivel ezeket az Nginx kezeli:

docker run -d 
  -p 5000:5000 
  --name registry 
  -v /opt/docker-registry-data:/var/lib/registry 
  registry:2

Ne felejtsd el frissíteni a DNS rekordodat, hogy a my.private.registry.com a szervered IP-címére mutasson. A Docker login ekkor a hosztnévvel történik:

docker login my.private.registry.com

Karbantartás és Továbbfejlesztés: Amit még érdemes tudni

Garbage Collection

Amikor törölsz egy image-et a registry-ből (pl. docker rmi my.private.registry.com/my-image és docker push egy újat ugyanazzal a taggel), az adatok valójában nem törlődnek azonnal a lemezről. A Docker Registry egy „garbage collection” mechanizmust használ. A tényleges törléshez le kell állítani a registry-t írási műveletek elvégzésére, és futtatni kell a garbage-collect parancsot:

docker stop registry
docker run --rm 
  -v /opt/docker-registry-data:/var/lib/registry 
  -v /opt/docker-registry-config:/etc/docker/registry 
  registry:2 /bin/registry garbage-collect /etc/docker/registry/config.yml

docker start registry

Ehhez a config.yml fájlt is be kell csatolni, amit a Docker Registry alapértelmezetten használ. Érdemes lehet a konfigurációt egy külön volume-ba tenni, vagy menteni a konténerből, ha módosítottad. A config.yml fájl általában a /etc/docker/registry/config.yml útvonalon található a konténeren belül.

Tároló Illesztőprogramok (Storage Drivers)

A Docker Registry alapértelmezetten a helyi fájlrendszert használja a /var/lib/registry útvonalon. Azonban támogat más tároló illesztőprogramokat is, mint például az Amazon S3, Azure Blob Storage, Google Cloud Storage, OpenStack Swift és még sok más. Ez lehetővé teszi a registry skálázhatóságát és a meglévő felhőinfrastruktúrával való integrációt. Ezeket a config.yml fájlban kell konfigurálni.

CI/CD Integráció

A privát Docker Registry tökéletesen illeszkedik a CI/CD (Continuous Integration/Continuous Deployment) folyamatokba. A build szerverek automatikusan pusholhatják az új image-eket a registry-be, és a deployment scriptek onnan húzhatják le azokat. Ez biztosítja az automatizált és megbízható szoftverelosztást a fejlesztéstől az éles környezetig.

Monitoring és Karbantartás

Mint minden éles rendszernél, a Docker Registry esetében is fontos a monitoring. Figyeld a lemezhasználatot, a hálózati forgalmat és a konténer állapotát. Használhatsz olyan eszközöket, mint a Prometheus és a Grafana a metrikák gyűjtésére és vizualizálására.

Összefoglalás: A Kontroll a Tiéd!

A saját Docker Registry beállítása egy fontos lépés a konténerizált alkalmazások teljes kontrolljának megszerzésében. Noha az alapbeállítás viszonylag egyszerű, az éles környezetben történő biztonságos és stabil működéshez elengedhetetlen a HTTPS, a hitelesítés és a perzisztens tárolás megfelelő konfigurálása. Az Nginx reverse proxy használatával egy robusztus és skálázható megoldást építhetsz ki, amely biztosítja, hogy image-eid biztonságban legyenek, és bármikor, gyorsan elérhetők legyenek. Fejlesztőként vagy DevOps mérnökként ez a tudás felvértez téged azzal az eszköztárral, amellyel a konténer alapú infrastruktúrádat a következő szintre emelheted. Vágj bele, és fedezd fel a privát image-tárolásban rejlő szabadságot és biztonságot!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük