如何在 Minikube 中使用本地 Docker 镜像?
- 2024-10-10 08:38:00
- admin 原创
- 77
问题描述:
我有几个 Docker 镜像想要与Minikube一起使用。我不想先上传然后下载相同的镜像,而是直接使用本地镜像。我该怎么做?
我尝试过的东西:
我尝试运行这些命令(分别删除 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
它只是停留在某种状态但永远无法达到就绪状态。
我尝试创建一个注册表,然后将图像放入其中,但这也不起作用。我可能做错了,但我找不到执行此任务的正确说明。
请提供在本地 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)
。
因此,如果要使用图像而不上传,请按照以下步骤操作:
使用以下方式设置环境变量
eval $(minikube docker-env)
使用 Minikube 的 Docker 守护进程构建镜像(例如
docker build -t my-image .
)在 pod 规范中设置镜像,就像构建标签一样(例如
my-image
)将 设置
imagePullPolicy
为Never
,否则 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图像。
将该图像保存到本地磁盘 -
docker save puckel/docker-airflow > puckel_docker_airflow.tar
现在进入 Minikube Docker 环境 -
eval $(minikube docker-env)
加载本地保存的图像 -
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
输出:
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件