Suchen Sie nach einem Ort, an dem Sie Ihre benutzerdefinierten Docker-Images für Ihre persönlichen Projekte sicher speichern oder in Ihrer Organisation verwenden können? Oder vielleicht ein zentralisiertes System zur Verwaltung Ihrer Continuous-Integration- und Deployment-Prozesse? Ein Ort, an dem Sie Ihre benutzerdefinierten Images für Ihre Anwendung nach Belieben abrufen und hochladen und die Bereitstellungsrate verbessern können?
Suchen Sie nicht weiter! Eine private Docker-Registrierung macht all das möglich! Dieses Schritt-für-Schritt-Tutorial führt Sie durch den Aufbau Ihrer eigenen privaten Docker-Registrierung. Tauchen Sie ein, um loszulegen!
Voraussetzungen
Stellen Sie sicher, dass Sie Folgendes haben, um diesem Tutorial zu folgen:
- Zwei Ubuntu 20.04 LTS Geräte. Einer hostet die Docker-Registrierung und der andere fungiert als Client-Computer, um Anforderungen an Ihre Docker-Registrierung zu senden.
- NGINX wird nur auf dem Hostcomputer zum Einrichten der SSL-Verschlüsselung und der HTTP-Authentifizierung benötigt.
- Ein registrierter Domänenname. NGINX leitet den Datenverkehr zu Ihrem registrierten Domänennamen an Ihre Docker-Registrierung weiter, die in einem Container ausgeführt wird.
- Für dieses Tutorial benötigen Sie Docker sowohl auf dem Host- als auch auf dem Client-Rechner. Die Standardinstallation ist ausreichend.
- Docker-compose in der Hostmaschine der Docker-Registrierung, um die Komponenten für Ihre Docker-Registrierung einzurichten und zu starten. Verwandt:Alles, was Sie über die Verwendung von Docker Compose wissen müssen
Einrichten der Docker-Registrierung
Der erste Schritt, den Sie unternehmen müssen, besteht darin, die Docker-Registrierung auf dem Hostgerät einzurichten, die als kostenloses Image auf Docker Hub bereitgestellt wird.
Anstatt darauf beschränkt zu sein, Docker-Befehle auszuführen, um diese Aufgabe auszuführen, erstellen Sie eine docker-compose.yml
Datei. Die Datei verwendet das Docker-Compose-Dateiformat und kann die für die Docker-Registrierung erforderlichen Komponenten relativ einfach einrichten.
Um mitzumachen, öffnen Sie Ihren bevorzugten SSH-Client und stellen Sie eine Verbindung zu dem Gerät her, das der Registrierungsserver sein wird.
1. Im /home erstellen Sie ein Verzeichnis namens docker-registry mit dem mkdir
Befehl:
# Creating working directory
mkdir docker-registry
2. Navigieren Sie zur Docker-Registry Verzeichnis:
# Navigate to the working directory
cd ~/docker-registry
3. Innerhalb der Docker-Registrierung erstellen Sie ein Unterverzeichnis namens data . Innerhalb der Daten Verzeichnis speichert die Docker-Registrierung die Docker-Images. Die Daten Das Verzeichnis fungiert als Dateisystem für die Docker-Registrierung, um die Docker-Images beizubehalten.
# Create filesystem to persist data
mkdir data
4. Innerhalb der Docker-Registrierung erstellen Sie eine docker-compose.yml Datei:
# Create the docker-compose file
nano docker-compose.yml
In der neu erstellten Datei finden Sie Konfigurationen zum Setzen der Registry. Unter den Einstellungen werden Sie bemerken:
- Legt die
registry
fest Dienst mit demregistry:latest
Bild mit demlatest
Tag. - Legt die Neustartrichtlinie für die
registry
fest Dienst zualways
. Sofern die Docker-Engine läuft, wird dieregistry
Der Dienst wird immer neu gestartet, wenn er gestoppt wird. - Die
ports
Abschnitt bildet den Port5000
ab im Registrierungscontainer auf Port5000
auf dem Host-Rechner. - Die
registry
Dienst in derenvironment
Abschnitt legt die UmgebungsvariableREGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
fest zu den Daten zuvor erstelltes Verzeichnis. - Docker benötigt ein Volume, um die Docker-Images in der
registry
zu speichern Container. Sie werden dievolumes
hinzufügen Objekt, um die /Daten zuzuordnen Verzeichnis auf dem Hostcomputer in das Verzeichnis/data
Verzeichnis im Container.
Das Mapping speichert die Daten im Dateisystem des Hostcomputers und nicht im Container. Da Docker die Daten jetzt auf dem Hostcomputer speichert, können sie gesichert, migriert, verschlüsselt oder ersetzt werden.
Unten sehen Sie die vollständige YAML-Konfiguration für die Komponenten, die zum Starten und Ausführen der Docker-Registrierung erforderlich sind. Kopieren Sie den unten stehenden YAML-Code und fügen Sie ihn in docker-compose.yml ein Datei, die Sie erstellt haben, und speichern Sie sie mit CTRL + S
und drücken Sie CTRL + X
zum Beenden:
version: '3.3'
services:
registry:
image: registry:latest
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- ./data:/data
Docker-compose führt mehrere Container als eine einzige Anwendung aus. Die
docker-compose.yml
Datei konfiguriert diese mehreren Container als Teil von Diensten.
5. Führen Sie nun die Docker-Compose-Datei aus und erstellen und starten Sie die Docker-Registrierung:
# Start docker registry application
sudo docker-compose up
In der folgenden Befehlsausgabe sehen Sie, wie die Docker-Registrierung ausgeführt wird. Um die Anwendung zu schließen, drücken Sie CTRL + C
.

Einrichten von NGINX
Nachdem Sie die Docker-Registrierung eingerichtet haben, ist es an der Zeit, NGINX auf dem Hostcomputer einzurichten. NGINX leitet den Datenverkehr von Clientgeräten an die Docker-Registrierung weiter. Für dieses Tutorial leiten Sie den Datenverkehr über einen Domänennamen weiter. Lesen Sie weiter, um diesen Schritt in Angriff zu nehmen.
Zunächst müssen Sie die NGINX-Portweiterleitung für Ihre Domain über /etc/nginx/sites-available/your_domain_name einrichten Datei.
1. Erstellen Sie die Datei mit dem folgenden Befehl:
# Creating configuration for your domain
sudo nano /etc/nginx/sites-available/your_domain_name
Sie werden viele Verweise auf finden your_domain_name in den folgenden Abschnitten . Diese Zeichenfolge ist ein Platzhalter. Vergessen Sie nicht, ihn durch einen Domänennamen zu ersetzen, den Sie besitzen, wenn Sie die Befehle selbst ausprobieren. In den Beispielen Registry.joeshiett.xyz ist der ausgewählte Domänenname.
2. Kopieren Sie die folgende NGINX-Konfiguration und fügen Sie sie zu your_domain_name hinzu Datei, die Sie erstellt haben:
server {
listen 80;
# Replace your_domain_name with your domain name
server_name your_domain_name;
location / {
# 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;
}
proxy_pass http://localhost:5000;
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;
}
}
3. Die Portweiterleitung ist noch nicht abgeschlossen. Sie müssen zuerst einen symbolischen Link anhängen. Sie werden /etc/nginx/sites-available/your_domain_name verlinken Konfigurationsdatei nach /etc/nginx/sites-enabled/. Es folgt der vollständige Befehl:
cd /etc/nginx/sites-enabled/ && sudo ln -s /etc/nginx/sites-available/your_domain_name .
4. Starten Sie den NGINX-Dienst neu, nachdem Sie den symbolischen Link erstellt haben:
# Restarting Nginx service
sudo systemctl restart nginx
Öffnen Sie den Browser auf Ihrem Client-Gerät und navigieren Sie zu https://your_domain_name/v2/
um auf v2
zuzugreifen endpoint, die Docker-HTTP-API.
Das Bild unten zeigt die erwartete Ausgabe des Host-Terminals nach dem Navigieren zum Link. Das Bild zeigt auch, dass der Browser ein GET
gesendet hat Anfrage an die Docker-HTTP-API über v2
Endpunkt.

Nach dem Navigieren zu v2
Endpunkt über den Link, ein leeres JSON-Objekt – {}
– wird im Browserfenster angezeigt.
Konfigurieren der NGINX-Datei-Upload-Größe
Die standardmäßige Upload-Größenbeschränkung von NGINX ist 1m
, wobei m
steht für Megabyte. Das Standardlimit reicht bei weitem nicht aus, um Docker-Images in Ihre Registrierung hochzuladen. Um diesen Wert zu ändern, bearbeiten Sie nginx.conf, daher akzeptiert NGINX das Hochladen großer Dateien.
1. Melden Sie sich erneut beim Hostcomputer an.
2. Bearbeiten Sie die /etc/nginx/nginx.conf Datei:
3. Unter dem http
Abschnitt in nginx.conf
Datei, fügen Sie die folgende Zeile hinzu, um die Upload-Größe auf 8.192 Megabyte zu erhöhen, und speichern Sie die Datei:
client_max_body_size 8192m;
Die Konfiguration sieht in etwa so aus:

SSL einrichten
Ein SSL-Zertifikat ist erforderlich, um die Verbindung zur Docker-Registry zu sichern. Um ein SSL-Zertifikat hinzuzufügen, müssen Sie Certbot auf dem Registrierungshost installieren.
Sie können Certbot mit dem Snap-Paketmanager installieren. Der Snap-Paketmanager ist in Ubuntu 20.04 bereits vorinstalliert.
1. Um Certbot zu installieren, führen Sie den folgenden Befehl auf Ihrem Hostcomputer aus:
# Install certbot using the snap package manager
sudo snap install --classic certbot
2. Fügen Sie Certbot zu PATH hinzu, damit Certbot-Befehle funktionieren können, indem Sie einen symbolischen Link erstellen:
# Attaching certbot to PATH
sudo ln -s /snap/bin/certbot /usr/bin/certbot
3. Führen Sie diesen Befehl aus, um ein Zertifikat zu erhalten und Certbot Ihre NGINX-Konfiguration automatisch bearbeiten zu lassen und auch den HTTPS-Zugriff für Ihre Domain zu aktivieren:
# Creating a certificate and enabling HTTPS access
sudo certbot --nginx
Certbot ändert den your_domain_name Konfigurationsdatei unter /etc/nginx/sites-enabled/ Verzeichnis und wenden Sie ein SSL-Zertifikat auf Ihren Domainnamen an.
Das Bild unten zeigt die endgültige Konfiguration für Ihren /etc/nginx/sites-enabled/your_domain_name Datei wird aussehen, nachdem Certbot die Zertifikate angewendet hat.

Wenn Sie zu https://your_domain_name/
navigieren , Sie werden feststellen, dass es mit dem Zertifikat von Certbot sicher ist.
Einrichten der HTTP-Authentifizierung für die Docker-Registrierung
Es ist immer eine gute Idee, gute Sicherheitspraktiken zu haben. So sichern Sie Ihre Docker-Registrierung und beschränken den Zugriff auf Sie und einige andere Benutzer, die Sie möglicherweise hinzufügen möchten. Sie verwenden die von HTTP Basic Auth bereitgestellte HTTP-Authentifizierung .
1. Die HTTP-Authentifizierung erfordert ein htpasswd Datei mit Ihrem Benutzernamen und Passwort. Um das htpasswd zu erstellen Authentifizierung müssen Sie die apache2-utils
installieren Paket:
# Installing apache2-utils package
sudo apt-get install apache2-utils
2. Nach der Installation von apache2-utils
Erstellen Sie eine registry.credentials Datei in /etc/nginx Verzeichnis mit dem httpasswd
Befehl. Fügen Sie einen bevorzugten Benutzernamen hinzu, indem Sie your_username
ersetzen im folgenden Befehl. Fügen Sie als Nächstes ein Passwort Ihrer Wahl hinzu, wenn Sie dazu aufgefordert werden. Der vollständige Befehl und seine Ausgabe sind unten aufgeführt.
# Creating to creating auth credentials
sudo htpasswd -c /etc/nginx/registry.credentials your_username

3. Nach dem Erstellen der registry.credentials navigieren Sie zu Ihrer NGINX-Konfigurationsdatei für Ihre Docker-Registrierung unter /etc/nginx/sites-available/your_domain_name . Fügen Sie den folgenden Text zur NGINX-Konfigurationsdatei im server
hinzu Abschnitt:
server {
...
...
location / {
...
auth_basic "Basic Auth";
auth_basic_user_file "/etc/nginx/registry.credentials";
...
}
}
4. Starten Sie NGINX erneut und wenden Sie die Konfigurationen mit dem folgenden Befehl erneut an:
# Restarting nginx
sudo systemctl restart nginx
Das folgende Bild zeigt dies, wenn Sie versuchen, auf https://your_domain_name/ zuzugreifen In Ihrem Browser werden Sie aufgefordert, Ihren Benutzernamen und Ihr Passwort einzugeben. Für dieses Tutorial wird die Docker-Registrierung unter einer Subdomäne registry.joeshiett.xyz ausgeführt , mit aktiviertem SSL.

Bild in privates Docker-Repository übertragen
Jetzt, da Ihre Docker-Registrierung ausgeführt wird und größere Datei-Uploads akzeptieren kann, werden Sie ein Image darauf übertragen. Um ein Image per Push in Ihre Docker-Registrierung zu übertragen, müssen Sie auf Ihren Clientcomputer zugreifen.
Wenn Sie kein Docker-Image lokal auf Ihrem Clientcomputer gespeichert haben, können Sie ein kostenloses von Docker Hub abrufen.
1. Führen Sie den folgenden Befehl aus, um ein Alpine-Linux-Image aus dem Docker-Hub abzurufen, und legen Sie den Namen des Images als test-image
fest , und führen Sie den Container in der interaktiven Shell aus:
# Pull and run Alpine container
sudo docker run --name test-image -it alpine:latest /bin/sh
2. Sobald Sie sich im Alpine-Container befinden, erstellen Sie eine Datei namens TEST . Diese Datei ist dann die Bestätigung, dass das Image, das Sie aus Ihrer Docker-Registrierung abrufen, dasjenige ist, das Sie gerade ändern:
# create a file called TEST
touch /TEST
3. Verlassen Sie die interaktive Shell, indem Sie exit
eingeben auf Ihrem Endgerät.
4. Erstellen Sie nun ein Docker-Image aus dem Alpine-Docker-Container mit dem Namen test-image
, Sie haben gerade angepasst:
# Creating Docker image
sudo docker commit test-image your_domain_name/test-image:latest
Das Alpine-Image, das Sie zuvor gezogen und angepasst haben, ist jetzt lokal mit einem Repository namens your_domain_name/test-image
verfügbar und markieren Sie latest
.
5. Um Ihr neu erstelltes Image per Push in Ihre Docker-Registrierung zu übertragen, melden Sie sich mit dem folgenden Befehl bei Ihrer Docker-Registrierung an:
# Login to Docker registry
sudo docker login https://your_domain_name
Sie werden aufgefordert, Ihren Benutzernamen und Ihr Passwort einzugeben, die Sie im vorherigen Abschnitt eingerichtet haben. Die Ausgabe ist:
...
Login Succeeded
...
6. Pushen Sie nach der Anmeldung das markierte Image in Ihr Docker-Repository:# Pushing docker image sudo docker push your_domain_name/test-image:latest
# Pushing docker image
sudo docker push your_domain_name/test-image:latest
Die Ausgabe des Befehls sieht folgendermaßen aus:

Bild aus privatem Docker-Repository abrufen
Nachdem Sie Ihr Docker-Image nun erfolgreich in Ihr privates Docker-Repository übertragen haben, ist es an der Zeit, das soeben übertragene Image abzurufen.
1. Zunächst müssen Sie sich bei Ihrem privaten Docker-Repository anmelden:# Login to Docker registry sudo docker login https://your_domain_name
# Login to Docker registry
sudo docker login https://your_domain_name
2. Nach der Anmeldung ziehen Sie das zuvor erstellte Docker-Image:
# Pull Docker image from Docker registry
sudo docker pull your_domain_name/test-image
Aus dem Bild unten können Sie sehen, dass Docker das test-image
abruft erfolgreich.

3. Zeit zum Ausführen einer interaktiven Shell:
sudo docker run -it your_domain_name/test-image /bin/sh
4. Führen Sie in der interaktiven Shell den folgenden Befehl aus:
ls
Auf dem Bild unten können Sie sehen, dass der TEST Die zuvor erstellte Datei befindet sich im Container.

Jetzt haben Sie Ihre Docker-Registrierung erfolgreich getestet und können loslegen!
Schlussfolgerung
In diesem Tutorial haben Sie Ihre eigene private Docker-Registrierung erstellt. Sie haben die erforderlichen Voraussetzungen installiert; SSL- und HTTP-Authentifizierung einrichten. Und dann haben Sie endlich ein Image aus Ihrer Registrierung gepusht und gezogen.
Also, welche Pakete planen Sie in Ihre Registry zu pushen?