如何在Minikube中使用本地docker镜像?


299

我有几个要使用的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映像。
操作系统: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"}

如果有人可以帮助我获得使用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           

Answers:


408

自述文件所述,您可以使用来重用Minikube中的Docker守护进程eval $(minikube docker-env)

因此,要使用图像而不上传图像,可以按照以下步骤操作:

  1. 用以下命令设置环境变量 eval $(minikube docker-env)
  2. 使用Minikube的Docker守护程序构建映像(例如docker build -t my-image .
  3. 在pod规格中将图像设置为build标签(例如my-image
  4. 将设置imagePullPolicyNever,否则Kubernetes将尝试下载图像。

重要说明:您必须eval $(minikube docker-env)在要使用的每个终端上运行,因为它仅设置当前Shell会话的环境变量。


1
再次,您只能使用的新minukube来做到这一点minikube start --disk-size 100g。另一个解决方案是使用docker images和删除旧图像docker rmi
svenwltr

6
非常重要的是要记住eval $(minikube docker-env)在尝试重建映像之前关闭您正在使用的终端之后运行……只是烧了6个小时,与未在minikube中更新的映像战斗……看来软件包没有更新。实际上只是不更新​​minikube所引用的图像。
迈克(Mike)

1
默认的拉取策略是IfNotPresent,这意味着我们要做的就是设置环境变量。
Beygi '18

29
如果妳想要从minikube返回或退出ENV ..eval $(minikube docker-env -u)
布迪Mulyo

1
@nmxl看看这里
testuser

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/concepts/containers/images
granadaCoder

127

此答案不限于minikube!

使用本地注册表:

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连接到它。
Zach Estela '18

3
@ZachEstela将Yaml中的图像名称更改为<registryIP>:5000/ubuntu
Farhad Farahi

@FarhadFarahi在哪里可以找到“运行注册表容器的计算机的dns名称”?
大安

1
@FarhadFarahi如果我将笔记本电脑交给您,您将如何查找?我只想知道。我按照docker教程的步骤操作,以使docker运行Windows。
大安

1
@FarhadFarahi:请添加到您的答案中,您需要将本地注册表添加为不安全才能使用http:docs.docker.com/registry/insecure(在使用localhost时可能不适用,但在使用本地主机名时适用)。
伊莱·阿格兰提

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中设置

ssh进入minikube: 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

附加此文本(用您的IP替换192.168.1.4)

--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-不安全的注册表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

一种方法是本地构建映像,然后执行以下操作:

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)
Salvador

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 save要用调用sudo,然后设置sudo chmod 664 my-image.tar为对当前用户可用。
Meir Gabay

我认为这应该是最快的方法。
Shiwakant Bharti

2

要添加到先前的答案中,如果您有tarball映像,则可以将其简单地加载到本地docker 映像集docker image load -i /path/image.tar。请记住在运行 运行它eval $(minikube docker-env),因为minikube不会与本地安装的docker引擎共享映像。


2

其他答案假定您将minikube与VM一起使用,因此无法从minikube VM访问本地映像。

如果您将minikube与结合使用--vm-driver=none,则可以通过将其设置image_pull_policy为永不来轻松重用本地图像:

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

imagePullPolicy在相应.yaml清单中设置容器的字段。


2

一种想法是将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则部署将尝试远程拉取该映像。由于您已经手动复制了图像,因此需要禁止k8从无法访问的地址(容器注册表)中提取图像。
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 /

我如何发现的:

在阅读有关掌舵的文档时,他们为您提供了有关如何安装minikube的简短教程。该教程将minikube安装在与docker不同/分开的vm中。

因此,当需要安装头盔图表时,我无法获得头盔/ k8来拉取我使用docker构建的图像。这就是我到达此问题的方式。

所以...如果您可以使用docker桌面随附的任何版本的k8s,并且可以在vm docker所具有的版本中运行它,那么也许此解决方案比其他解决方案要容易一些。

免责声明:不确定在Windows / Linux容器之间进行切换将如何影响一切。


我想我也不得不设置imagePullPolicies到IfNotPresent以及
乍得

1

有一种方法可以有效地将本地Docker映像直接推送到minikube,这将节省再次在minikube中构建映像的时间。

minikube cache add <Image name>

在这里更多细节

这里提到将图像推送到minikube的所有可能方法: https


0

您可以使用重复使用docker shell eval $(minikube docker-env),也可以在docker save | docker load各个shell之间使用。


0
  1. 设置minikube docker-env
  2. 再次构建相同的Docker映像(使用minikube docker-env)
  3. 在您的部署中将imagePullPolicy更改为Never

实际上这里发生了什么,您的Minikube无法识别您的docker守护进程,因为它是独立的服务。您必须首先使用以下命令设置您的minikube-docker环境use来检查

 "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.评估$(minikube -p minikube docker-env)
2.在工件文件的“规范”部分下->容器中
添加imagePullPolicy:IfNotPresent
或imagePullPolicy:从不

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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.