Ako nastaviť súkromný register Docker na Ubuntu 22.04
Tento návod existuje pre tieto verzie OS
- Ubuntu 22.04 (Jammy Jellyfish)
- Ubuntu 17.10 (Artful Aardvark)
Na tejto stránke
- Predpoklady
- Krok 1 - Nakonfigurujte bránu firewall
- Krok 2 - Nainštalujte Docker a Docker Compose
Krok 3 - Nakonfigurujte register Docker
- Vytvorte užívateľské adresáre
- Vytvorte Amazon S3 Bucket
- Vytvorte súbor Docker Compose File
- Nastavte overenie
Krok 4 – Nainštalujte SSL
Ak pracujete pre organizáciu a chcete si ponechať svoje obrázky Docker interne na rýchle nasadenie, potom je hosťovanie súkromného úložiska Docker perfektné. Vlastný register dockerov vám umožňuje vlastniť kanál na distribúciu obrázkov a mať prísnejšiu kontrolu nad ukladaním a distribúciou obrázkov. Môžete integrovať svoj register so systémom CI/CD a zlepšiť tak svoj pracovný postup.
Tento tutoriál vás naučí, ako nastaviť a používať súkromný register Docker na serveri Ubuntu 22.04 pomocou Amazon S3 ako úložiska.
Predpoklady
Dva servery Linux s Ubuntu 22.04. Jeden server bude fungovať ako hostiteľ registra, zatiaľ čo druhý bude slúžiť ako klient na odosielanie požiadaviek a prijímanie obrázkov od hostiteľa.
Registrovaný názov domény smerujúci na hostiteľský server. V našom návode budeme používať registry.example.com
.
Používateľ bez oprávnenia root s oprávneniami sudo na oboch počítačoch.
Uistite sa, že je všetko aktualizované.
$ sudo apt update
$ sudo apt upgrade
Niekoľko balíkov, ktoré váš systém potrebuje.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Niektoré z týchto balíkov už môžu byť vo vašom systéme nainštalované.
Krok 1 - Nakonfigurujte bránu firewall
Prvým krokom je konfigurácia brány firewall. Ubuntu sa štandardne dodáva s ufw (Nekomplikovaný firewall).
Skontrolujte, či je spustený firewall.
$ sudo ufw status
Mali by ste dostať nasledujúci výstup.
Status: inactive
Povoľte port SSH, aby firewall pri jeho povolení neprerušil aktuálne pripojenie.
$ sudo ufw allow OpenSSH
Povoliť aj porty HTTP a HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Povoľte bránu firewall
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Znova skontrolujte stav brány firewall.
$ sudo ufw status
Mali by ste vidieť podobný výstup.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Krok 2 - Nainštalujte Docker a Docker Compose
Tento krok sa vyžaduje na serveri aj na klientskom počítači.
Ubuntu 22.04 sa dodáva so staršou verziou Docker. Ak chcete nainštalovať najnovšiu verziu, najprv importujte kľúč Docker GPG.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Vytvorte súbor úložiska Docker.
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Aktualizujte zoznam systémového úložiska.
$ sudo apt update
Nainštalujte najnovšiu verziu Docker.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Skontrolujte, či je spustený.
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-04-13 09:37:09 UTC; 3min 47s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 2106 (dockerd)
Tasks: 7
Memory: 26.0M
CPU: 267ms
CGroup: /system.slice/docker.service
??2106 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
V predvolenom nastavení Docker vyžaduje oprávnenia root. Ak sa chcete vyhnúť používaniu sudo
pri každom spustení príkazu docker
, pridajte svoje používateľské meno do skupiny docker
.
$ sudo usermod -aG docker $(whoami)
Ak chcete povoliť túto zmenu, budete sa musieť odhlásiť zo servera a znova sa prihlásiť ako rovnaký používateľ alebo použiť nasledujúci príkaz.
$ su - ${USER}
Potvrďte, že váš používateľ je pridaný do skupiny Docker.
$ groups
navjot wheel docker
Krok 3 - Nakonfigurujte register Docker
Vytvorte užívateľské adresáre
Vytvorte adresár pre konfiguráciu registra.
$ mkdir ~/docker-registry
Prepnite sa do adresára docker-registry
.
$ cd ~/docker-registry
Vytvorte adresár na uloženie overovacieho hesla HTTP, konfiguračných súborov Nginx a certifikátov SSL.
$ mkdir auth
Vytvorte ďalší adresár na ukladanie denníkov Nginx.
$ mkdir logs
Vytvorte Amazon S3 Bucket
Údaje registra a obrázky môžete uložiť na server alebo použiť službu cloudového hostingu. V našom návode budeme používať cloudovú službu Amazon S3.
Ďalším krokom je nastavenie konfiguračného súboru s niekoľkými dôležitými nastaveniami. Tieto nastavenia je možné definovať aj v súbore docker-compose.yml
, ale oveľa lepšie je mať samostatný súbor.
Vytvorte vedro s nasledujúcimi nastaveniami.
- ACL by malo byť vypnuté.
- Verejný prístup do vedra by mal byť zakázaný.
- Verzia segmentu by mala byť zakázaná.
- Povoľte šifrovanie Bucket pomocou spravovaných kľúčov Amazon S3. (SSE-S3)
- Uzamknutie objektu by malo byť vypnuté.
Vytvorte používateľa IAM s nasledujúcou politikou.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::S3_BUCKET_NAME"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::S3_BUCKET_NAME/*"
}
]
}
Nahraďte S3_BUCKET_NAME
názvom vášho vedra S3.
Poznamenajte si tajný kľúč, tajnú hodnotu a oblasť vedra, ktoré chcete použiť neskôr.
Vytvorte súbor Docker Compose File
Vytvorte súbor docker-compose.yml
a otvorte ho na úpravy.
$ nano docker-compose.yml
Vložte do nej nasledujúci kód.
services:
registry:
image: registry:2
restart: always
environment:
- REGISTRY_STORAGE=s3
- REGISTRY_STORAGE_S3_REGION=us-west-2
- REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry
- REGISTRY_STORAGE_S3_ENCRYPT=true
- REGISTRY_STORAGE_S3_CHUNKSIZE=5242880
- REGISTRY_STORAGE_S3_SECURE=true
- REGISTRY_STORAGE_S3_ACCESSKEY=AKIA3FIG4NVFNXKQXMSJ
- REGISTRY_STORAGE_S3_SECRETKEY=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
- REGISTRY_STORAGE_S3_V4AUTH=true
- REGISTRY_STORAGE_S3_ROOTDIRECTORY=/image-registry
- REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=inmemory
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=false
nginx:
image: "nginx:alpine"
ports:
- 443:443
links:
- 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 súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.
Poďme si prejsť, čo sme nastavili v našom súbore na zostavenie.
- REGISTRY_STORAGE nastavuje typ úložiska. Vybrali sme s3, pretože používame Amazon S3.
- REGISTRY_STORAGE_S3_REGION nastavuje oblasť vášho segmentu S3.
- REGISTRY_STORAGE_S3_BUCKET nastavuje názov vášho segmentu S3.
- REGISTRY_STORAGE_S3_ENCRYPT – nastavte ju na hodnotu true, ak ste povolili šifrovanie segmentu.
- REGISTRY_STORAGE_S3_CHUNKSIZE nastavuje veľkosť odovzdávaných blokov. Mala by byť väčšia ako 5 MB (5 * 1024 * 1024).
- REGISTRY_STORAGE_S3_SECURE – ak sa chystáte používať HTTPS, nastavte ju na hodnotu true.
- REGISTRY_STORAGE_S3_ACCESSKEY a REGISTRY_STORAGE_S3_SECRETKEY – Poverenia používateľa, ktoré ste získali po vytvorení používateľa IAM.
- REGISTRY_STORAGE_S3_V4AUTH – nastavte ju na hodnotu true, ak používate overenie AWS verzie 4. Ak sa vám zobrazujú chyby súvisiace s prihlásením S3, nastavte ho na hodnotu false.
- REGISTRY_STORAGE_S3_ROOTDIRECTORY – nastavuje koreňový adresár vo vašom segmente, v ktorom budú uložené vaše údaje registra.
- REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR – nastavuje umiestnenie vyrovnávacej pamäte. V našom prípade ho ukladáme do pamäte. Môžete ho tiež nastaviť na používanie Redis.
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED – Ak chcete vypnúť službu kontroly stavu úložiska v databáze Registry, nastavte ju na hodnotu false. V databáze Registry sa vyskytla chyba, ktorá môže spôsobiť problémy, ak ju nenastavíte na hodnotu false.
Prvým krokom je získať najnovší obrázok verzie 2 registra Docker z centra. Nepoužívame najnovšiu značku, pretože môže spôsobiť problémy v prípade aktualizácie hlavnej verzie. Nastavenie na 2 vám umožní získať všetky aktualizácie 2.x a zároveň zabrániť automatickej aktualizácii na ďalšiu hlavnú verziu, ktorá môže priniesť prelomové zmeny.
Kontajner databázy Registry je nastavený na reštartovanie vždy v prípade zlyhania alebo neočakávaného vypnutia.
Pre úložisko Amazon S3 sme nastavili rôzne premenné prostredia. Poďme si ich rýchlo prejsť.
Register Docker komunikuje cez port 5000, čo je to, čo sme na našom serveri vystavili dockeru.
Mapovanie ./auth:/etc/nginx/conf.d
zaisťuje, že všetky nastavenia Nginx sú dostupné v kontajneri.
./auth/nginx.conf:/etc/nginx/nginx.conf:ro
mapuje súbor nastavení Nginx zo systému do jedného v kontajneri v režime iba na čítanie.
./logs:/var/log/nginx
umožňuje prístup k protokolom Nginx v systéme mapovaním do adresára protokolov Nginx v kontajneri.
Nastavenia registra Docker sú uložené v súbore /etc/docker/registry/config.yml
v kontajneri a namapovali sme ho na súbor config.yml
v aktuálnom adresár, ktorý vytvoríme v ďalšom kroku.
Nastavte overenie
Ak chcete nastaviť autentifikáciu HTTP, musíte si nainštalovať balík httpd-tools
.
$ sudo apt install apache2-utils -y
Vytvorte súbor s heslom v adresári ~/docker-registry/auth
.
$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1
New password:
Re-type new password:
Adding password for user user1
Príznak -c
dáva príkazu príkaz na vytvorenie nového súboru a príznak -B
má použiť algoritmus bcrypt podporovaný Dockerom. Nahraďte user1
užívateľským menom podľa vášho výberu.
Ak chcete pridať ďalších používateľov, spustite príkaz znova, ale bez príznaku -c
.
$ htpasswd -B ~/docker-registry/auth/registry.password user2
Teraz bude súbor namapovaný na kontajner databázy Registry na overenie.
Krok 4 – Nainštalujte SSL
Na vygenerovanie certifikátu SSL musíme nainštalovať Certbot. Certbot môžete nainštalovať pomocou úložiska Ubuntu alebo získať najnovšiu verziu pomocou nástroja Snapd. Budeme používať verziu Snapd.
Ubuntu 22.04 sa štandardne dodáva s nainštalovaným Snapd. Spustite nasledujúce príkazy, aby ste sa uistili, že vaša verzia Snapd je aktuálna.
$ sudo snap install core && sudo snap refresh core
Nainštalujte Certbot.
$ sudo snap install --classic certbot
Pomocou nasledujúceho príkazu zaistite spustenie príkazu Certbot vytvorením symbolického odkazu na adresár /usr/bin
.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Spustite nasledujúci príkaz na vygenerovanie certifikátu SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d registry.example.com
Vyššie uvedený príkaz stiahne certifikát do adresára /etc/letsencrypt/live/registry.example.com
na vašom serveri.
Vygenerujte certifikát Diffie-Hellman group.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Skontrolujte službu plánovača obnovy Certbot.
$ sudo systemctl list-timers
Ako jednu zo služieb naplánovaných na spustenie nájdete snap.certbot.renew.service
.
NEXT LEFT LAST PASSED UNIT ACTIVATES
.....
Sun 2023-04-14 00:00:00 UTC 19min left Sat 2023-02-25 18:04:05 UTC n/a snap.certbot.renew.timer snap.certbot.renew.service
Sun 2023-04-14 00:00:20 UTC 19min left Sat 2023-02-25 10:49:23 UTC 14h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2023-04-14 00:44:06 UTC 3h 22min left Sat 2023-02-25 20:58:06 UTC 7h ago apt-daily.timer apt-daily.service
Vykonajte suchý chod procesu a skontrolujte, či obnovenie SSL funguje správne.
$ sudo certbot renew --dry-run
Ak nevidíte žiadne chyby, všetko je nastavené. Váš certifikát sa automaticky obnoví.
Skopírujte súbor Dhparam do kontajnera
Skopírujte certifikát Diffie-Hellman group do adresára ~/docker-registry/auth
, ktorý bude namapovaný na kontajner.
$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth
Krok 5 - Nakonfigurujte Nginx
Ďalší krok zahŕňa konfiguráciu servera Nginx ako front-end proxy pre server databázy Registry Docker. Register Docker sa dodáva so vstavaným serverom pracujúcim na porte 5000. Umiestníme ho za Nginx.
Vytvorte a otvorte súbor ~/docker-registry/auth/nginx.conf
na úpravu.
$ sudo nano ~/docker-registry/auth/nginx.conf
Vložte do nej nasledujúci kód.
events {
worker_connections 1024;
}
http {
upstream docker-registry {
server registry:5000;
}
## Set a variable to help us decide if we need to add the
## 'Docker-Distribution-Api-Version' header.
## The registry always sets this header.
## In the case of nginx performing auth, the header is unset
## since nginx is auth-ing before proxying.
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
'' 'registry/2.0';
}
server {
listen 443 ssl http2;
server_name 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;
# Recommendations from 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-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-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/conf.d/dhparam.pem;
resolver 8.8.8.8;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
chunked_transfer_encoding on;
location /v2/ {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
# To add basic authentication to v2 use auth_basic setting.
auth_basic "Registry realm";
auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;
## If $docker_distribution_api_version is empty, the header is not added.
## See the map directive above where this variable is defined.
add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;
proxy_pass http://docker-registry;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
}
Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.
Krok 6 - Spustite register Docker
Prepnite sa do adresára Docker Registry.
$ cd ~/docker-registry
Spustite dokovací kontajner.
$ docker compose up -d
Skontrolujte stav kontajnerov.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3328b7e36bb2 nginx:alpine "/docker-entrypoint.…" About a minute ago Up 3 seconds 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-registry-nginx-1
bf7cdfc0e013 registry:2 "/entrypoint.sh /etc…" About a minute ago Up About a minute 5000/tcp docker-registry-registry-1
Prihláste sa do registra Docker.
$ docker login -u=user1 -p=password https://registry.example.com
Dostanete nasledujúci výstup.
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/username/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Môžete tiež otvoriť adresu URL https://registry.example.com/v2/
vo svojom prehliadači a bude vyžadovať používateľské meno a heslo. Mali by ste vidieť prázdnu stránku s {}.
Adresu URL na termináli môžete skontrolovať pomocou curl
.
$ curl -u user1 -X GET https://registry.example.com/v2/
Enter host password for user 'user1':
{}
Stiahnite si najnovší obrázok dokovacej stanice Ubuntu.
$ docker pull ubuntu:latest
Označte tento obrázok pre súkromný register.
$ docker tag ubuntu:latest registry.example.com/ubuntu2204
Vložte obrázok do registra.
$ docker push registry.example.com/ubuntu2204
Otestujte, či bol push úspešný.
$ curl -u user1 -X GET https://registry.example.com/v2/_catalog
Enter host password for user 'user1':
{"repositories":["ubuntu2204"]}
Po zobrazení výzvy zadajte svoje overovacie heslo Nginx a uvidíte zoznam úložísk dostupných prostredníctvom registra.
Odhláste sa pomocou terminálu a vymažte poverenia.
$ docker logout https://registry.example.com
Removing login credentials for registry.example.com
Skontrolujte zoznam obrázkov Docker, ktoré sú momentálne k dispozícii na použitie.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2 8db46f9d7550 2 weeks ago 24.2MB
nginx alpine 8e75cbc5b25c 2 weeks ago 41MB
ubuntu latest 08d22c0ceb15 5 weeks ago 77.8MB
registry.example.com/ubuntu2204 latest 08d22c0ceb15 5 weeks ago 77.8MB
Krok 7 – Prístup a používanie registra Docker z klientskeho počítača
Prihláste sa na svoj klient-server. V kroku 1 sme nainštalovali Docker na klientsky počítač.
Prihláste sa do súkromného registra Docker z klientskeho počítača.
$ docker login -u=user1 -p=password https://registry.example.com
Vytiahnite obraz Ubuntu z registra.
$ docker pull registry.example.com/ubuntu2204
Uveďte zoznam všetkých obrázkov na vašom klientskom počítači.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.example.com/ubuntu2204 latest 08d22c0ceb15 5 weeks ago 77.8MB
Vytvorte a spustite kontajner pomocou prevzatého obrázka.
$ docker run -it registry.example.com/ubuntu2204 /bin/bash
Budete prihlásení do Shell v kontajneri Ubuntu.
root@647899f255db:
Ak chcete skontrolovať verziu systému Linux, spustite nasledujúci príkaz.
root@a2da49fdbea9$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
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"
UBUNTU_CODENAME=jammy
Teraz môžete začať používať register Docker zo svojich klientskych počítačov.
Záver
Týmto sa končí náš návod na nastavenie súkromného registra Docker na serveri Ubuntu 22.04, ktorý používa Amazon S3 ako úložisko. Ak máte nejaké otázky, napíšte ich do komentárov nižšie.