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

时间:2017-09-06 01:10:54

标签: docker kubernetes docker-registry minikube

我在我的机器上设置了docker,还有minikube里面有docker,所以我可能在不同的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点)它给了我下一条消息

  

卷曲:(7)无法连接到127.0.0.1端口5000:拒绝连接

所以我可以从我的机器访问图像注册表,但不能从minikube访问,当我在minikube上使用Kubernetes部署这个图像并且由于无法连接到http://127.0.0.1:5000而导致部署失败时,我当然会遇到问题/ p>

你能帮我配置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

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

  

sudo 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”:“Get   https://docker.local:5000/v1/_ping:拨打tcp:lookup docker.local on   10.0.2.3:53:阅读udp 10.0.2.15:57792-\u003e10.0.2.3:53:i / o timeout“}

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

那我怎么能解决这个问题呢。

谢谢:)

3 个答案:

答案 0 :(得分:13)

问题是您在任何地方使用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在本机内无法访问注册表。

我通常解决这个问题的方法是在本地和其他虚拟机内部使用主机名。

因此,在您的计算机上,在/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 daemon -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 --insecure-registry 10.0.0.0/24

  

ExecStart = / usr / bin / docker daemon -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 --insecure-registry 10.0.0.0/24 --insecure-registry docker.local: 5000 --insecure-registry 192.168.1.4:5000

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

systemctl daemon-reload
systemctl start docker

之后尝试拉

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

命令应该有效

答案 1 :(得分:3)

如何在Docker容器中访问在hostmachine上运行的进程?

在码头工人土地上这是一个很受欢迎的问题。看这里。 https://stackoverflow.com/a/24326540/6785908 还有其他方法,例如,对于Mac上的Docker,docker.for.mac.localhost DNS名称将解析为hostmachine

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

  

Mac有一个不断变化的IP地址(如果你没有网络,则没有   访问)。从17.06开始,我们的建议是连接到   特殊的Mac-DNS DNS名称docker.for.mac.localhost将解决   到主机使用的内部IP地址。

假设此minikube的主要用途是用于本地测试,则可以更轻松地部署docker容器(这甚至不需要本地docker注册表)

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

首先要理解的是,当您在机器中安装docker时,它有2个部分,1)docker cli,您可以使用docker守护进程与docker守护进程进行交互2)docker守护进程。在这种方法中,我们将本地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时,重用它真的很方便   minikube的内置Docker守护进程;因为这意味着你不必   在主机上构建一个docker注册表并将图像推入   它 - 你可以在与minikube相同的docker守护进程内部构建   这加速了本地实验。只需确保标记Docker   使用'最新'以外的图像并在你的时候使用那个标签   拉图像。否则,如果您没有指定您的版本   图像,它将被假定为:latest,具有Always的拉图像策略   相应地,这可能最终导致ErrImagePull像你一样   可能没有任何版本的Docker镜像   默认的docker注册表(通常是DockerHub)。

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

  

eval $(minikube docker-env)

您现在应该可以在主机mac / linux机器上的命令行上使用docker与minikube VM中的docker守护程序通信:

执行docker container list命令:docker ps。它甚至应该显示与kubernetes系统相关的容器(因为现在你的cli指向你的minikube正在运行的docker守护进程)。

现在构建您的docker镜像。然后它将在minikube中为您提供。

答案 2 :(得分:0)

您可以发出此命令将docker CLI指向minikube:eval $(minikube docker-env)然后您可以在那里构建图像,或者从您拥有它们的任何地方导出它们并导入。