Einführung
Wenn Sie eine reibungslose CI/CD-Entwicklung mit der Docker-Plattform sicherstellen möchten, sollten Sie die Einrichtung einer privaten Docker-Registrierung in Erwägung ziehen. Es beschleunigt nicht nur die Bereitstellung, sondern ist auch eine praktische Methode zur Verteilung von Ressourcen und zur gemeinsamen Nutzung von Docker-Images zwischen Containern.
In diesem Tutorial erfahren Sie, wie Sie eine private Docker-Registrierung einrichten und für den externen Zugriff konfigurieren.
Voraussetzungen
- Zugriff auf ein Benutzerkonto mit sudo oder root Privilegien
- Ein Client-Server
- Ein Server für die private Docker-Registrierung
- Docker und Docker–Compose auf beiden Servern
- Nginx auf dem privaten Docker Registry-Server
Was ist eine private Docker-Registrierung
Docker-Registrierung ist eine serverseitige Anwendung und Teil des Platform-as-a-Service-Produkts von Docker. Es ermöglicht Ihnen, alle Ihre Docker-Images lokal an einem zentralen Ort zu speichern.
Wenn Sie eine private Registrierung einrichten, weisen Sie einen Server zu, der über das Internet mit Docker Hub kommuniziert. Die Rolle des Servers besteht darin, Images zu ziehen und zu verschieben, sie lokal zu speichern und sie mit anderen Docker-Hosts zu teilen.
Durch den Betrieb einer extern zugänglichen Registrierung können Sie wertvolle Ressourcen sparen und Prozesse beschleunigen. Mit der Software können Sie Images abrufen, ohne eine Verbindung zum Docker-Hub herstellen zu müssen, wodurch Bandbreite gespart und das System vor potenziellen Online-Bedrohungen geschützt wird.
Docker-Hosts können über eine sichere Verbindung auf das lokale Repository zugreifen und Images aus der lokalen Registrierung kopieren, um ihre eigenen Container zu erstellen.
Bevor Sie beginnen
Wie im Abschnitt „Voraussetzungen“ aufgeführt, geht das Handbuch davon aus, dass Docker und Docker-Compose bereits auf allen Servern installiert sind.
Um zu überprüfen, ob Sie über die erforderliche Software verfügen, können Sie ihre Release-Versionen mit den folgenden Befehlen überprüfen:
docker version
docker-compose version
Außerdem sollten Sie sicherstellen, dass der Docker-Dienst gestartet wurde und so eingerichtet ist, dass er beim Booten aktiviert wird:
sudo systemctl start docker
sudo systemctl enable docker
Installieren und konfigurieren Sie die private Docker-Registrierung
Schritt 1:Registrierungsverzeichnisse erstellen
Beginnen Sie mit der Konfiguration des Servers, der die private Registry hosten soll. Sie möchten zuerst ein neues Verzeichnis erstellen, in dem alle erforderlichen Konfigurationsdateien gespeichert werden.
1. Der folgende Befehl erstellt ein neues Projektverzeichnis mit der Bezeichnung registry
und zwei Unterverzeichnisse - nginx
und auth
:
mkdir -p registry/{nginx, auth}
2. Wechseln Sie in die registry
und erstellen Sie zwei neue Verzeichnisse in nginx
:
cd registry/
mkdir -p nginx/{conf.d/,ssl}
3. Zeigen Sie die Hierarchie der neu erstellten Verzeichnisse an, indem Sie Folgendes eingeben:
tree
Schritt 2:Docker-Compose-Skript erstellen und Dienste definieren
Als Nächstes müssen Sie eine neue docker-compose.yml
erstellen und konfigurieren Skript. Das Skript definiert die Docker-Compose-Version sowie die Dienste, die Sie zum Einrichten einer privaten Registrierung benötigen.
1. Erstellen Sie eine neue Datei, während Sie sich in der registry
befinden Verzeichnis, mit einem Texteditor Ihrer Wahl:
nano docker-compose.yml
2. Es gibt ein paar Dinge, die Sie in dieser Konfigurationsdatei definieren müssen, also folgen Sie genau und fügen Sie jeden Abschnitt des Inhalts sorgfältig hinzu:
version: '3'
services:
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: local
3. Speichern und schließen Sie die Datei.
Die Konfiguration erklärt:
Zunächst definieren Sie die Version von Docker-Compose, die Sie verwenden möchten. In diesem Beispiel ist es version: '3'
. Dann fahren Sie mit der Definition aller Komponenten der Docker-Registrierung fort, beginnend mit #Registry
Dienst.
Docker Registry ist im Wesentlichen ein Container, der das Registrierungs-Image ausführt, weshalb das Image als registry:2
definiert ist .
restart: always
hinzufügen line stellt sicher, dass Sie Docker Registry als Dienst starten, sobald Sie das System hochfahren.
Ermittlung der Ports 5000:5000
weist Docker an, dass der Host und der laufende Container über die definierten Portnummern kommunizieren.
Der Dienst stellt das Docker-Volume registrydata
bereit und das lokale Verzeichnis auth
, zusammen mit seiner Authentifizierungsdatei registry.passwd
.
Das nächste Element ist der #Nginx Service
. Die Konfiguration beschreibt, dass der Dienst auf den Ports 80:80
ausgeführt wird (HTTPS) und 443:443
(HTTPS). Es wird das lokale Verzeichnis für die virtuelle Konfiguration bereitgestellt (conf.d
) und SSL-Zertifikate (ssl
).
Stellen Sie schließlich mynet
ein mit einem Brückentreiber und den registrydata
mit einem lokalen Treiber als Parameter für das benutzerdefinierte Netzwerk.
Schritt 3:Richten Sie die Nginx-Portweiterleitung ein
Der nächste Schritt besteht darin, einen virtuellen Nginx-Host zu konfigurieren und ihn für den Nginx-Dienst zu konfigurieren.
1. Wechseln Sie zu nginx/conf.d/
Verzeichnis, das Sie im vorherigen Schritt erstellt haben:
cd nginx/conf.d/
2. Erstellen Sie eine neue virtuelle Hostdatei namens registry.conf
:
nano registry.conf
3. Fügen Sie den folgenden Inhalt hinzu:
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.example-server.com;
return 301 https://registry.example-server.com$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.example-server.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
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://docker-registry;
proxy_set_header Host $http_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 900;
}
}
4. Speichern Sie die Datei und kehren Sie zur Terminal-Shell zurück.
Schritt 4:Erhöhen Sie die Upload-Größe der Nginx-Datei
Standardmäßig begrenzt Nginx die Größe des Datei-Uploads auf 1 MB . Da viele Docker-Images diese Zahl überschreiten, empfiehlt es sich, die maximale Dateigröße auf Nginx zu erhöhen. Stellen Sie sicher, dass Sie Bilder mit größerer Dateigröße hochladen können, indem Sie max_body_size
festlegen auf 2 GB .
1. Erstellen Sie eine zusätzliche Konfigurationsdatei mit:
nano additional.conf
2. Fügen Sie der Datei die folgende Zeile hinzu:
client_max_body_size 2G;
3. Speichern und schließen Sie die Datei.
Schritt 5:SSL-Zertifikat und Basisauthentifizierung konfigurieren
1. Die SSL-Zertifikatsdateien Ihrer Domain müssen in den ssl
kopiert werden Verzeichnis. Führen Sie dazu die Befehle aus:
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
2. Wechseln Sie dann zu auth
Verzeichnis:
cd auth
3. Und fordern Sie eine neue Passwortdatei namens registry.passwd
an für Ihren Benutzer:
htpasswd -Bc registry.passwd example
4. Geben Sie ein starkes Passwort ein und wiederholen Sie es zur Bestätigung. Damit haben Sie Ihrem Benutzer ein Passwort hinzugefügt.
Schritt 6:Root-CA-Zertifikat hinzufügen
Jetzt müssen Sie Docker und dem System, an dem Sie arbeiten, das Root-CA-Zertifikat hinzufügen.
1. Exportieren Sie die .crt
Datei mit OpenSSL durch Eingabe von:
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
2. Kopieren Sie das Root-Zertifikat in ein neues Verzeichnis für Docker-Zertifikate:
mkdir -p /etc/docker/certs.d/registry.example-server.com/
cp rootCA.crt /etc/docker/certs.d/example-server.com/
3. Kopieren Sie als Nächstes dasselbe Zertifikat in ein anderes neues Verzeichnis unter dem Namen /usr/share/ca-certificate/extra
:
mkdir -p .usr.share.ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
4. Konfigurieren Sie das neu erstellte ca-certificate
neu Paket durch Eingabe von:
dpkg-reconfigure ca-certificates
5. Starten Sie abschließend den Docker-Dienst neu:
systemctl restart docker
Schritt 7:Docker-Registrierung ausführen
Wenn alles eingerichtet und bereit ist, können Sie den Docker Registry-Container mit Docker-Compose erstellen:
docker-compose up -d
Überprüfen Sie, ob die Registrierung und die Nginx-Dienste ausgeführt werden:
docker-compose ps
netstat -plntu
Die Ausgabe sollte Ihnen die Dienste und ihre zugewiesenen Ports zeigen.
Image von Docker Hub in eine private Registry ziehen
1. Um ein Image von Docker Hub lokal in Ihrer privaten Registrierung zu speichern, verwenden Sie docker pull
Befehl:
docker pull [docker_image]
2. Fügen Sie dem Image ein Tag hinzu, um es für die private Registrierung zu kennzeichnen:
docker image tag [docker_image] registry.example-server.com/[new_image_name]
3. Sie können überprüfen, ob das Docker-Image lokal verfügbar ist, indem Sie das System auffordern, alle lokal gespeicherten Images aufzulisten:
docker images
So übertragen Sie das Docker-Image in die private Registry
1. Um ein Image von einem Docker-Host auf den privaten Docker-Registrierungsserver zu pushen, müssen Sie sich zuerst mit dem folgenden Befehl bei der Registrierung anmelden:
docker login https://registry.example-server.com/v2/
2. Geben Sie den Benutzernamen ein und Passwort Sie für den virtuellen Host definiert haben.
3. Jetzt können Sie Ihr Image mit folgendem Befehl in die private Registry verschieben:
docker push registry.example-server.com/[new_image_name]
4. Sehen Sie sich eine Liste der Images an, die in der privaten Docker-Registrierung gespeichert sind:
http -a example https://registry.example-server.com/v2/_catalog