代码之家  ›  专栏  ›  技术社区  ›  mibrahim.iti

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

  •  15
  • mibrahim.iti  · 技术社区  · 7 年前

    我在我的机器上安装了docker,还有minikube,里面有docker,所以我可能有两个docker实例在不同的VM上运行

    我构建了一个图像并对其进行标记,然后将其推送到本地注册表,它成功推送,我也可以将其从注册表中拉出来,当我运行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
    

    以上所有步骤都工作正常,没有任何问题。

    所以当我运行下一个命令时

    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
    

    因此,我可以从我的机器访问图像注册表,但不能从minikube访问,这当然会给我带来问题,当我在minikube上使用Kubernetes部署此图像时,由于无法连接到,使部署失败 http://127.0.0.1:5000

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

    更新

    我正在使用这个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
    

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

    sudo kubectl apply-f/PATH\u TO\u YAML\u FILE/ConsolePre。亚马尔

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

    当我运行descripe命令时

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

    来自守护进程的错误响应:{“message”:“Get https://docker.local:5000/v1/_ping 10.0.2.3:53:读取udp 10.0.2.15:57792-\u003e10.0.2.3:53:输入/输出超时“}

    我配置了 docker。当地xxx。xxx。xx。4. 在minikube/etc/hosts中,我不知道10.0.2.3:53和10.0.2.15:57792来自哪里。

    那么我该如何解决这个问题呢。

    谢谢:)

    4 回复  |  直到 7 年前
        1
  •  19
  •   rob2universe    2 年前

    问题是你的想法使用 127.0.0.1 任何你想去的地方。这是错误的。

    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
    

    127.0.0.1 将起作用。现在当你使用

    3- minikube ssh
    

    所以在你的机器上创建一个条目 /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/主机

    docker.local 192.168.0.101
    

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

    编辑-1

    systemctl stop docker
    

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

    ExecStart=/usr/bin/docker守护进程-Htcp://0.0.0.0:2376-Hunix:///var/run/docker.sock--tlsverify--tlscacert/etc/docker/ca.pem--tlscert/etc/docker/server。pem—tlskey/etc/docker/server密钥。pem--标签提供程序=virtualbox--不安全注册表10.0.0.0/24

    systemctl daemon-reload
    systemctl start docker
    

    之后试着拉

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

    命令应该有效

        2
  •  4
  •   so-random-dude    7 年前

    如何从Docker容器中的访问主机上运行的进程?

    这是docker领域的一个热门问题。请参见此处。 https://stackoverflow.com/a/24326540/6785908 docker.for.mac.localhost DNS名称将解析为主机

    https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers

    Mac有一个不断变化的IP地址(如果没有网络,则没有) 到主机使用的内部IP地址。

    方法2:将docker CLI指向minikube中运行的docker守护进程,然后在那里执行docker build命令。

    首先要了解的是,当您在机器中安装docker时,它有两个部分,1)一个docker cli,您可以与docker daemon进行交互2)一个docker daemon。在这种方法中,我们将本地docker cli指向minikube的docker守护进程并执行 docker build .

    https://github.com/kubernetes/kubernetes.github.io/blob/master/docs/getting-started-guides/minikube.md#reusing-the-docker-daemon

    此处引用相关部分

    当使用Kubernetes的单个VM时,重用 在主机上建立docker注册表,并将图像推送到 这加快了本地实验的速度。只需确保标记Docker即可 拉动图像。否则,如果未指定 镜像,假设为:最新,具有始终的拉镜像策略 相应地,这最终可能会导致ErrImagePull

    要能够在mac/linux主机上使用docker守护进程,请在shell中使用docker env命令:

    现在,您应该能够在主机mac/linux机器上的命令行上使用docker与minikube VM内的docker守护进程对话:

    执行docker容器列表命令: docker ps

    现在建立你的docker形象。然后它将在minikube为您提供。

        3
  •  1
  •   Alonso Valdivia    2 年前

    enter image description here

    那么,这一切的解决方案是什么呢? Minikube可以通过192.168.49.1:5000轻松连接到我们的本地注册表。 如果您希望使用本地注册表中的图像创建作业/部署/状态集,那么只需将192.168.49.1:5000添加到您的图像中即可。 enter image description here

    注意事项: 请记住,允许minikube通过以下方式访问您的本地注册表非常重要:

    minikube start --insecure-registries 192.168.49.1:5000
    

    minikube ssh 'grep host.minikube.internal / etc / hosts | cut -f1 '
    

    这都是假设您在docker中创建了一个注册表,并且暴露了端口5000。

        4
  •  0
  •   Lev Kuznetsov    7 年前