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 :)
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
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).
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.
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.
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.