两种在Minikube中运行本地Docker镜像的简单方式
前言
本文将分享两种在Minikube中运行本地Docker镜像的简单方式
`
要求
你将学到的知识
本文将教会大家如何在Minikube中使用本地的Docker镜像。因为Kubernetes默认从注册表中提取镜像,所以Kubernetes一般是不会使用本地镜像,并且在生产环境中也不应该使用本地镜像。但是,如果我们可以很轻松的使用本地镜像,而不是每次都需要将这些镜像推送到远程的注册表、登录远程注册表并在本地电脑中重新拉取,那么使用本地镜像将十分便利。
和往常一样,我在github中准备了一个仓库, 方便大家查看完成的代码库,并且可以按照本文描述的步骤进行操作。
Demo介绍
/
|- app/
|- Dockerfile
|- index.js
|- package.json
|- deployment.yaml
在上面的文件夹结构中,我将重点介绍将在本文中使用的重点文件:
-
app/Dockerfile 用于构建包含一个Node.js Web 服务器的本地Docker镜像的Dockerfile,我们将其部署到Minikube
-
app/index.js Node.js Web 服务器的应用程序代码
-
app/package.json 我们Node.js Web 服务器的依赖。在本文中,只使用了express*,一个用于搭建Web服务器的Nodejs库
-
deployment.yaml 在Kubernetes中运行Node.js Web 服务器的Deployment配置
app文件夹中的实际内容和本文无关。 我仅仅是提供一个demo方便接下来的教程讲解,当然使用你自己的demo也是可以的。如果你想要使用app这个应用,请注意服务器将在容器内部中监听8080端口。
Deployment配置
deployment.yaml的内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
name: myapp
spec:
selector:
matchLabels:
name: myapp
template:
metadata:
labels:
name: myapp
spec:
containers:
- name: myapp
image: pz/demo
imagePullPolicy: Never
ports:
- containerPort: 8080
我们需要重点关注的是imagePullPolicy和containerPort这两个配置
通过containerPort,我们将暴露app正在监听的8080端口,因此我们稍后可以通过浏览器访问http://127.0.0.1:8080去验证是否满足我们预期那样工作。
更关键的是imagePullPolicy。如果你想使用本地Docker镜像,imagePullPolicy需要设置成Never, 否则, Kubernetes将在注册表中根据你提供的名字来搜素同名镜像。
构建Dcoker镜像
为了验证Docker镜像能够按照我们的预期在Kubernetes中运行,让我们来构建并运行。
首先,我们导航进入app目录,然后我们通过docker build -t pz/demo .构建Docker镜像,通过-t参数将镜像名字设置为pz/demo。
当构建完成之后,我们可以通过docker run -it --rm -p 8080:8080 pz/demo命令来运行容器,并将Docker的8080端口映射的本地的8080端口。接下来,我们可以在浏览器中访问localhost:8080。 如果我们可以在浏览器中看到"Hello World!",那么说明我们的容器运行正常。
在Minikube中运行本地Docker镜像
如果你想通过kubectl apply -f deployment.yaml命令部署上面的deployment.yaml到你的Minikube中,那启动的Pod将找不到你刚刚构建的Docker镜像。
你可以通过kubectl logs deployment.apps/myapp命令来检查日志去来验证这个错误的结果。
上面的日志显示由于Kubernetes拉取不到镜像Pod一直等待重启。这其实是因为Minikube没有方法获取你本地Docker镜像。
但是幸运的是,有两个简单的命令可以帮助解决这个问题。
第一种方式是使用image load命令, 你可以使用下面的名利将本地Docker镜像从本地电脑中导入Minikube中:
# General
minikube image load <IMAGE_NAME>
# Example
minikube image load pz/demo
在导入完成之后,你可以重启pod。然后你可以发现pod可以正常工作了。
其实我们还可以变得更简单。以前的方法是你需呀先在本地构建Docker镜像,然后将其移动到Minikube容器中,虽然耗时不多,但是终究还是浪费了不少时间。
通过使用Minikube的image build, 我们可以在Minikube中直接构建镜像:
# General
minikube image build -t <IMAGE_NAME> .
# Example
minikube image build -t pz/demo .
使用minikube image build构建出来的镜像可以在Minikkube中直接访问,同时也不再需要在minikube image load中的第二步导入步骤。
使用以上两种之一的方法,我们可以重新检查一下Deployment的日志:
为了进一步验证一切是否按照我们预期的工作,我们可以使用下面的命令将本地8080端口转发发Deployment的8080端口中:
kubectl port-forward deployment/myapp 8080:8080
重新检查浏览器,我们可以发现本地构建的应用在Minikube中运行正常,🎉🎉🎉
总结
通过本文,你应该能够使用minikube image load和minikube image buildcommand命令在Minikube中使用本地镜像了.
更多信息请关注LinkedIn
后言
原文:Two easy ways to use local Docker images in Minikube
译文: 两种在Minikube中运行本地Docker镜像的简单方式
译者:大明二代