Minikube 是一款可帮助快速设置单节点 Kubernetes 集群的软件。它支持在 docker 容器上运行的虚拟机 (VM) 并创建 Kubernetes 环境。现在,minikube 本身充当与本地 docker 环境分离的隔离容器环境,您计算机上的本地 docker 镜像在 minikube docker 中无法访问。现在,当您尝试访问 minikube 中的 docker 镜像时,可以通过 docker hub 访问,而不是通过本地 docker 环境访问。如果镜像在 docker hub 上可用,则会从 docker hub 将其拉入 minikube docker,否则您可能会收到 Image FallBack 错误。因此,为了解决这个问题,我们将介绍将本地 Docker 镜像加载到 Minikube 中的不同方法。
对于Kubernetes的开发来说,将本地Docker 镜像与Minikube无缝集成将是一种有效的实践。它可以帮助开发人员在 Minikube k8s 集群中更好地开发本地构建的Docker 容器,从而加快测试和迭代速度。我们将讨论在 Minikube 中使用本地创建的 Docker 镜像的不同有效方法。
在 Minikube 中使用本地 Docker 镜像的有效方法
以下是将本地 docker 镜像拉取到 minikube 的不同有效方法:
-
直接推送到集群内的 Docker 守护进程(docker-env)
-
使用“cache”命令推送镜像
-
使用 Registry 插件推送到集群内
-
使用 SSH 在 Minikube 内部构建镜像
-
直接加载到集群内容器运行时
-
将镜像构建到集群内容器运行时
直接推送到集群内的 Docker Daemon(docker-env)
通过此方法,您可以直接将本地 Docker 镜像无缝推送到 Minikube 集群内的 Docker 守护进程中。此方法可帮助开发人员在环境中高效地测试和部署本地构建容器。
步骤 1: 设置 shell 环境变量
eval $(minikube docker-env)
此命令指示我们的终端使用 minikube 内部的 docker 守护进程。因此,现在我们将运行的所有 docker 命令都将在 minikube 集群中的 docker 上运行,而不是在主机上运行。因此,现在我们可以直接在 minikube docker 中构建 docker 镜像。
步骤 2:在本地构建 Docker 镜像
docker build -t my_image .
示例:假设我们想在 Minikube 集群中构建一个基本的 Node.js 应用。为了方便练习,这里提供了Node.js 应用和Dockerfile,请分别将 Dockerfile 和 node.js 分别保存为 Dockerfile 和 node.js。
# Here Using the official Node.js runtime as a parent image
FROM node:14
# Setting up the working directory in the container
WORKDIR /usr/src/app
# Copy package.json and package-lock.json to the working directory
COPY package*.json ./
# Installing the dependencies of the application
RUN npm install
# Copying the application source code to the working directory
COPY . .
# Expose the port on which the application will run
EXPOSE 3000
# Defining the command to run the application
CMD ["npm", "start"]
node.js 文件在这里
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello, Docker World!');
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
步骤 3:使用 Minikube 的 Docker Daemon IP 和端口号标记镜像
docker tag my_image:latest $(minikube ip):5000/my_image:latest
在上面的命令中,您还可以手动提供$(minikube IP)来替换它们。
步骤 4:将标记的镜像直接推送到 Minikube 的集群内 Docker 守护进程中。
docker push $(minikube ip):5000/my_image:tag
成功将 docker 镜像推送到 minikube 集群内,您可以在集群内的 docker 镜像上检查该镜像作为验证。
步骤 5:要切换回本地 docker 守护进程,请使用以下命令
eval $(minikube docker-env -u)
使用缓存命令推送镜像
cache 命令通过简化镜像管理,将本地创建的 docker 镜像添加到 Minikube 的缓存中。此方法有助于加快 Kubernetes 集群中的测试和交互速度。
步骤 1: 将本地 docker 镜像添加到 minikube 的缓存中
minikube cache add my_image:latest
步骤 2:部署引用本地缓存镜像的 pod
kubectl apply -f my_pod.yaml
使用注册表插件推送到集群内
通过在集群内部启用 Minikube 的“registry”插件,此方法可以更轻松地推送和拉取 Docker 镜像。它负责确保镜像管理与中央存储库的一致性。
步骤 1:首先在 Minikube 中启用“registry”插件
minikube addons enable registry
步骤2:在本地构建docker镜像
docker build -t my_image:latest Dockerfile
这里提供您的镜像名称、镜像版本和您的 docker 文件名。
步骤 3:使用 minikube 注册表的地址和端口标记 docker 镜像
docker tag my_image:latest localhost:5000/my_image:latest
步骤 4:将标记的镜像推送到 Minikube 的集群内注册表
docker push localhost:5000/my_image:latest
使用 SSH 在 Minikube 内部构建镜像
此方法通过 SSH 直接访问 minikube VM,允许开发人员在集群环境内构建、标记和推送 docker 镜像,从而提供有效的镜像管理控制。
步骤 1:首先通过 ssh 访问 Minikube VM
minikube ssh
步骤 2:在 Minikube VM 中构建 docker 镜像
docker build -t my_image:latest Dockerfile
步骤 3:现在使用 Minikube 的 docker 守护进程IP 和端口标记镜像
docker tag my_image:latest localhost:5000/my_image:latest
步骤 4:将标记的镜像直接推送到 Minikbe 的集群内
docker push localhost:5000/my_image:latest
步骤 5:最后一步,退出 Minikube VM
exit
直接加载到集群内容器运行时(使用镜像加载命令)
此方法通过将 docker 镜像保存和加载为 tarball 来提供便捷的镜像管理,从而允许开发人员将本地生成的镜像有效地集成到 Minikube 的集群容器运行时中。
$ minikube image load my_image
当我们已经在主机的docker中构建了镜像,但想要将其加载到minikube集群中时,可以使用此命令。首先,检查my_image是否存在于主机docker镜像中:
由于镜像my-image已经存在于我们的主机 docker 中,我们可以通过镜像加载命令将其直接加载到我们的 minikube 集群中。
现在检查 minikube docker 中的镜像
至此,我们已成功将镜像加载到 Minikube 中。
将镜像构建到集群内容器运行时
此方法将 docker 镜像 tarball 直接导入 minikube 所选的容器运行时(例如 containerd)。它允许开发人员根据特定的运行时偏好调整镜像管理。
步骤 1:通过 SSH 访问 minikube 虚拟机
minikube ssh
步骤 2:将 Docker 镜像 tarball 导入到所选的集群内容器运行时(例如:containerd)
sudo ctr image import my_image.tar
步骤3:最后一步退出虚拟机
exit
要了解 docker 和 containerd 之间的区别,请参阅本文 – Docker vs Containerd
结论
学习这些将本地 Docker 镜像集成到 Minikube 的方法,对于开发人员加快 Kubernetes 开发至关重要。这些灵活的方法有助于将本地镜像直接推送到集群内的 Docker 守护进程,从而加速迭代,并直接在 Minikube 环境中生成镜像,提供简化的工作流程。