如何使用Minikube本地docker图像?

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

它只是停留在某个状态,但从未达到就绪状态。

< br > 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
340004 次浏览

注:

  • < p > # EYZ0

  • 如果想在minikube的Docker上创建注册表然后首先运行eval $(minikube docker-env)(使docker在主机的终端上可用)。
    否则,通过minikube ssh进入虚拟机,然后执行以下步骤

  • 根据您的操作系统,Minikube会自动安装你的homeepath到VM。

  • 正如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文件以使用本地注册表。

考虑在适当的位置挂载卷,以便在注册表上持久化映像。

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

所以要使用图片而不上传,你可以按照以下步骤:

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

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

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

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

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

如果您使用kubectl run,它会为您生成一个清单,默认情况下将imagePullPolicy设置为Always。你可以使用这个命令来获得IfNotPresentimagePullPolicy,这将适用于minikube:

# EYZ0

丹Lorenc

< a href = " https://groups.google.com/forum/ !主题/ kubernetes-dev YfvWuFr_XOM noreferrer“rel = > https://groups.google.com/forum/ !主题/ kubernetes-dev YfvWuFr_XOM < / >

kubernetes文档:

< a href = " https://kubernetes。io / docs /概念/集装箱/图片/ # updating-images noreferrer“rel = > https://kubernetes.io/docs/concepts/containers/images/ updating-images < / >

默认的拉取策略是IfNotPresent,它会导致Kubelet跳过已经存在的图像的拉取。如果你想一直用力拉,你可以做以下其中一种:

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

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

根据@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

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

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)

为了补充前面的答案,如果你有一个tarball映像,你可以简单地将它加载到你的本地docker映像集docker image load -i /path/image.tar。请记住运行它 eval $(minikube docker-env),因为minikube不与本地安装的docker引擎共享映像。

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

eval $(docker-machine env -u)

加上@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访问错误。

# EYZ0:

如果你总是打算在这个本地设置中使用minkube,那么在默认情况下创建一个minikube来使用不安全的注册表(不会在现有集群上工作)。

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

否则按照以下步骤:

systemctl stop docker

编辑docker服务文件:从systemctl status docker获取路径

它可能是:

< p > / etc / systemd /系统/ docker.service.d / 10-machine.conf或 /usr/lib/systemd/system/docker.service < / p >

附加此文本(将192.168.1.4替换为您的ip)

——insecure-registry码头工人。Local:5000——insecure-registry 192.168.1.4:5000

到这条线

ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix: / / / var /运行/码头工人。Sock——tlsverify——tlscacert /etc/docker/ca.pem ——tlscert /etc/docker/server.tlskey /etc/docker/server-key。Pem——label provider=virtualbox——insecure-registry 10.0.0.0/24

. Pem——label provider=virtualbox——insecure-registry 10.0.0.0/24

. Pem
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,努力确保安全。

其他答案假设你使用minikube和VM,所以你的本地映像不能从minikube VM访问。

如果你使用minikube和--vm-driver=none,你可以通过设置image_pull_policy为Never轻松重用本地图像:

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

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

现在有一个Minikube注册表插件,这可能是最简单的方法。下面是如何使用它:https://minikube.sigs.k8s.io/docs/tasks/registry/insecure/

注意,我有DNS问题,可能是一个bug。

回答最初的问题“如何在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的vm中运行k8s呢?在docker desktop的最新版本中有对这个功能的本地支持…您只需要启用这种支持。

https://www.docker.com/blog/kubernetes-is-now-available-in-docker-desktop-stable-channel/ # EYZ0 < / p >

我是怎么发现的:

在阅读helm的文档时,他们会给你一个如何安装minikube的简短教程。 本教程将minikube安装在与docker不同的虚拟机中

所以当安装我的头盔图表时,我无法让helm/k8s拉出我使用docker构建的图像。这就是我提出这个问题的原因。

所以…如果你能适应docker桌面附带的任何版本的k8s,并且你能适应docker在任何虚拟机中运行,那么这个解决方案可能比其他一些解决方案更容易一些。

免责声明:不确定在windows/linux容器之间切换会产生什么影响。

你可以重用docker shell,使用eval $(minikube docker-env),或者,你可以在shell中利用docker save | docker load

一个想法是在本地保存docker映像,然后将它加载到minikube中,如下所示:

比方说,你已经有了puckel/docker气流图像。

  1. 保存映像到本地磁盘-

    # EYZ0 < / p >

  2. 现在进入minikube docker env -

    # EYZ0 < / p >

  3. 加载本地保存的图像

    # EYZ0 < / p >

就是这么简单,它就像一个魅力。

  1. 安装minikube docker-env
  2. 再次构建相同的docker映像(使用minikube docker-env)
  3. 在部署中将imagePullPolicy更改为从来没有

实际上,你的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,你必须再次构建镜像,否则它会失败。

我发现这个方法从ClickHouse操作符构建从来源 它帮助并拯救了我的生命!< / p >

docker save altinity/clickhouse-operator | (eval $(minikube docker-env) &&
docker load)

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

minikube image load <image name>

(minikube cache add <image name> -旧的弃用方式,供参考)

更多细节在这里

所有可能的方法推图片到minikube在这里提到:https://minikube.sigs.k8s.io/docs/handbook/pushing/

步骤在kubernetes中运行本地docker映像 1. Eval $(minikube -p minikube docker-env)
2. 在工件文件中,在spec部分-> containers
add 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
< p > < br > 3.然后执行kubectl create -f <filename>

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

 minikube cache add <image>:<tag>

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

更新: minikube cache将在即将推出的版本中弃用,请切换到minikube image load

minikube addons enable registry -p minikube

💡注册表插件上的docker使用32769,请使用它代替 默认为5000
📘了解更多信息: # EYZ0 < / p >

docker tag ubuntu $(minikube ip -p minikube):32769/ubuntu
docker push $(minikube ip -p minikube):32769/ubuntu

minikube addons enable registry
docker tag ubuntu $(minikube ip):32769/ubuntu
docker push $(minikube ip):32769/ubuntu

以上内容对于开发目的来说已经足够好了。我在archlinux上做这个。

Docker上的minikube:

选项1:使用minikube注册表

  1. 检查minikube端口 李# EYZ0 < / >
您将看到类似于127.0.0.1:32769->5000/tcp的内容 这意味着你的minikube注册表外部使用的是32769端口,但内部使用的是5000端口
  1. 构建docker图像标记它: # EYZ0 < / p >

  2. 将映像推到minikube注册表: # EYZ0 < / p >

  3. 检查它是否存在: # EYZ0 < / p >

  4. 使用内部端口构建一些部署: # EYZ0 < / p >

你的图像现在在minikube容器中,要看到它写:

eval $(minikube -p <PROFILE> docker-env)
docker images

警告:如果只使用一个名为“minikube”的配置文件;那么"-p "Section是多余的,但如果使用更多,那么不要忘记它;就我个人而言,我删除了标准的(minikube),以免出错。

选项2:不使用注册表

    切换到minikube容器Docker: 李# EYZ0 < / >
  1. 建立你的形象: 李# EYZ0 < / > 创建一些部署: 李# EYZ0 < / >

最后,将部署ImagePullPolicy从Always更改为IfNotPresent:

# EYZ0

在minikube 1.20上,minikube cache add imagename:tag已弃用。

而是使用minikube image load imagename:tag

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

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

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

除了minikube image load <image name>之外,还可以查看Minikube的最新版本(撰写本文时为2021年11月)。

v1.24.0

添加--no-kubernetes标志来启动minikube而不包含Kubernetes

参见12848年公关

这就得到了:

mk start --no-kubernetes
minikube v1.24.0-beta.0 on Darwin 11.6 (arm64)
Automatically selected the docker driver
Starting minikube without Kubernetes minikube in cluster minikube
Pulling base image ...
Creating docker container (CPUs=2, Memory=1988MB) ...
Done! minikube is ready without Kubernetes!

没有Kubernetes可以尝试的事情

  • “# EYZ0"SSH到minikube的节点。
  • “# EYZ0"通过指向minikube内部的docker来构建映像
  • “# EYZ0"在没有docker的情况下构建图像

在前面的答案的基础上使用eval $(minikube docker-env)来加载minikube的docker环境,为了更容易切换,在你的shell rc文件中添加以下函数:

dockube() {
if [[ $1 = 'which' ]]; then
if [[ $MINIKUBE_ACTIVE_DOCKERD = 'minikube' ]]; then
echo $MINIKUBE_ACTIVE_DOCKERD
else
echo 'system'
fi
return
fi


if [[ $MINIKUBE_ACTIVE_DOCKERD = 'minikube' ]]; then
eval $(minikube docker-env -u)
echo "now using system docker"
else
eval $(minikube -p minikube docker-env)
echo "now using minikube docker"
fi
}

不带参数的dockube将在系统和minikube docker环境之间切换,而dockube which将返回正在使用的环境。

你应该知道Docker在您的本地机器minikube集群中的docker是分开的。

所以你应该加载/复制 Docker镜像从本地机器minikube集群:

minikube image load <IMAGE_NAME>

或者当使用minikube时,你可以直接在它里面构建图像:

#instead of:
docker image build -t <IMAGE_NAME> .
#do:
minikube image build -t <IMAGE_NAME> .

如果我理解的话,你有本地图像,可能通过usb笔,想要在minikube中加载它?

只需要像这样加载图像: Minikube image load my-local-image:0.1

有了这个,在kubernetes yaml文件中,你可以将imagePullPolicy改为从来没有,它会被找到,因为你刚刚在minikube中加载了它。

有了这个问题,做了这个并成功了。

大部分答案已经很棒了。 但我面临的一个重要问题是,如果你使用BuildKit

(DOCKER_BUILDKIT = 1)

然后是执行eval $(minkube docker-env) 将不会去minikube docker引擎。而不是,它将到本地的docker引擎。后创建的图像

因此,如果您正在使用下面的任何引用

山=类型=缓存,目标= /根/ .m2