MinikubeでローカルDockerイメージを使用する方法


300

で使用したいDockerイメージがいくつかありminikubeます。ローカルイメージを直接使用するのではなく、最初に同じイメージをアップロードしてからダウンロードする必要はありません。どうすればよいですか?

私が試したもの:
1.私はこれらのコマンドを実行しようとしました(別々に、minikubeのインスタンスを両方削除し、新しく開始しました)。

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

出力:

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

何らかのステータスで動かなくなるだけで、準備完了状態になることはありません。


2.レジストリを作成し、そこに画像を入れてみましたが、どちらもうまくいきませんでした。私はそれを誤って行った可能性がありますが、このタスクを実行するための適切な指示が見つかりません。

ローカルのkubernetesインスタンスでローカルのDockerイメージを使用する手順を入力してください。
OS:ubuntu 16.04
Docker:Dockerバージョン1.13.1、ビルド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"}

誰かがdocker-composeを使用してこれを行うソリューションを入手できるとしたら、それは素晴らしいことです。ありがとう。

編集:

に読み込まれた画像eval $(minikube docker-env

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           

回答:


408

以下のようREADMEを説明し、あなたがMinikubeからドッカーデーモンを再利用することができますeval $(minikube docker-env)

アップロードせずに画像を使用するには、次の手順に従います。

  1. 環境変数を設定します eval $(minikube docker-env)
  2. MinikubeのDockerデーモンでイメージをビルドします(例docker build -t my-image .
  3. ビルドタグのようにポッド仕様で画像を設定します(例my-image
  4. をに設定します。そうしないimagePullPolicyNever、Kubernetesがイメージをダウンロードしようとします。

重要な注意:あなたが実行する必要がありeval $(minikube docker-env)、それが唯一の現在のシェルセッションのための環境変数を設定するので、使用する各端末に。


1
AFAISは、を使用した新しいminukubeでのみ実行できますminikube start --disk-size 100g。もう1つの解決策は、docker imagesおよびで古い画像を削除することdocker rmiです。
svenwltr 2017

6
eval $(minikube docker-env)イメージを再構築する前に、作業中のターミナルを閉じてから実行することを覚えておくことが非常に重要です... minikubeで更新されていないイメージとの6時間の戦い...パッケージが更新されていないように見えました。 。本当にminikubeが参照していた画像を更新していません。
マイク

1
デフォルトのプルポリシーではIfNotPresent、環境変数を設定するだけで済みます。
ベイギ

29
u戻るまたはminikubeからenvを終了する場合eval $(minikube docker-env -u)
Budi Mulyo


175

@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

3
上記のコマンドラインのymlバージョン(imagePullPolicyに関する)は、次の場所にあります。kubernetes.io
docs

127

この回答はミニクベに限定されません!

ローカルレジストリを使用します。

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

画像に適切なタグを付けます。

docker tag ubuntu localhost:5000/ubuntu

localhostは、レジストリコンテナを実行しているマシンのDNS名に変更する必要があることに注意してください。

次に、イメージをローカルレジストリにプッシュします。

docker push localhost:5000/ubuntu

あなたはそれを引き戻すことができるはずです:

docker pull localhost:5000/ubuntu

次に、ローカルレジストリを使用するようにyamlファイルを変更します。

ボリュームを適切な場所にマウントして、イメージをレジストリに保持することを検討してください。

更新:

Eliが述べたように、httpを使用するには、ローカルレジストリを安全でないものとして追加する必要があります(localhostを使用する場合は適用されない場合がありますが、ローカルホスト名を使用する場合は適用されます)

本番環境ではhttpを使用せず、セキュリティを確保するために努力してください。


2
| 次に、ローカルレジストリを使用するようにyamlファイルを変更します。これについて少し説明できますか?ローカルレジストリにプッシュしました(クールなトリック)が、minikubeに接続できないという同じ問題があります。
ザックエステラ2018年

3
@ZachEstelaは、yamlのイメージ名を<registryIP>:5000/ubuntu
Farhad

@FarhadFarahi「レジストリコンテナを実行しているマシンのDNS名」はどこにありますか?
Daan、

1
@FarhadFarahi私のラップトップをあなたに渡したら、どうやって見つけますか?知りたいだけです。Dockerチュートリアルの手順に従って、Windows用のDockerを実行しました。
Daan、

1
@FarhadFarahi:httpを使用するには、ローカルレジストリを安全でないものとして追加する必要があることを回答に追加してください:docs.docker.com/registry/insecure(localhostを使用する場合は適用されない可能性がありますが、ローカルホスト名を使用する場合は適用されます) )。
Eli Algranti

14

この回答に基づいて@Farhadの回答に追加すると、

これは、ローカルレジストリをセットアップする手順です。

ローカルマシンでのセットアップ

ローカルマシンでホスト名を設定:編集/etc/hostsしてこの行を追加

docker.local 127.0.0.1

ローカルレジストリを開始します(非デーモンモードを実行するには、-dを削除します)。

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

画像に適切なタグを付けます。

docker tag ubuntu docker.local:5000/ubuntu

次に、イメージをローカルレジストリにプッシュします。

docker push docker.local:5000/ubuntu

イメージがプッシュされたことを確認します。

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

minikubeでの設定

次のコマンドでminikubeにsshします。 minukube ssh

編集/etc/hostsしてこの行を追加

docker.local <your host machine's ip>

アクセスを確認します。

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

ここでプルしようとすると、httpアクセスエラーが発生する可能性があります。

安全でないアクセスを有効にする

このローカル設定で常にminkubeを使用することを計画している場合は、デフォルトで安全でないレジストリを使用するminikubeを作成します(既存のクラスターでは機能しません)。

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

または、以下の手順に従います。

systemctl stop docker

docker sericeファイルを編集:パスを取得 systemctl status docker

それは可能性があります :

/etc/systemd/system/docker.service.d/10-machine.confまたは/usr/lib/systemd/system/docker.service

このテキストを追加します(192.168.1.4を自分のIPに置き換えます)

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

この行へ

ExecStart = / usr / bin / dockerデーモン-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

引っ張ってみてください:

docker pull docker.local:5000/ubuntu

次に、ローカルレジストリを使用するようにyamlファイルを変更します。

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

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

本番環境ではhttpを使用せず、セキュリティを確保するために努力してください。


12

受け入れられた回答に加えてrun、次のコマンドを使用して、最初に望んだこと(コマンドを使用して配置を作成すること)を達成することもできます。

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

私はKubernetes-devフォーラムでジェネレーターに関する情報を見つけました:

を使用kubectl runしている場合、たまたまデフォルトでimagePullPolicy設定さAlwaysれているマニフェストが生成されます。あなたは、取得するには、このコマンドを使用することができますimagePullPolicyIfNotPresentために働くだろう、minikube

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

ダン・ロレンク

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


9

1つのアプローチは、イメージをローカルでビルドしてから実行することです。

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

minikube docker-env別のユーザー/ sudoで実行されている正しい情報を返さない場合があります。代わりにを実行できますsudo -u yourUsername minikube docker-env

それは次のようなものを返すはずです:

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)

正しいコマンドは次のdocker save imageNameGoesHere > pv | (eval $(minikube docker-env) && docker load)
とおり

1
docker save imageNameGoesHere | (eval $(minikube docker-env) && docker load)私のために働いた
lhaferkamp


4

kubernetesドキュメントから:

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

デフォルトのプルポリシーはIfNotPresentであり、すでに存在する場合、Kubeletはイメージのプルをスキップします。常にプルを強制したい場合は、次のいずれかを実行できます。

  • コンテナのimagePullPolicyをAlwaysに設定します。
  • 使用する画像のタグとして:latestを使用します。
  • AlwaysPullImagesアドミッションコントローラーを有効にします。

または、別の方法で読みます。:latestタグを使用すると、イメージが常にプルされます。eval $(minikube docker-env)上記のようにを使用する場合は、タグを使用しないか、ローカルイメージにタグを割り当てて、Kubernetesがタグを強制的にプルしないようにすることができます。



3

元の質問「MinikubeでローカルDockerイメージを使用する方法」に答えるより簡単な方法は、イメージをtarファイルに保存してminikubeにロードすることです。

# export the docker image to a tar file
docker save --output my-image.tar the.full.path.to/the/docker/image:the-tag
# set local environment variables so that docker commands go to the docker in minikube
eval $(minikube docker-env)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env') DO @%i
# import the docker image from the tar file into minikube
docker load --input my-image.tar
# cleanup - put docker back to normal
eval $(minikube docker-env -u)
# or if on windows: @FOR /f "tokens=*" %i IN ('minikube docker-env -u') DO @%i

次に、イメージの実行には次のようなコマンドが含まれます。「--image-pull-policy = Never」パラメータを必ず含めてください。

kubectl run my-image --image=the.full.path.to/the/docker/image:the-tag --image-pull-policy=Never --port=80

よく説明され、魅力のように働きました。私だけ呼び出す必要があったdocker savesudoし、次に設定sudo chmod 664 my-image.tar私の現在のユーザーのためにそれを利用できるようにします。
Meir Gabay

これは私が信じる最も速いアプローチであるべきです。
Shiwakant Bharti

2

あなたはtarボールのイメージを持っている場合は、以前の回答に追加するには、単に画像の局所的なドッカセットはあなたにそれをロードすることができdocker image load -i /path/image.tar、それを実行するために覚えているしなさい eval $(minikube docker-env) minikubeがローカルにインストールさドッキングウィンドウエンジンで画像を共有していないので、。


2

その他の回答として、VMでminikubeを使用しているため、minikube VMからローカルイメージにアクセスできない場合があります。

でminikubeを使用する場合、Neverに--vm-driver=none設定image_pull_policyすることでローカルイメージを簡単に再利用できます。

kubectl run hello-foo --image=foo --image-pull-policy=Never

またはimagePullPolicy、対応する.yamlマニフェストのコンテナの設定フィールド。


2

1つのアイデアは、次のようにdockerイメージをローカルに保存し、後でminikubeにロードすることです。

たとえば、すでにpuckel / docker-airflowイメージがあるとします。

  1. そのイメージをローカルディスクに保存します-

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

  2. 今度はminikube docker envに入ります-

    eval $(minikube docker-env)

  3. ローカルに保存された画像を読み込みます-

    docker load < puckel_docker_airflow.tar

それはとてもシンプルで、魅力のように機能します。


承認された回答のヒントがまだ必要ですSet the imagePullPolicy to Never。たとえば、イメージにアドレスがタグ付けされているus.icr.io/mydiv/my-service:v0.0.1場合、デプロイはこのイメージをリモートでプルしようとします。イメージはすでに手動でコピーしているため、k8sがアクセスできないアドレス(コンテナーレジストリ)からイメージをプルしないようにする必要があります。
colm.anseo

1

dockerのvm内でk8sを実行できるとしたらどうでしょう?Dockerデスクトップの最新バージョンでは、これに対するネイティブサポートがあります。そのサポートを有効にする必要があります。

https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ https://www.docker.com/blog/docker-windows-desktop-now- kubernetes /

私がこれを見つけた方法:

helmのドキュメントを読みながら、minikubeをインストールする簡単なチュートリアルを提供します。このチュートリアルでは、Dockerとは別のVMにminikubeをインストールします。

そのため、ヘルムチャートをインストールするときに、helm / k8sでdockerを使用して構築したイメージをプルすることができませんでした。それが私がこの質問にたどり着いた方法です。

ですから、k8sのどのバージョンでもDockerデスクトップに付属していて、VM Dockerのどのバージョンでも実行できる場合、このソリューションは他のソリューションよりも少し簡単です。

免責事項:windows / linuxコンテナー間の切り替えがどのような影響を与えるかはわかりません。


私はまた、同様IfNotPresentにimagePullPoliciesを設定しなければならなかったと思う
チャドを

1

ローカルのDockerイメージをminikubeに直接プッシュするエッセイと効果的な方法が1つあります。これにより、minikubeでイメージを再構築する時間を節約できます。

minikube cache add <Image name>

詳細はこちら

画像をminikubeにプッシュするためのすべての可能な方法は、ここで言及されています:https ://minikube.sigs.k8s.io/docs/handbook/pushing/


0

を使用してdockerシェルを再利用することも、シェル全体でeval $(minikube docker-env)活用することもできますdocker save | docker load


0
  1. minikube docker-envのセットアップ
  2. もう一度同じdockerイメージをビルドします(minikube docker-envを使用)
  3. デプロイメントでimagePullPolicyをNeverに変更します

実際にここで何が発生するか、Minikubeはdockerデーモンを認識できません。これは独立したサービスであるため、最初にminikube-docker環境を設定して、以下のコマンドを使用して確認する必要があります。

 "eval $(minikube docker-env)"

以下のコマンドを実行すると、minikubeがdockerを探す場所が表示されます。

~$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.37.192:2376"
export DOCKER_CERT_PATH="/home/ubuntu/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

**# To point your shell to minikube's docker-daemon, run:**
# eval $(minikube -p minikube docker-env)

minikube docker-envをセットアップしたら、イメージを再度ビルドする必要があります。そうしないと失敗します。



0

kubernetesでローカルDockerイメージを実行する手順
1. eval $(minikube -p minikube docker-env)
2.アーティファクトファイルの仕様セクション->コンテナーで
imagePullPolicy:IfNotPresent
またはimagePullPolicy:Neverを追加します

apiVersion: "v1"
kind: Pod
metadata:
    name: web
    labels:
        name: web
        app: demo
spec:
    containers:
        - name: web
          image: web:latest
          imagePullPolicy: IfNotPresent
          ports:
              - containerPort: 5000
                name: http
                protocol: TCP


3.次に実行 kubectl create -f <filename>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.