如何使用Minikube本地docker图像?

Kap*_*pta 227 linux docker kubernetes docker-compose

我有几个我想要使用的docker图像minikube.我不想首先上传然后下载相同的图像,而不是直接使用本地图像.我该怎么做呢?

我试过的东西:
1.我尝试运行这些命令(单独,两次删除minikube的实例并重新开始)

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989
kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 imagePullPolicy=Never
Run Code Online (Sandbox Code Playgroud)

输出:

NAME                    READY     STATUS              RESTARTS   AGE
hdfs-2425930030-q0sdl   0/1       ContainerCreating   0          10m
Run Code Online (Sandbox Code Playgroud)

它只是陷入某种状态但从未达到就绪状态.


2.我尝试创建一个注册表,然后将图像放入其中,但这也无效.我可能做错了但我找不到正确的指令来完成这项任务.

请提供在本地kubernetes实例中使用本地docker镜像的说明.
操作系统:ubuntu 16.04
Docker:Docker版本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"}
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我找到一个使用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           
Run Code Online (Sandbox Code Playgroud)

sve*_*ltr 310

正如README描述的那样,您可以重用Minikube中的Docker守护进程eval $(minikube docker-env).

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

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

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

  • `“minikube 缓存”将在即将推出的版本中被弃用,请切换到“minikube 图像加载”` - 刚刚从我的终端获取它。 (34认同)
  • 如果您想从minikube中返回或退出env。.eval $(minikube docker-env -u) (13认同)
  • 现在,您还可以使用“minikube cache add imagename:tag”将图像推送到 minikube - 确保也包含标签。[文档](https://minikube.sigs.k8s.io/docs/handbook/pushing/#2-push-images-using-cache-command) (13认同)
  • 非常重要的是要记住在关闭你正在工作的终端之后运行`eval $(minikube docker-env)`然后你试图重建图像...刚刚用minikube上没有更新的图像烧了6个小时.看起来像一个包没有更新...真的只是没有更新minikube引用的图像. (4认同)
  • 如何使用“kubectl”将“imagePullPolicy”设置为“Never”? (3认同)
  • AFAIS 您只能使用带有 `minikube start --disk-size 100g` 的新 minukube 来做到这一点。另一种解决方案是使用 `docker images` 和 `docker rmi` 删除旧图像。 (2认同)

jji*_*ing 147

根据@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
Run Code Online (Sandbox Code Playgroud)

  • 您可以在此处找到上述命令行的yml版本(关于imagePullPolicy):https://kubernetes.io/docs/concepts/containers/images/ (2认同)
  • 在 Windows 上 eval $(minikube docker-env) 对我不起作用。minikube docker 环境 | Invoke-Expression 似乎可以在 PowerShell 中工作。在其他终端中,需要读取 minikube docker-env 返回的最后一行。例如,在 IntelliJ(在 Windows 上)中,它是 @FOR /f "tokens=*" %i IN ('minikube -p minikube docker-env') DO @%i 您必须始终在任何新终端/会话中执行此操作在构建 docker 镜像之前。 (2认同)

Far*_*ahi 101

这个答案不仅限于minikube!

使用本地注册表:

docker run -d -p 5000:5000 --restart=always --name registry registry:2
Run Code Online (Sandbox Code Playgroud)

现在正确标记您的图像:

docker tag ubuntu localhost:5000/ubuntu
Run Code Online (Sandbox Code Playgroud)

请注意,localhost应更改为运行注册表容器的计算机的DNS名称.

现在将您的图像推送到本地注册表:

docker push localhost:5000/ubuntu
Run Code Online (Sandbox Code Playgroud)

你应该能够把它拉回来:

docker pull localhost:5000/ubuntu
Run Code Online (Sandbox Code Playgroud)

现在更改您的yaml文件以使用本地注册表.

考虑在适当的位置安装卷以将图像保留在注册表中.

  • @ZachEstela将Yaml中的映像名称更改为`<registryIP>:5000 / ubuntu`。 (3认同)
  • | 现在,将您的yaml文件更改为使用本地注册表。您能解释一下吗?我推送到本地注册表(很酷的技巧),但是我有一个同样的问题,我无法让minikube连接到它。 (2认同)
  • @FarhadFarahi:请添加到您的答案中,您需要将本地注册表添加为不安全才能使用 http:https://docs.docker.com/registry/insecure/(使用 localhost 时可能不适用,但适用如果使用本地主机名)。 (2认同)

Nit*_*hin 21

根据此答案添加到@Farhad 的答案

这是设置本地注册表的步骤。

在本地机器上设置

在本地机器中设置主机名:编辑/etc/hosts以添加这一行

docker.local 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

现在启动本地注册表(删除 -d 以运行非守护进程模式):

docker run -d -p 5000:5000 --restart=always --name registry registry:2
Run Code Online (Sandbox Code Playgroud)

现在正确标记您的图像:

docker tag ubuntu docker.local:5000/ubuntu
Run Code Online (Sandbox Code Playgroud)

现在将您的图像推送到本地注册表:

docker push docker.local:5000/ubuntu
Run Code Online (Sandbox Code Playgroud)

验证图像是否被推送:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list
Run Code Online (Sandbox Code Playgroud)

在 minikube 中设置

ssh 进入 minikube: minukube ssh

编辑/etc/hosts以添加此行

docker.local <your host machine's ip>
Run Code Online (Sandbox Code Playgroud)

验证访问:

curl -X GET http://docker.local:5000/v2/ubuntu/tags/list
Run Code Online (Sandbox Code Playgroud)

现在,如果您尝试拉取,您可能会收到 http 访问错误。

启用不安全访问

如果您一直计划在此本地设置中使用 minkube,那么默认情况下创建一个 minikube 以使用不安全的注册表(不适用于现有集群)。

minikube start --insecure-registry="docker.local:5000"
Run Code Online (Sandbox Code Playgroud)

否则请按照以下步骤操作:

systemctl stop docker
Run Code Online (Sandbox Code Playgroud)

编辑 docker 服务文件:从 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 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
Run Code Online (Sandbox Code Playgroud)

尝试拉:

docker pull docker.local:5000/ubuntu
Run Code Online (Sandbox Code Playgroud)

现在更改您的 yaml 文件以使用本地注册表。

  containers:
    - name: ampl-django
      image: dockerhub/ubuntu
Run Code Online (Sandbox Code Playgroud)

  containers:
    - name: ampl-django
      image: docker.local:5000/nymbleup
Run Code Online (Sandbox Code Playgroud)

不要在生产中使用 http,努力确保安全。


Kru*_*hna 16

There is one essay and effective way to push your local Docker image directly to minikube, which will save time from building the images in minikube again.

minikube cache add <Image name>
Run Code Online (Sandbox Code Playgroud)

More details here

All possible method to push images to minikube are mention here: https://minikube.sigs.k8s.io/docs/handbook/pushing/

  • 这个答案应该在列表中更高的位置,它是最新的解决方案。 (3认同)
  • 这也已被弃用,取而代之的是“minikube image load &lt;image name&gt;” (3认同)
  • 我想知道为什么这么慢。有时它会被取消。可能是内存不够 (2认同)
  • 对于阅读此答案的任何人:如果没有“imagePullPolicy:从不”,它将无法工作如果您检查日志,您会发现 minikube 正在尝试拉取图像,即使它知道它(“minikube image ls”) (2认同)

小智 9

除了接受的答案,您还可以使用run以下命令实现您最初想要的(使用该命令创建部署):

kubectl run hdfs --image=fluxcapacitor/hdfs:latest --port=8989 --generator=run-pod/v1 
Run Code Online (Sandbox Code Playgroud)

我在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


Cha*_*ake 9

如果有人想在设置 minikube env 后返回本地环境,请使用以下命令。

eval $(docker-machine env -u)
Run Code Online (Sandbox Code Playgroud)

  • 对于 minikube 来说是 eval $(minikube docker-env -u) (4认同)

Chr*_*ski 7

一种方法是在本地构建映像,然后执行:

docker save imageNameGoesHere | pv | (eval $(minikube docker-env) && docker load)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • `docker 保存 imageNameGoesHere | (eval $(minikube docker-env) &amp;&amp; docker load)`为我工作 (2认同)

Ada*_*ise 7

回答原始问题“How to use local docker images with Minikube?”的一个更简单的方法是将图像保存到 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
Run Code Online (Sandbox Code Playgroud)

然后运行图像涉及如下命令。确保包含“--image-pull-policy=Never”参数。

kubectl run my-image --image=the.full.path.to/the/docker/image:the-tag --image-pull-policy=Never --port=80
Run Code Online (Sandbox Code Playgroud)


Sag*_*hod 6

一种想法是将 Docker 镜像保存在本地,然后将其加载到 Minikube 中,如下所示:

\n

例如,假设\xe2\x80\x99s 已经有puckel/docker-airflow镜像。

\n
    \n
  1. 将该图像保存到本地磁盘 -

    \n

    docker save puckel/docker-airflow > puckel_docker_airflow.tar

    \n
  2. \n
  3. 现在进入Minikube Docker环境 -

    \n

    eval $(minikube docker-env)

    \n
  4. \n
  5. 加载本地保存的图像 -

    \n

    docker load < puckel_docker_airflow.tar

    \n
  6. \n
\n

就是这么简单,而且就像一种魅力。

\n


may*_*ʎɐɯ 6

对于 Windows 用户,我就是这样做的。

我使用Docker Desktop来托管 Minikube 映像,并使用 PowerShell 作为控制台。

首先我创建我的 Minikube 集群:

minikube start --bootstrapper=kubeadm --vm-driver=docker --profile "cluster1"
Run Code Online (Sandbox Code Playgroud)

例如,假设我有一个Dockerfile包含:

FROM nginx
Run Code Online (Sandbox Code Playgroud)

两步法:构建镜像并将镜像上传到 Minikube

docker build -t mynginximage .
minikube image load mynginximage
Run Code Online (Sandbox Code Playgroud)

或者采用一步法,直接在 Minikube 中构建:

minikube image build -t mynginximage .
Run Code Online (Sandbox Code Playgroud)

要在 Minikube 中运行我的图像:

kubectl run myweb --image=mynginximage --image-pull-policy=Never
Run Code Online (Sandbox Code Playgroud)

或者通过mynginxpod.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: myweb
spec:
  containers:
    - name: myweb
      image: mynginximage
      imagePullPolicy: Never
      ports:
        - containerPort: 80
Run Code Online (Sandbox Code Playgroud)

kubectl apply -f .\mynginxpod.yaml

现在要测试它,请运行:

kubectl get pods myweb
NAME    READY   STATUS    RESTARTS   AGE
myweb   1/1     Running   0          25s
Run Code Online (Sandbox Code Playgroud)

要访问它:

kubectl exec --stdin --tty myweb -- /bin/bash
Run Code Online (Sandbox Code Playgroud)

暴露它:

kubectl port-forward nginx 3333:80
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

来自 kubernetes 文档:

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

默认的拉取策略是 IfNotPresent,这会导致 Kubelet 跳过拉取已经存在的图像。如果您想始终强制拉动,您可以执行以下操作之一:

  • 将容器的 imagePullPolicy 设置为 Always;
  • 使用 :latest 作为要使用的图像的标签;
  • 启用 AlwaysPullImages 准入控制器。

或者换一种方式阅读:使用 :latest 标签强制图像总是被拉取。如果你使用eval $(minikube docker-env)上面提到的,那么要么不使用任何标签,要么为你的本地镜像分配一个标签,你可以避免 Kubernetes 试图强行拉取它。


Art*_*kov 5

关于“minikube”要记住的一件事是,minikube 的主机与您的本地主机不同,因此,我意识到,为了使用本地映像对 minikube 进行测试,您必须首先在本地构建 docker 映像或将其拉到本地然后使用下面的命令将它添加到 minikube 上下文中,这就是另一个 linux 实例。

 minikube cache add <image>:<tag>
Run Code Online (Sandbox Code Playgroud)

但是,不要忘记imagePullPolicy: Never在您的 kubernetes 部署 yaml 中设置 ,因为它将确保使用本地添加的图像,而不是尝试从注册表远程拉取它。

  • 虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的附加上下文可以提高其长期价值。 (7认同)

小智 5

使用:

minikube addons enable registry -p minikube
Run Code Online (Sandbox Code Playgroud)

输出:

  Registry addon on with docker uses 32769 please use that instead
  of default 5000 <br>
  For more information see:
  https://minikube.sigs.k8s.io/docs/drivers/docker
Run Code Online (Sandbox Code Playgroud)

和:

docker tag ubuntu $(minikube ip -p minikube):32769/ubuntu
docker push $(minikube ip -p minikube):32769/ubuntu
Run Code Online (Sandbox Code Playgroud)

或者

minikube addons enable registry
docker tag ubuntu $(minikube ip):32769/ubuntu
docker push $(minikube ip):32769/ubuntu
Run Code Online (Sandbox Code Playgroud)

以上对于开发目的来说已经足够了。我正在Arch Linux上执行此操作。

  • 如何引用 k8s 规范中的图像?通过 `localhost:32769/ubuntu` 或使用 minikube ip 或注册表 dns 名称? (2认同)

Nit*_*mas 5

较新版本的 minikube 允许您通过运行从本地 docker 实例加载图像

 minikube image rm image <imagename>:<version>  
 minikube image load <imagename>:<version> --daemon
Run Code Online (Sandbox Code Playgroud)

load 命令可能会显示错误,但图像仍会加载到您的 minikube 实例

  • 刚刚在这里找到参考:https://minikube.sigs.k8s.io/docs/handbook/pushing/#7-loading-directly-to-in-cluster-container-runtime ... --daemon 选项并不是真正的需要。 (2认同)