Pokud pracujete pro organizaci a chcete si ponechat své obrazy dockerů u sebe pro rychlé nasazení, pak je hostování soukromého úložiště Docker perfektní. Soukromý registr dockerů vám umožňuje vlastnit kanál distribuce obrázků a mít přesnější kontrolu nad ukládáním a distribucí obrázků. Můžete integrovat svůj registr se systémem CI/CD a zlepšit tak svůj pracovní postup.
Tento tutoriál vás naučí, jak nastavit a používat soukromý registr Docker na serveru založeném na Rocky Linux 8 pomocí Amazon S3 jako úložiště.
Předpoklady
- Dva linuxové servery s Rocky Linuxem 8. Jeden server bude fungovat jako hostitel registru, zatímco druhý bude sloužit jako klient k odesílání požadavků a přijímání obrázků od hostitele.
- Registrovaný název domény směřující na hostitelský server. Budeme používat
registry.example.com
pro náš tutoriál. - Uživatel bez oprávnění root s právy sudo na obou počítačích.
Krok 1 – Konfigurace brány firewall
Prvním krokem je konfigurace firewallu. Rocky Linux používá Firewalld Firewall. Zkontrolujte stav brány firewall.
$ sudo firewall-cmd --staterunning
Firewall pracuje s různými zónami a veřejná zóna je výchozí zóna, kterou budeme používat. Seznam všech služeb a portů aktivních na bráně firewall.
$ sudo firewall-cmd --permanent --list-services
Měl by ukazovat následující výstup.
cockpit dhcpv6-client ssh
Povolit porty HTTP a HTTPS.
$ sudo firewall-cmd --permanent --add-service=http$ sudo firewall-cmd --permanent --add-service=https
Znovu zkontrolujte stav brány firewall.
$ sudo firewall-cmd --permanent --list-services
Měli byste vidět podobný výstup.
cockpit dhcpv6-client http https ssh
Chcete-li změny povolit, znovu načtěte bránu firewall.
$ sudo firewall-cmd --reload
Krok 2 – Instalace Docker a Docker Compose
Tento krok je vyžadován na serveru i na klientských počítačích.
Nainstalujte oficiální úložiště Docker.
$ sudo dnf install yum-utils$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Nainstalujte Docker.
$ sudo dnf install docker-ce docker-ce-cli containerd.io
Povolte a spusťte démona Docker.
$ sudo systemctl povolit docker --now
Přidejte svého systémového uživatele do skupiny Docker, abyste se vyhnuli použití sudo
spouštět příkazy Dockeru.
$ sudo usermod -aG docker $(whoami)
Po odhlášení se znovu přihlaste ke svému serveru, abyste povolili změnu.
Stáhněte si a nainstalujte nejnovější stabilní verzi Docker Compose.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o / usr/local/bin/docker-compose
Použijte oprávnění ke spustitelnému souboru na stažený binární soubor.
$ sudo chmod +x /usr/local/bin/docker-compose
Nainstalujte skript Docker-compose Bash Completion.
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-composeZnovu načtěte nastavení profilu, aby dokončování bash fungovalo.
zdroj $ ~/.bashrcKrok 3 – Konfigurace registru Docker
Vytváření uživatelských adresářů
Vytvořte adresář pro konfiguraci registru.
$ mkdir ~/docker-registryPřepněte do
docker-registry
adresář.$ cd ~/docker-registryVytvořte adresář pro uložení ověřovacího hesla HTTP, konfiguračních souborů Nginx a certifikátů SSL.
$ mkdir authVytvořte další adresář pro ukládání protokolů Nginx.
Protokoly $ mkdirVytvořit Amazon S3 Bucket
Data registru a obrázky můžete uložit na svůj server nebo použít cloudovou hostingovou službu. V našem tutoriálu budeme používat cloudovou službu Amazon S3.
Dalším krokem je nastavení konfiguračního souboru s několika důležitými nastaveními. Tato nastavení lze také definovat v
docker-compose.yml
soubor, ale mít samostatný soubor je mnohem lepší.Vytvořte segment s následujícím nastavením.
- ACL by měl být deaktivován.
- Veřejný přístup k bucketu by měl být zakázán.
- Verze segmentu by měly být zakázány.
- Povolte šifrování Bucket pomocí spravovaných klíčů Amazon S3. (SSE-S3)
- Zámek objektu by měl být deaktivován.
Vytvořte uživatele IAM s následující zásadou.
{ "Verze":"2012-10-17", "Prohlášení":[ { "Efekt":"Povolit", "Akce":[ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Zdroj":"arn:aws:s3:::S3_BUCKET_NAME" }, { "Effect":"Povolit", "Akce":[ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Zdroj":"arn:aws:s3:::S3_BUCKET_NAME/*" } ]}
Nahraďte S3_BUCKET_NAME
s názvem vašeho kbelíku S3.
Poznamenejte si tajný klíč, tajnou hodnotu a oblast segmentu vašeho segmentu, abyste je mohli použít později.
Vytvořit soubor Docker Compose
Vytvořte docker-compose.yml
soubor a otevřete jej pro úpravy.
$ nano docker-compose.yml
Vložte do něj následující kód.
verze:'3.3'služby:registry:image:registry:2 restart:vždy prostředí:- REGISTRY_STORAGE=s3 - REGISTRY_STORAGE_S3_REGION=us-west-2 - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry - REGISTRY_STORCRYSI_8AGE_ZEPT_S3_REGISTRY_STORCTORAGE_STORAGE_5ENGISTRY3_ - REGISTRY_STORAGE_S3_SECURE =TRUE - REGISTRY_STORAGE_S3_ACCESSKEY =AKIA3FIG4NVFCJ6STMUA - REGISTRY_STORAGE_S3_SECRETKEY =j9sA / fw6EE9TVj5KRDhm / 7deye + aYDPXttkGbdaX - REGISTRY_STORAGE_S3_V4AUTH =true - REGISTRY_STORAGE_S3_ROOTDIRECTORY =/ obrazu registr - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR =PAMĚŤ - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED =falešné Nginx:obraz "Nginx:Alpine" porty:- 443 :443 odkazy:- registry:registry volumes:- ./auth:/etc/nginx/conf.d - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro - ./logs:/var/ log/nginx - /etc/letsencrypt:/etc/letsencrypt
Uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni.
Pojďme si projít, co jsme nastavili v našem novém souboru.
-
Prvním krokem je získat nejnovější bitovou kopii verze 2 registru Docker z centra. Nepoužíváme nejnovější značku, protože to může způsobit problémy v případě aktualizace hlavní verze. Nastavení na 2 vám umožní získat všechny aktualizace 2.x a zároveň zabránit automatické aktualizaci na další hlavní verzi, která může přinést převratné změny.
-
Kontejner registru je nastaven tak, aby se vždy restartoval v případě selhání nebo neočekávaného vypnutí.
-
Nastavili jsme různé proměnné prostředí pro úložiště Amazon S3. Pojďme si je rychle projít.
- REGISTRY_STORAGE nastavuje typ úložiště. Vybrali jsme s3 protože používáme Amazon S3.
- REGISTRY_STORAGE_S3_REGION nastaví oblast vašeho segmentu S3.
- REGISTRY_STORAGE_S3_BUCKET nastaví název vašeho segmentu S3.
- REGISTRY_STORAGE_S3_ENCRYPT - nastavte ji na hodnotu true, pokud jste povolili šifrování bucket.
- REGISTRY_STORAGE_S3_CHUNKSIZE nastavuje velikost nahrávaných bloků. Mělo by být větší než 5 MB (5 * 1024 * 1024).
- REGISTRY_STORAGE_S3_SECURE - pokud hodláte používat HTTPS, nastavte jej na hodnotu true.
- REGISTRY_STORAGE_S3_ACCESSKEY a REGISTRY_STORAGE_S3_SECRETKEY – Uživatelské přihlašovací údaje, které jste získali po vytvoření uživatele IAM.
- REGISTRY_STORAGE_S3_V4AUTH - nastavte ji na true, pokud používáte v4 ověřování AWS. Pokud se vám zobrazují chyby související s přihlášením S3, nastavte hodnotu na hodnotu false.
- REGISTRY_STORAGE_S3_ROOTDIRECTORY - nastaví kořenový adresář ve vašem segmentu, pod kterým budou uložena data vašeho registru.
- REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - nastaví umístění mezipaměti. V našem případě jej ukládáme do paměti. Můžete jej také nastavit tak, aby používal Redis.
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - Nastavením na hodnotu false zakážete službu kontroly stavu úložiště registru. V registru je chyba, která může způsobit problémy, pokud jej nenastavíte na hodnotu false.
-
Registr Dockeru komunikuje přes port 5000, což je to, co jsme na našem serveru vystavili dockeru.
-
./auth:/etc/nginx/conf.d
mapování zajišťuje, že všechna nastavení Nginx jsou dostupná v kontejneru. -
./auth/nginx.conf:/etc/nginx/nginx.conf:ro
mapuje soubor nastavení Nginx ze systému na soubor v kontejneru v režimu pouze pro čtení. -
./logs:/var/log/nginx
umožňuje přístup k protokolům Nginx v systému mapováním do adresáře protokolů Nginx v kontejneru. -
Nastavení registru Docker jsou uložena v
/etc/docker/registry/config.yml
soubor v kontejneru a namapovali jsme jej naconfig.yml
soubor v aktuálním adresáři, který vytvoříme v dalším kroku.
Nastavit ověřování
Chcete-li nastavit ověřování HTTP, musíte nainstalovat httpd-tools
balíček.
$ sudo dnf nainstalovat httpd-tools
Vytvořte soubor s hesly v ~/docker-registry/auth
adresář.
$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1Nové heslo:Znovu zadejte nové heslo:Přidání hesla pro uživatele user1
-c
flag instruuje příkaz k vytvoření nového souboru a -B
příznakem je použití algoritmu bcrypt podporovaného Dockerem. Nahraďte user1
s uživatelským jménem dle vašeho výběru.
Pokud chcete přidat další uživatele, spusťte příkaz znovu, ale bez -c
vlajka.
$ htpasswd -B ~/docker-registry/auth/registry.password user2
Nyní bude soubor mapován do kontejneru registru pro ověření.
Krok 4 – Instalace protokolu SSL
Chcete-li nainstalovat certifikát SSL pomocí Let's Encrypt, musíme si stáhnout nástroj Certbot, který je dostupný z úložiště Epel.
Nainstalujte úložiště EPEL a Certbot.
$ sudo dnf install epel-release $ sudo dnf install certbot
Vygenerujte certifikát SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [e-mail chráněný] -d registry.example.com
Výše uvedený příkaz stáhne certifikát do /etc/letsencrypt/live/registry.example.com
adresář na vašem serveru.
Vytvořte skupinu Diffie-Hellman certifikát.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Otestujte obnovení certifikátu.
$ sudo certbot renew --dry-run
Pokud bude suchý běh úspěšný, znamená to, že vaše certifikáty budou automaticky obnoveny.
Zkopírujte soubor Dhparam do kontejneru
Zkopírujte skupinu Diffie-Hellman certifikát do ~/docker-registry/auth
adresář, který bude namapován na kontejner.
$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth
Krok 5 – Konfigurace Nginx
Další krok zahrnuje konfiguraci serveru Nginx jako front-end proxy pro server registru Docker. Registr Docker je dodáván s vestavěným serverem pracujícím na portu 5000. Dáme jej za Nginx.
Vytvořte a otevřete soubor ~/docker-registry/auth/nginx.conf
pro úpravy.
$ sudo nano ~/docker-registry/auth/nginx.conf
Vložte do něj následující kód.
events { worker_connections 1024;}http { upstream docker-registry { server registr:5000; } ## Nastavte proměnnou, která nám pomůže rozhodnout, zda potřebujeme přidat záhlaví ## 'Docker-Distribution-Api-Version'. ## Registr vždy nastaví tuto hlavičku. ## V případě, že nginx provádí auth, hlavička není nastavena ##, protože nginx se ověřuje před proxy. map $upstream_http_docker_distribution_api_version $docker_distribution_api_version { '' 'registry/2.0'; } server { poslouchat 443 ssl http2; název_serveru registry.example.com; # SSL ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/registry.example.com/chain.pem; access_log /var/log/nginx/registry.access.log; error_log /var/log/nginx/registry.error.log; # Doporučení z https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-POLSHA13HEDCHA25050 -RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_session_cache shared:SSL:10m; ssl_dhparam /etc/nginx.d/conf.d/dhparam.pem; resolver 8.8.8.8; # deaktivujte jakékoli limity, abyste se vyhnuli HTTP 413 pro nahrávání velkých obrázků client_max_body_size 0; # vyžadováno, aby se zabránilo HTTP 411:viz vydání #1486 (https://github.com/moby/moby/issues/1486) chunked_transfer_encoding on; umístění /v2/ { # Nepovolit připojení z dockeru 1.5 a dřívějších # docker starší než 1.6.0 nenastavil správně uživatelského agenta na příkaz ping, zachyťte uživatelské agenty "Go *" if ($http_user_agent ~ "^(docker\/ 1\.(3|4|5(?!\[0-9]-dev))|Go ).*$" ) { return 404; } # Chcete-li do v2 přidat základní ověřování, použijte nastavení auth_basic. auth_basic "Sféra registru"; auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd; ## Pokud je $docker_distribution_api_version prázdný, záhlaví se nepřidá. ## Viz direktiva map výše, kde je tato proměnná definována. add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version vždy; proxy_pass http://docker-registry; proxy_set_header Host $http_host; # vyžadováno pro docker klienta proxy_set_header X-Real-IP $remote_addr; # předat IP skutečného klienta proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $schéma; proxy_read_timeout 900; } }}
Uložte soubor stisknutím Ctrl + X a zadáním Y až budete vyzváni po dokončení.
Nakonfigurujte SELinux tak, aby umožňoval síťová připojení pro soukromý registr dockerů.
$ sudo setsebool -P httpd_can_network_connect on
Krok 6 – Spuštění registru Docker
Přepněte do adresáře Docker Registry.
$ cd ~/docker-registry
Spusťte kontejner dockeru.
$ docker-compose up -d
Zkontrolujte stav kontejnerů.
$ docker psCONTAINER ID OBRÁZKOVÝ PŘÍKAZ VYTVOŘEN STAV NÁZVY PORTŮ88d6addc1687 nginx:alpine "/docker-entrypoint.…" před 5 minutami Nárůst o 5 minut 80/tcp, 0.0.0.0:443->p4,43::tc>443/tcp docker-registry_nginx_12b112edc1c72 registry:2 "/entrypoint.sh /etc…" před 5 minutami Více o 5 minut 5000/tcp docker-registry_registry_1
Přihlaste se do registru Docker.
Přihlášení $ docker -u=testuser -p=testpassword https://registry.example.com
Můžete také otevřít adresu URL https://registry.example.com/v2/
ve vašem prohlížeči a požádá o uživatelské jméno a heslo. Měli byste vidět prázdnou stránku s {} na to.
Adresu URL na terminálu můžete zkontrolovat pomocí curl
.
$ curl -u testuser -X ZÍSKEJTE https://registry.nspeaks.xyz/v2/Zadejte heslo hostitele pro uživatele 'testuser':{}
Stáhněte si nejnovější image dockeru Ubuntu.
$ docker pull ubuntu:latest
Označte tento obrázek pro soukromý registr.
Značka $ docker ubuntu:latest registry.example.com/ubuntu2004
Vložte obrázek do registru.
$ docker push registry.example.com/ubuntu2004
Otestujte, zda bylo odeslání úspěšné.
$ curl -u testuser -X ZÍSKEJTE https://registry.nspeaks.xyz/v2/_catalogZadejte heslo hostitele pro uživatele 'testuser':{"repositories":["ubuntu2004"]}
Po výzvě zadejte své ověřovací heslo Nginx a uvidíte seznam úložišť dostupných prostřednictvím registru.
Podívejte se na seznam obrázků Docker, které jsou aktuálně dostupné k použití.
Krok 7 – Přístup a použití registru Docker z klientského počítače
Přihlaste se ke svému klient-server. V kroku 1 jsme nainstalovali Docker na klientský počítač.
Přihlaste se do soukromého registru Docker z klientského počítače.
Přihlášení $ docker -u=testuser -p=testpassword https://registry.example.com
Stáhněte obraz Ubuntu z registru.
$ docker pull registry.example.com/ubuntu2004
Seznam všech obrázků na vašem klientském počítači.
$ docker imagesREPOSITORY TAG ID OBRÁZKU VYTVOŘENO SIZEregistry.nspeaks.xyz/ubuntu2004 nejnovější ff0fea8310f3 před 2 týdny 72,8 MB
Vytvořte a spusťte kontejner pomocí staženého obrázku.
$ docker run -it registry.example.com/ubuntu2004 /bin/bash
Budete přihlášeni do prostředí uvnitř kontejneru Ubuntu.
[e-mail chráněn]:
Spusťte následující příkaz a zkontrolujte verzi systému Linux.
[e-mail chráněno]$ cat /etc/os-releaseNAME="Ubuntu"VERSION="20.04.4 LTS (Focal Fossa)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 20.04.4 LTS"VERSION_ID="20.04"HOME_URL ="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https:// www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=focalUBUNTU_CODENAME=focal
Nyní můžete začít používat svůj registr Docker ze svých klientských počítačů.
Závěr
Tímto končí náš tutoriál o nastavení soukromého registru Docker na serveru založeném na Rocky Linux 8, který používá Amazon S3 jako úložiště. Pokud máte nějaké dotazy, napište je do komentářů níže.