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

2024-10-10 08:38:00
admin
原创
76
摘要:问题描述:我有几个 Docker 镜像想要与Minikube一起使用。我不想先上传然后下载相同的镜像,而是直接使用本地镜像。我该怎么做?我尝试过的东西:我尝试运行这些命令(分别删除 Minikube 的实例并重新开始)kubectl run hdfs --image=fluxcapacitor/hdfs:la...

问题描述:

我有几个 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

它只是停留在某种状态但永远无法达到就绪状态。

  1. 我尝试创建一个注册表,然后将图像放入其中,但这也不起作用。我可能做错了,但我找不到执行此任务的正确说明。

请提供在本地 Kubernetes 实例中使用本地 Docker 镜像的说明。

操作系统:Ubuntu 16.04(Xenial Xerus)

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

解决方案 1:

正如手册所述,您可以使用 重用 Minikube 中的 Docker 守护程序eval $(minikube docker-env)

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

  1. 使用以下方式设置环境变量eval $(minikube docker-env)

  2. 使用 Minikube 的 Docker 守护进程构建镜像(例如docker build -t my-image .

  3. 在 pod 规范中设置镜像,就像构建标签一样(例如my-image

  4. 将 设置imagePullPolicyNever,否则 Kubernetes 将尝试下载镜像。

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

解决方案 2:

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

minikube image load <image name>

minikube cache add <image name>— 旧的弃用方法,仅供参考)

更多详细信息请参见此处。

所有将镜像推送到 Minikube 的可能方法都在这里提及:推送镜像

解决方案 3:

根据svenwltr 的解决方案,对我有用的是:

# Start minikube
minikube start

# Set docker env
eval $(minikube docker-env)             # Unix shells
minikube docker-env | Invoke-Expression # PowerShell

# 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

解决方案 4:

笔记:

  • 这个答案不仅限于 Minikube!

  • 如果要在 Minikube 的 Docker 上创建注册表,请先运行eval $(minikube docker-env)(以便docker在主机的终端上可用)。

否则,通过 进入虚拟机minikube ssh,然后继续以下步骤

  • 根据您的操作系统,Minikube 将自动将您的 homepath 安装到虚拟机上。

  • 正如 Eli 所说,您需要将本地注册表添加为不安全注册表才能使用http(使用 localhost 时可能不适用,但使用本地主机名时适用)。
    不要在生产中使用 http。努力确保安全。


使用本地注册表:

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

现在正确标记你的图像:

docker tag ubuntu localhost:5000/ubuntu

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

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

docker push localhost:5000/ubuntu

你应该能够把它拉回来:

docker pull localhost:5000/ubuntu

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

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

解决方案 5:

根据此答案补充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 address>

验证访问:

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

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

启用不安全访问

如果您始终计划在本地设置中使用 Minikube,则创建一个 Minikube 实例以默认使用不安全的注册表(它将无法在现有集群上运行)。

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

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

systemctl stop docker

编辑 Docker 服务文件:从中获取路径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 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

尝试拉:

docker pull docker.local:5000/ubuntu

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

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

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

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

解决方案 6:

较新版本的 Minikube 允许您通过运行以下命令从本地 Docker 实例加载映像:

minikube image rm image <imagename>:<version>
minikube image load <imagename>:<version> --daemon

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

解决方案 7:

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

 minikube cache add <image>:<tag>

但是,不要忘记imagePullPolicy: Never在 Kubernetes 部署 YAML 文件中进行设置,因为它将确保使用本地添加的图像,而不是尝试从注册表中远程提取它。

注意:minikube cache在后续版本中将被弃用。请切换到minikube image load

解决方案 8:

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

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)

解决方案 9:

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

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

我在 Kubernetes-dev 论坛上找到了有关该生成器的信息:

如果您使用kubectl run,它会为您生成一个清单,默认情况下该清单已imagePullPolicy设置为Always。您可以使用此命令获取,它适用于:imagePullPolicy`IfNotPresent`minikube

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

丹·洛伦茨

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

解决方案 10:

如果有人希望在设置 Minikube 环境后返回本地环境,请使用以下命令。

eval $(docker-machine env -u)

解决方案 11:

回答“如何在 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

解决方案 12:

来自 Kubernetes 文档:

更新图像

默认拉取策略为 IfNotPresent,如果镜像已存在,Kubelet 将跳过拉取操作。如果您希望始终强制拉取,可以执行以下操作之一:

  • 将容器的imagePullPolicy设置为Always;

  • 使用:latest作为要使用的图像的标签;

  • 启用 AlwaysPullImages 准入控制器。

或者换一种方式阅读:使用:latest标签会强制始终拉取图像。如果您使用eval $(minikube docker-env)其他答案中提到的标签,则要么不使用任何标签,要么为本地图像分配标签,这样可以避免 Kubernetes 尝试强制拉取它。

解决方案 13:

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

例如,假设您已经有puckel/docker-airflow图像。

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

docker save puckel/docker-airflow > puckel_docker_airflow.tar

  1. 现在进入 Minikube Docker 环境 -

eval $(minikube docker-env)

  1. 加载本地保存的图像 -

docker load < puckel_docker_airflow.tar

它就是这么简单,并且效果极佳。

解决方案 14:

对于 Windows 用户,我这样做。

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

首先我创建我的 Minikube 集群:

minikube start --bootstrapper=kubeadm --vm-driver=docker --profile "cluster1"

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

FROM nginx

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

docker build -t mynginximage .
minikube image load mynginximage

或者一步到位的方式,直接在 Minikube 中构建:

minikube image build -t mynginximage .

要在 Minikube 中运行我的图像:

kubectl run myweb --image=mynginximage --image-pull-policy=Never

或者通过mynginxpod.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: myweb
spec:
  containers:
    - name: myweb
      image: mynginximage
      imagePullPolicy: Never
      ports:
        - containerPort: 80

kubectl apply -f .mynginxpod.yaml

现在测试它,运行:

kubectl get pods myweb
NAME    READY   STATUS    RESTARTS   AGE
myweb   1/1     Running   0          25s

访问方式:

kubectl exec --stdin --tty myweb -- /bin/bash

揭露它:

kubectl port-forward nginx 3333:80

解决方案 15:

使用:

minikube addons enable registry -p minikube

输出:

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用