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. Aregistry
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 azhtpasswd
fájlt tartalmazó könyvtárat a konténerbe.-e REGISTRY_AUTH=htpasswd
: Engedélyezi azhtpasswd
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 azhtpasswd
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
- A felhasználó kérést küld a
https://my.private.registry.com
címre. - 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). - 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