• 两种在Minikube中运行本地Docker镜像的简单方式


    前言

    本文将分享两种在Minikube中运行本地Docker镜像的简单方式

    Kubernetes

    `

    要求

    你将学到的知识

    本文将教会大家如何在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
    

    我们需要重点关注的是imagePullPolicycontainerPort这两个配置

    通过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 images

    当构建完成之后,我们可以通过docker run -it --rm -p 8080:8080 pz/demo命令来运行容器,并将Docker的8080端口映射的本地的8080端口。接下来,我们可以在浏览器中访问localhost:8080。 如果我们可以在浏览器中看到"Hello World!",那么说明我们的容器运行正常。

    localhost:8080

    在Minikube中运行本地Docker镜像

    如果你想通过kubectl apply -f deployment.yaml命令部署上面的deployment.yaml到你的Minikube中,那启动的Pod将找不到你刚刚构建的Docker镜像。

    你可以通过kubectl logs deployment.apps/myapp命令来检查日志去来验证这个错误的结果。

    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的日志:

    kubectl logs deployment.apps/myapp

    为了进一步验证一切是否按照我们预期的工作,我们可以使用下面的命令将本地8080端口转发发Deployment的8080端口中:

    kubectl port-forward deployment/myapp 8080:8080
    

    重新检查浏览器,我们可以发现本地构建的应用在Minikube中运行正常,

    localhost:8080

    总结

    通过本文,你应该能够使用minikube image loadminikube image buildcommand命令在Minikube中使用本地镜像了.

    更多信息请关注LinkedIn

    后言

    原文:Two easy ways to use local Docker images in Minikube
    译文: 两种在Minikube中运行本地Docker镜像的简单方式
    译者:大明二代

  • 相关阅读:
    精通正则表达式(JavaScript)
    Go知识点记录
    多线程揭秘
    Python test
    ELinq+T4模版引擎制作多文件实体代码生成器
    浏览器内核
    MongoDb的增删改查
    LINQ执行表达式
    ASP.NET MVC3 读书笔记四(数据注解和验证)
    C#默认以管理员身份运行程序
  • 原文地址:https://www.cnblogs.com/xiao2/p/16047455.html
Copyright © 2020-2023  润新知