So erstellen Sie eine private Docker-Registry und fügen Images über die Jenkins-Pipeline hinzu

In diesem Beitrag wird beschrieben, wie Sie eine lokale Docker-Registrierung in Ihrem Netzwerk einrichten und für Ihre Projekte verwenden. Dies ist eine Voraussetzung, wenn Sie Ihre eigenen Projekte auf Ihrem eigenen Kubernetes-Cluster bereitstellen und ausführen möchten und nicht alles der Öffentlichkeit zugänglich machen möchten. Die Docker-Registrierung selbst wird in Docker ausgeführt, Sie benötigen also einen bereitstehenden Docker-Host.

Voraussetzungen

Sie benötigen einen Docker-Host, um eine Registrierung auszuführen. Ich verwende mein Infrastruktur-Pi, um die Registrierung zu hosten (die auch mein Git, Jenkins usw. hostet). Siehe unter folgendem Link wie man docker auf dem raspberry pi installiert.

Starten Sie die Registry auf dem Docker-Host

I am running the docker registry on my "infra" host which is the same raspberry pi which also hosts my git and jenkins.

Es gibt ein offizielles Image auf docker hub welches man mit dem folgenden Befehl starten kann:

user1@host:~ $ docker run -d -p 5000:5000 --restart always --name registry registry:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
9fda8d8052c6: Pull complete 
5d54e960e981: Pull complete 
cb9be1f8a194: Pull complete 
9d2d3fd2527f: Pull complete 
356f0e046603: Pull complete 
Digest: sha256:d5f2fb0940fe9371b6b026b9b66ad08d8ab7b0d56b6ee8d5c71cb9b45a374307
Status: Downloaded newer image for registry:2
8401a825da711e9cc09fd2696fbcec326cadbef18f8bead6145960bcb6e98c56
user1@host:~ $ 

So überprüfen Sie, ob die Registry aktiv ist:

user1@host:~ $ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS          PORTS                                       NAMES
8401a825da71   registry:2   "/entrypoint.sh /etc…"   About a minute ago   Up 55 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   registry
user1@host:~ $ 

Verwendung der privaten Docker-Registry

Da die Registry standardmäßig nicht mit https und einem vertrauenswürdigen Protokoll eingerichtet ist, müssen alle Docker-Installationen in Ihrem lokalen Netzwerk so konfiguriert werden, dass sie mit dieser lokalen Registry kommunizieren dürfen.

Dazu muss die Datei /etc/docker/daemon.json erstellt oder so bearbeitet werden, dass sie enthält

{ 
  "insecure-registries": ["ip_of_your_docker_host:5000"] 
}

Ersetzen Sie ip_of_your_docker_host durch die IP-Adresse des Hosts, auf dem die Registrierung in Ihrem lokalen Netzwerk ausgeführt wird.

Verwalten des Image-Repositorys

Die Images sind Teil des lokalen Docker-Image-Repositorys des Docker-Hosts. Vorhandene Images können angezeigt werden mit:

$ docker image ls
REPOSITORY                        TAG       IMAGE ID       CREATED        SIZE
ip_of_your_docker_host:5000/test/testapp   latest    b23c2e895c08   39 hours ago   563MB
ip_of_your_docker_host:5000/test/testapp   <none>    12228dd0755a   39 hours ago   563MB
registry                          2         3c11102b9417   5 weeks ago    23.7MB

Images können direkt vom Docker-Host gelöscht werden mit:

$ docker image rm 3c25f5f5ab79
Untagged: ip_of_your_docker_host:5000/test/testapp@sha256:1981706291df4b5925bc5863490ed5326bd8bcfa46fcd6a9d134f3743475787a
Deleted: sha256:3c25f5f5ab79069b56f22587006671964a809ad8383f35ced4314eef384029d2

Sie können auch alle nicht verwendeten Artefakte, einschließlich Images, wie hier beschrieben bereinigen Link.

Pushen Sie Images aus der Jenkins-Pipeline

Der Host, auf dem der Jenkins läuft, sollte Docker installiert haben und Sie sollten die Änderung der unsicheren Registry auf diesem Host angewendet haben. Um über die Pipeline erstellte Images in die lokale Registry zu übertragen, fügen Sie Folgendes in den Jenkinsfile:

... 
stage('Docker') {
            steps {
                sh 'docker build . -t ip_of_your_docker_host:5000/test/springk8s:latest'
                sh 'docker push --all-tags ip_of_your_docker_host:5000/test/springk8s'
            }
        }
...

Ein Beispiel Projekt auf meiner github Seite enthält ein vollständiges Beispiel eines Jenkinsfile (und vieles mehr). Die Ausgabe eines solchen Build-Schritts in Jenkins könnte ungefähr so ​​aussehen.

+ docker build . -t registry.infra.local:5000/test/springk8s:latest
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile:
#1 transferring dockerfile: 241B done
#1 DONE 0.1s
#2 [internal] load .dockerignore
#2 transferring context: 2B done
#2 DONE 0.1s
#3 [internal] load metadata for docker.io/library/openjdk:17
#3 DONE 1.3s
#4 [1/2] FROM docker.io/library/openjdk:17@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8
#4 resolve docker.io/library/openjdk:17@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8 0.1s done
#4 sha256:fe66142579ff5bb0bb5cf989222e2bc77a97dcbd0283887dec04d5b9dfd48cfa 0B / 14.29MB 0.1s
...
#5 [internal] load build context
#5 transferring context: 19.01MB 1.1s done
#5 DONE 1.1s
#4 [1/2] FROM docker.io/library/openjdk:17@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8
#4 sha256:fe66142579ff5bb0bb5cf989222e2bc77a97dcbd0283887dec04d5b9dfd48cfa 10.49MB / 14.29MB 1.5s
...
#4 DONE 39.4s
#6 [2/2] ADD build/libs/spring-boot-0.0.1-SNAPSHOT.jar spring-boot-0.0.1-SNAPSHOT.jar
#6 DONE 17.0s
#7 exporting to image
#7 exporting layers
#7 exporting layers 0.6s done
#7 writing image sha256:98d4b24240e57cabe7975cbcfacca334c6887302ec75795677c2b46dca67439f done
#7 naming to registry.infra.local:5000/test/springk8s:latest 0.0s done
#7 DONE 0.6s
[Pipeline] sh
+ docker push registry.infra.local:5000/test/springk8s:latest
The push refers to repository [registry.infra.local:5000/test/springk8s]
3fa8f5b1bedc: Preparing
e017d39c755a: Preparing
03ee828ef0e4: Preparing
b0d4c4485e7e: Preparing
3fa8f5b1bedc: Pushed
03ee828ef0e4: Pushed
b0d4c4485e7e: Pushed
e017d39c755a: Pushed
latest: digest: sha256:81eb6fd89ca60864dcb5f43a9f6dcc706087295938f0611169315c57c56ace0f size: 1166
...
[Pipeline] End of Pipeline
Finished: SUCCESS

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert