webentwicklung-frage-antwort-db.com.de

(Kubernetes + Minikube) kann kein Docker-Image aus der lokalen Registrierung abrufen

Ich habe Docker auf meinem Computer eingerichtet und auch Minikube, in dem sich Docker befindet. Ich habe wahrscheinlich zwei Docker-Instanzen, die auf verschiedenen VMs ausgeführt werden

Ich baue ein Bild und markiere es, dann schiebe es in die lokale Registry und es wurde erfolgreich geschoben und ich kann es auch aus der Registry ziehen. Auch wenn ich curl starte, um die Tag-Liste zu erhalten, habe ich das Ergebnis erhalten. Hier ist, was ich getan habe

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker Push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

alle oben genannten Schritte funktionieren problemlos und problemlos.

Mein Problem ist, wenn ich Minikube starte und versuche, auf dieses Bild in der lokalen Registrierung zuzugreifen

Also wenn ich die nächsten Befehle ausführen

1- Sudo minikube start --insecure-registry 127.0.0.1:5000
2- eval $(minikube docker-env)
3- minikube ssh
4- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

im letzten Schritt (Punkt 4) gab es die nächste Nachricht

curl: (7) Verbindung zu 127.0.0.1-Port 5000 konnte nicht hergestellt werden: Verbindung abgelehnt

So kann ich von meinem Rechner aus auf die Bildregistrierung zugreifen, aber nicht von minikube aus, was natürlich Probleme mit mir macht, wenn ich dieses Image mit Kubernetes auf minikube implementiere und die Bereitstellung fehlschlägt, weil keine Verbindung zu http://127.0.0.1 hergestellt werden kann : 5000

Können Sie mir helfen, Minikube so zu konfigurieren, dass meine lokale Registry angezeigt wird, damit mein Problem gelöst wird, und ich das Image auf Minikube mithilfe von Kubernetes erfolgreich implementieren kann?

UPDATE

Ich verwende diese yaml-Datei (ich nannte sie ConsolePre.yaml), um mein Image mit kubernetes bereitzustellen

apiVersion: v1
  kind: Service
  metadata:
    name: tripbru-console
    labels:
      app: tripbru-console
  spec:
    ports:
      - port: 9080
        targetPort: 9080
        nodePort: 30181
    selector:
      app: tripbru-console
      tier: frontend
    type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tripbru-console
  labels:
    app: tripbru-console
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: tripbru-console
        tier: frontend
    spec:
      containers:
      - image: docker.local:5000/eliza/console:0.0.1
        name: tripbru-console
        ports:
        - containerPort: 9080
          name: tripbru-console

und wenn ich den nächsten Befehl ausführen, um die Änderungen anzuwenden

Sudo kubectl -f /PATH_TO_YAML_FILE/ConsolePre.yaml anwenden

das Ergebnis ist 

NAME                                      READY     STATUS         RESTARTS   AGE
po/tripbru-console-1655054400-x3g87       0/1       ErrImagePull   0          1m

und wenn ich beschreibe Befehl ausführen

Sudo kubectl beschreiben pod tripbru-console-1655054400-x3g87

ich habe die nächste Nachricht im Beschreibungsergebnis gefunden

Fehlerantwort vom Daemon: {"message": "Holen Sie https: //docker.local: 5000/v1/_ping : dial tcp: lookup docker.local on 10.0.2.3:53: read udp 10.0.2.15:57792-\u003e10.0.2.3:53: E/A-Zeitüberschreitung "}

und ich habe docker.local xxx.xxx.xx.4 in minikube/etc/hosts konfiguriert, also weiß ich nicht, woher 10.0.2.3:53 und 10.0.2.15:57792 kommen.

Wie kann ich dieses Problem auch lösen? 

Vielen Dank :)

6
mibrahim.iti

Das Problem besteht darin, dass Sie 127.0.0.1 an beliebiger Stelle verwenden. Das ist falsch.

Wenn also die IP-Adresse Ihres Computers 192.168.0.101 ist. Dann funktioniert unten

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker Push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

Da die Docker-Ausführung die Registrierung auf 127.0.0.1:5000 und 192.168.0.101:5000 abbildet. Jetzt funktioniert auf Ihrem Rechner nur dieser 127.0.0.1. Jetzt, wenn Sie verwenden

3- minikube ssh

Sie befinden sich in der Minikube-Maschine, und auf 127.0.0.1:5000 wird keine Registrierung ausgeführt. Also der Fehler. Die Registrierung ist innerhalb dieses Computers nicht über die IP-Adresse des Computers erreichbar.

Normalerweise löse ich dieses Problem, wenn Sie den Hostnamen sowohl lokal als auch innerhalb der anderen VMs verwenden.

Erstellen Sie auf Ihrem Computer also einen Eintrag in /etc/hosts

docker.local 127.0.0.1

Und ändern Sie Ihre Befehle in

1- docker build -t docker.local:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 docker.local:5000/eliza/console:0.0.1
4- docker Push docker.local:5000/eliza/console:0.0.1
5- curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

Und dann, wenn Sie minikube ssh verwenden, machen Sie einen Eintrag für docker.local in /etc/hosts.

docker.local 192.168.0.101

Dann curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

Bearbeiten-1

Für das TLS-Problem müssen Sie den Docker-Dienst in minikube stoppen 

systemctl stop docker

Dann /etc/systemd/system/docker.service.d/10-machine.conf bearbeiten und ändern

ExecStart =/usr/bin/Docker-Daemon -H TCP: //0.0.0.0: 2376 -H Unix: ///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem - tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider = virtualbox --insecure-registry 10.0.0.0/24

zu

ExecStart =/usr/bin/Docker-Daemon -H TCP: //0.0.0.0: 2376 -H Unix: ///var/run/docker.sock --tlsverify --tlscacert /etc/docker/ca.pem - tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider = virtualbox --insecure-registry 10.0.0.0/24 --insecure-registry docker.local: 5000 - unsichere-Registry 192.168.1.4:5000

Laden Sie dann den Daemon neu und starten Sie den Andockdienst

systemctl daemon-reload
systemctl start docker

Danach versuche zu ziehen

docker pull docker.local:5000/eliza/console:0.0.1

Und der Befehl sollte funktionieren

11
Tarun Lalwani

Wie kann ich von in einem Docker-Container aus auf Prozesse zugreifen, die auf der Hostmaschine ausgeführt werden?

Es ist eine beliebte Frage im Hafengebiet. Siehe hier. https://stackoverflow.com/a/24326540/6785908 .__ Es gibt auch andere Möglichkeiten, z. B. Für Docker auf Mac wird docker.for.mac.localhost DNS-Name in die Hostmaschine aufgelöst

Von https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers

Der Mac hat eine sich ändernde IP-Adresse (oder keine, wenn Sie kein Netzwerk haben Zugriff). Ab 17.06 empfehlen wir eine Verbindung zum Nur für Mac spezifizierter DNS-Name docker.for.mac.localhost, der .__ auflöst. an die vom Host verwendete interne IP-Adresse.

Angenommen, der Hauptzweck dieser Minikube ist das lokale Testen. Es gibt einen einfacheren Weg, den Docker-Container bereitzustellen (dies erfordert nicht einmal eine lokale Docker-Registrierung).

Methode 2: Richten Sie Ihre Docker-CLI auf den Docker-Daemon, der in Ihrer Minikube ausgeführt wird, und führen Sie dort den Docker-Build-Befehl aus.

Das erste, was Sie hier verstehen müssen, ist, wenn Sie das Docker in Ihrem Computer installieren. Es besteht aus 2 Teilen: 1) einem Docker-Cli, mit dem Sie mit dem Docker-Daemon interagieren können. 2) Ein Docker-Daemon. In dieser Methode weisen wir unser lokales Docker-Cli auf den Docker-Daemon von minikube und führen docker build aus.

https://github.com/kubernetes/kubernetes.github.io/blob/master/docs/getting-started-guides/minikube.md#reusing-the-docker-daemon

relevante Teile hier zitieren 

Wenn Sie ein einzelnes VM von Kubernetes verwenden, ist es sehr praktisch, das .__ wiederzuverwenden. minikube's eingebauter Docker-Daemon; da dies bedeutet, müssen Sie nicht Erstellen Sie eine Docker-Registrierung auf Ihrem Host-Computer, und verschieben Sie das Image in it - Sie können einfach denselben Docker-Daemon wie minikube .__ bauen. was beschleunigt lokale Experimente. Stellen Sie einfach sicher, dass Sie Ihren Docker mit einem Tag versehen Bild mit einem anderen Element als 'latest' und verwenden Sie dieses Tag, während Sie ziehe das Bild Andernfalls, wenn Sie keine Version von .__ angeben. image, es wird angenommen als: latest, mit der Pull-Image-Richtlinie Always Dementsprechend kann dies zu ErrImagePull führen Möglicherweise haben Sie keine Versionen Ihres Docker-Images in der Standard Docker-Registrierung (normalerweise DockerHub) noch.

Um mit dem Docker-Daemon auf Ihrem Mac/Linux-Host arbeiten zu können, verwenden Sie den Befehl docker-env in Ihrer Shell:

eval $ (minikube docker-env)

Sie sollten jetzt Docker in der Befehlszeile auf Ihrem Host mac/linux-Computer verwenden können, um mit dem Docker-Daemon in der minikube-VM zu sprechen:

führen Sie einen Docker-Containerlistenbefehl aus: docker ps. Es sollten sogar die Container angezeigt werden, die sich auf das kubernetes-System beziehen (da Ihr cli jetzt auf einen Docker-Daemon zeigt, auf dem Ihre Minikube läuft).

Bauen Sie jetzt Ihr Docker-Image. Dann wird es in der Minikube für Sie verfügbar sein.

3
so-random-dude

Sie können diesen Befehl ausgeben, um Ihre Docker-CLI auf minikube zu verweisen: eval $ (minikube docker-env). Dann können Sie Ihre Bilder dort erstellen oder sie exportieren, wo immer Sie sie haben, und importieren.

0
Lev Kuznetsov