it-swarm.com.de

Wie verwende ich lokale Docker-Bilder mit Minikube?

Ich habe mehrere Docker-Bilder, die ich mit minikube verwenden möchte. Ich möchte nicht erst das gleiche Bild hochladen und dann herunterladen müssen, anstatt nur das lokale Bild direkt zu verwenden. Wie mache ich das?

Sachen die ich ausprobiert habe:
1. Ich habe versucht, diese Befehle auszuführen (separat, die Instanzen von minikube beide Male zu löschen und neu zu starten)

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never

Ausgabe :

NAME                    READY     STATUS              RESTARTS   AGE
hdfs-2425930030-q0sdl   0/1       ContainerCreating   0          10m

Es bleibt nur in einem bestimmten Status hängen, erreicht jedoch nie den Bereitschaftsstatus.


2. Ich habe versucht, eine Registrierung zu erstellen und dann Bilder darin abzulegen, aber das hat auch nicht funktioniert. Möglicherweise habe ich das falsch gemacht, aber ich kann keine richtigen Anweisungen für diese Aufgabe finden.

Bitte geben Sie Anweisungen zur Verwendung lokaler Docker-Images in der lokalen Kubernetes-Instanz.
OS: Ubuntu 16.04
Docker: Docker Version 1.13.1, Build 092cba3
Kubernetes:

Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", BuildDate:"2017-02-15T06:40:50Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/AMD64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"08e099554f3c31f6e6f07b448ab3ed78d0520507", GitTreeState:"clean", BuildDate:"1970-01-01T00:00:00Z", GoVersion:"go1.7.1", Compiler:"gc", Platform:"linux/AMD64"}

Wenn mir jemand helfen könnte, eine Lösung zu finden, die Docker-Compose verwendet, wäre das großartig. Vielen Dank.

Bearbeiten:

In eval $(minikube docker-env geladene Bilder:

REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
fluxcapacitor/jupyterhub                              latest              e5175fb26522        4 weeks ago         9.59 GB
fluxcapacitor/zeppelin                                latest              fe4bc823e57d        4 weeks ago         4.12 GB
fluxcapacitor/prediction-pmml                         latest              cae5b2d9835b        4 weeks ago         973 MB
fluxcapacitor/scheduler-airflow                       latest              95adfd56f656        4 weeks ago         8.89 GB
fluxcapacitor/loadtest                                latest              6a777ab6167c        5 weeks ago         899 MB
fluxcapacitor/hdfs                                    latest              00fa0ed0064b        6 weeks ago         1.16 GB
fluxcapacitor/sql-mysql                               latest              804137671a8c        7 weeks ago         679 MB
fluxcapacitor/metastore-1.2.1                         latest              ea7ce8c5048f        7 weeks ago         1.35 GB
fluxcapacitor/cassandra                               latest              3cb5ff117283        7 weeks ago         953 MB
fluxcapacitor/apachespark-worker-2.0.1                latest              14ee3e4e337c        7 weeks ago         3.74 GB
fluxcapacitor/apachespark-master-2.0.1                latest              fe60b42d54e5        7 weeks ago         3.72 GB
fluxcapacitor/package-Java-openjdk-1.8                latest              1db08965289d        7 weeks ago         841 MB
gcr.io/google_containers/kubernetes-dashboard-AMD64   v1.5.1              1180413103fd        7 weeks ago         104 MB
fluxcapacitor/stream-kafka-0.10                       latest              f67750239f4d        2 months ago        1.14 GB
fluxcapacitor/pipeline                                latest              f6afd6c5745b        2 months ago        11.2 GB
gcr.io/google-containers/kube-addon-manager           v6.1                59e1315aa5ff        3 months ago        59.4 MB
gcr.io/google_containers/kubedns-AMD64                1.9                 26cf1ed9b144        3 months ago        47 MB
gcr.io/google_containers/kube-dnsmasq-AMD64           1.4                 3ec65756a89b        5 months ago        5.13 MB
gcr.io/google_containers/exechealthz-AMD64            1.2                 93a43bfb39bf        5 months ago        8.37 MB
gcr.io/google_containers/pause-AMD64           
190
Kapil Gupta

Wie in der README beschrieben, können Sie den Docker-Daemon von Minikube mit eval $(minikube docker-env) wiederverwenden.

Gehen Sie folgendermaßen vor, um ein Bild zu verwenden, ohne es hochzuladen:

  1. Setzen Sie die Umgebungsvariablen mit eval $(minikube docker-env)
  2. Bild mit dem Docker-Daemon von Minikube erstellen (zB docker build -t my-image .)
  3. Legen Sie das Bild in der Pod-Spezifikation wie das Build-Tag fest (z. B. my-image).
  4. Setzen Sie imagePullPolicy auf Never, andernfalls versucht Kubernetes, das Bild herunterzuladen.

Wichtiger Hinweis: Sie müssen eval $(minikube docker-env) auf jedem Terminal ausführen, das Sie verwenden möchten, da nur die Umgebungsvariablen für die aktuelle Shell-Sitzung festgelegt werden .

273
svenwltr

Was bei mir funktioniert hat, basiert auf der Lösung von @svenwltr:

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)

# Build image
docker build -t foo:0.0.1 .

# Run in minikube
kubectl run hello-foo --image=foo:0.0.1 --image-pull-policy=Never

# Check that it's running
kubectl get pods
131
jjinking

Diese Antwort ist nicht auf minikube beschränkt!

Verwenden Sie eine lokale Registrierung:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Kennzeichnen Sie Ihr Bild jetzt richtig:

docker tag ubuntu localhost:5000/ubuntu

Beachten Sie, dass localhost in den DNS-Namen des Computers geändert werden sollte, auf dem der Registrierungscontainer ausgeführt wird.

Übertragen Sie Ihr Bild jetzt in die lokale Registrierung:

docker Push localhost:5000/ubuntu

Sie sollten es zurückziehen können:

docker pull localhost:5000/ubuntu

Ändern Sie nun Ihre Yaml-Datei, um die lokale Registrierung zu verwenden.

Überlegen Sie, ob Sie den Datenträger an einem geeigneten Ort bereitstellen möchten, um die Bilder in der Registrierung zu speichern.

aktualisieren:

wie Eli sagte, müssen Sie die lokale Registrierung als unsicher hinzufügen, um http (gilt möglicherweise nicht bei Verwendung von localhost, aber bei Verwendung des lokalen Hostnamens) zu verwenden.

Verwenden Sie http nicht in der Produktion, sondern bemühen Sie sich um die Sicherung.

95
Farhad Farahi

Zusätzlich zu der akzeptierten Antwort können Sie mit dem folgenden Befehl auch das erreichen, was Sie ursprünglich wollten (Erstellen einer Bereitstellung mit dem Befehl run):

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 --generator=run-pod/v1 

Ich habe die Informationen über den Generator im Kubernetes-dev-Forum gefunden:

Wenn Sie kubectl run verwenden, wird ein Manifest für Sie generiert, für das imagePullPolicy standardmäßig auf Always festgelegt ist. Mit diesem Befehl können Sie imagePullPolicy von IfNotPresent abrufen, was für minikube funktioniert:

kubectl run --image=<container> --generator=run-pod/v1

Dan Lorenc

https://groups.google.com/forum/#!topic/kubernetes-dev/YfvWuFr_XOM

9
chrisjones

Ein Ansatz besteht darin, das Image lokal zu erstellen und dann Folgendes auszuführen:

docker save imageNameGoesHere | pv | (eval $(minikube docker-env) && docker load)

minikube docker-env gibt möglicherweise nicht die richtigen Informationen zurück, die unter einem anderen Benutzer/Sudo ausgeführt werden. Stattdessen können Sie Sudo -u yourUsername minikube docker-env ausführen.

Es sollte ungefähr so ​​aussehen:

export DOCKER_TLS_VERIFY="1"
export DOCKER_Host="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/chris/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your Shell:
# eval $(minikube docker-env)
7

Aus den kubernetes docs:

https://kubernetes.io/docs/concepts/containers/images/#updating-images

Die Standard-Pull-Richtlinie lautet IfNotPresent. Dadurch überspringt das Kubelet das Abrufen eines Bildes, falls es bereits vorhanden ist. Wenn Sie immer einen Zug erzwingen möchten, haben Sie folgende Möglichkeiten:

  • setzen Sie die imagePullPolicy des Containers auf Always.
  • use: Neueste als Tag für das zu verwendende Bild;
  • aktivieren Sie den AlwaysPullImages-Berechtigungscontroller.

Oder lesen Sie es anders: Mit dem Tag: latest werden Bilder immer abgerufen. Wenn Sie eval $(minikube docker-env) wie oben erwähnt verwenden, verwenden Sie entweder kein Tag oder weisen Sie Ihrem lokalen Image ein Tag zu, damit Kubernetes es nicht zwangsweise abziehen.

4
Jason

Um zu den vorherigen Antworten hinzuzufügen, können Sie ein Tarball-Image einfach in den lokalen Docker laden. docker image load -i /path/image.tar. Vergessen Sie nicht, es auszuführen aftereval $(minikube docker-env) , da minikube keine bilder mit der lokal installierten docker engine teilt.

2
Julien Nyambal

Wenn jemand nach dem Einstellen von minikube env in die lokale Umgebung zurückkehren möchte, verwenden Sie den folgenden Befehl.

eval $(docker-machine env -u)

Hinzufügen zu @Farhads Antwort basierend auf diese Antwort ,

Dies sind die Schritte zum Einrichten einer lokalen Registrierung.

Setup auf lokalem Computer

Richten Sie den Hostnamen auf dem lokalen Computer ein: Bearbeiten Sie /etc/hosts, um diese Zeile hinzuzufügen

docker.local 127.0.0.1

Starten Sie nun eine lokale Registrierung (entfernen Sie -d, um den Nicht-Daemon-Modus auszuführen):

docker run -d -p 5000:5000 --restart=always --name registry registry:2

Kennzeichnen Sie nun Ihr Bild richtig:

docker tag ubuntu docker.local:5000/ubuntu

Übertragen Sie Ihr Bild jetzt in die lokale Registrierung:

docker Push docker.local:5000/ubuntu

Stellen Sie sicher, dass das Bild übertragen wurde:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

Setup im Minikube

ssh in minikube mit: minukube ssh

bearbeiten Sie /etc/hosts, um diese Zeile hinzuzufügen

docker.local <your Host machine's ip>

Überprüfen Sie den Zugriff:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list

Wenn Sie nun versuchen zu ziehen, wird möglicherweise ein http-Zugriffsfehler angezeigt.

Unsicheren Zugriff aktivieren :

Wenn Sie immer vorhaben, minkube mit diesem lokalen Setup zu verwenden, erstellen Sie einen Minikube, der standardmäßig eine unsichere Registrierung verwendet (funktioniert nicht auf vorhandenen Clustern).

minikube start --insecure-registry="docker.local:5000"

andernfalls führen Sie die folgenden Schritte aus:

systemctl stop docker

bearbeiten Sie die Docker-Serice-Datei: Rufen Sie den Pfad von systemctl status docker ab.

es könnte sein :

/etc/systemd/system/docker.service.d/10-machine.conf oder /usr/lib/systemd/system/docker.service

hänge diesen text an (ersetze 192.168.1.4 mit deiner ip)

--insecure-registry docker.local: 5000 --insecure-registry 192.168.1.4:5000

zu dieser Zeile

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

systemctl daemon-reload
systemctl start docker

versuche zu ziehen:

docker pull docker.local:5000/ubuntu

Ändern Sie nun Ihre Yaml-Datei, um die lokale Registrierung zu verwenden.

  containers:
    - name: ampl-Django
      image: dockerhub/ubuntu

zu

  containers:
    - name: ampl-Django
      image: docker.local:5000/nymbleup

Verwenden Sie http nicht in der Produktion, sondern bemühen Sie sich um die Sicherung.

0
nithin