当前位置: 首页 > 面试题库 >

(Kubernetes + Minikube)无法从本地注册表获取Docker映像

简成仁
2023-03-14
问题内容

我在机器上安装了docker,并且在其中安装了docker的minikube上,所以可能我有两个在不同VM上运行的docker实例

我建立一个图像并对其进行标记,然后将其推入本地注册表,并成功将其推入,我也可以从注册表中将其拉出,也可以在运行curl以获取标签列表时得到结果,这就是我所做的

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

以上所有步骤均正常进行,没有任何问题。

我的问题是当我运行minikube并尝试在其中的本地注册表中访问此映像时

所以当我运行下一个命令

1- sudo minikube start --insecure-registry 127.0.0.1:5000
2- eval $(minikube docker-env)
3- minikube ssh
4- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

在最后一步(第4点)中,它给了我下一条消息

curl:(7)无法连接到127.0.0.1端口5000:连接被拒绝

所以我可以从我的机器上访问映像注册表,但不能从minikube访问映像注册表,这在我使用minikube上的Kubernetes部署此映像并由于无法连接到http://127.0.0.1:5000而使部署失败时给我带来了麻烦

您能帮我配置minikube以查看我的本地注册表,以便解决我的问题,然后我就可以使用kubernetes成功将映像部署到minikube吗?

更新

我正在使用此yaml文件(我将其命名为 ConsolePre.yaml )来使用kubernetes部署我的映像

apiVersion: v1
  kind: Service
  metadata:
    name: tripbru-console
    labels:
      app: tripbru-console
  spec:
    ports:
      - port: 9080
        targetPort: 9080
        nodePort: 30181
    selector:
      app: tripbru-console
      tier: frontend
    type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: tripbru-console
  labels:
    app: tripbru-console
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: tripbru-console
        tier: frontend
    spec:
      containers:
      - image: docker.local:5000/eliza/console:0.0.1
        name: tripbru-console
        ports:
        - containerPort: 9080
          name: tripbru-console

当我运行下一个命令以应用更改时

须藤kubectl apply -f /PATH_TO_YAML_FILE/ConsolePre.yaml

结果是

NAME                                      READY     STATUS         RESTARTS   AGE
po/tripbru-console-1655054400-x3g87       0/1       ErrImagePull   0          1m

当我运行describe命令时

sudo kubectl描述pod tripbru-console-1655054400-x3g87

我在描述结果中找到了下一条消息

来自守护程序的错误响应:{“ message”:“获取 https://docker.local:5000 / v1 /
_ping
:拨打tcp:在10.0.2.3:53上查找docker.local:读取udp
10.0.2.15:57792-\u003e10 .0.2.3:53:I / O超时“}

并且我在minikube / etc / hosts中配置了 docker.local xxx.xxx.xx.4
,所以我不知道10.0.2.3:53和10.0.2.15:57792的来源。

所以我也该如何解决这个问题。

谢谢 :)


问题答案:

问题是您的想法可以127.0.0.1在任何地方使用。错了

因此,如果您的计算机IP是192.168.0.101。然后下面的作品

1- docker build -t 127.0.0.1:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 127.0.0.1:5000/eliza/console:0.0.1
4- docker push 127.0.0.1:5000/eliza/console:0.0.1
5- curl -X GET http://127.0.0.1:5000/v2/eliza/console/tags/list

因为docker
run将注册表映射到127.0.0.1:5000和192.168.0.101:5000。现在,只有在您的计算机上,这才127.0.0.1起作用。现在,当您使用

3- minikube ssh

您进入minikube机器,里面没有运行在127.0.0.1:5000上的注册表。这样的错误。使用机器的机器IP在该机器内部无法访问注册表。

我通常解决此问题的方法是在本地和其他VM内使用主机名。

因此,在您的计算机上创建一个条目 /etc/hosts

docker.local 127.0.0.1

并将命令更改为

1- docker build -t docker.local:5000/eliza/console:0.0.1 .
2- docker run -d -p 5000:5000 --name registry registry:2
3- docker tag a3703d02a199 docker.local:5000/eliza/console:0.0.1
4- docker push docker.local:5000/eliza/console:0.0.1
5- curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

然后当你使用minikube ssh,使一个条目docker.local/etc/hosts

docker.local 192.168.0.101

然后 curl -X GET http://docker.local:5000/v2/eliza/console/tags/list

编辑1

对于TLS问题,您需要在minikube中停止docker服务

systemctl stop docker

然后编辑/etc/systemd/system/docker.service.d/10-machine.conf并更改

ExecStart = / usr / bin / docker守护程序-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-不安全的注册表10.0.0.0/24

ExecStart = / usr / bin / docker守护程序-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-
不安全注册10.0.0.0/24-不安全注册docker.local:5000-不安全的注册表192.168.1.4:5000

然后重新加载守护程序并启动docker服务

systemctl daemon-reload
systemctl start docker

之后尝试拉

docker pull docker.local:5000/eliza/console:0.0.1

命令应该起作用



 类似资料:
  • 我觉得自己很蠢。我希望K8s从本地注册表中拉出Docker图像,以确保我的开发周期尽可能快。 我已经按照说明设置了本地注册表,并且正在使用一个不安全的注册表。我已经向它推送了图像,并通过使用VS代码的Docker扩展查看注册表内部来确认它们位于注册表中: 我真的不知道是使用、还是,所以我都使用了这三种方法。

  • 我在Linode上有一个K8s集群和另一个用于操作的VM。 我已经安装了Docker 注意:我还没有在这个虚拟机上安装迷你库贝。 我可以构建我的映像,但无法将其从本地注册表拉到k8s pod。 以下是我已经做过的事情 创建docker镜像并将其推送到本地注册表 从图像中运行docker容器,但不会在K8s中被拉入 创建“regcred”secret并在部署yaml中使用它 创建映像并使用VM的IP

  • 我创建了一个docker映像,并将其推入(标记然后推入)本地不安全的docker-registry v2,该v2运行在192.168.99.100:5000/image/name上。 在VM内部的/var/lib/boot2docker/profile上,我向EXTRA_ARGS添加了标志 。 &从在Docker(VM)中运行良好。 _catalog可以从邮递员:获得注册表中的图像。 我将使用以下

  • 问题内容: 如何获得注册表中存在的Docker映像的最新创建日期?最近,我们遇到一个问题,就是我们的某些集群从属服务器上的Docker镜像没有自动拉出,并且该项目在非常陈旧的容器环境中运行。因此,我希望每天运行一次cron脚本,以检查提取的Docker映像是否比注册表Docker映像早24小时。 问题答案: 我知道的最简单的方法是编写一个简单的脚本,该脚本使用Docker Registry RES

  • 我无法将docker映像推送到低于错误的工件注册表 登录和拉取工作正常 詹金斯档案: Dockerfile: 我不确定这是怎么回事。我可以在jenkins从属节点上手动推送图像。但使用詹金斯会产生错误 我构建工作的日志 这是我的构建日志中的内容。

  • 我无法将docker映像推送到heroku注册表。 根据docker的说法,我已成功登录: 在那之后,我运行了,我得到了一些令人困惑的错误,说我试图推送到一个不安全的repo,而de-output中的url看起来是安全的(以https开头)。我做错了什么? 我正在使用以下jib配置: jib的Maven输出:build wiht-X: