(Kubernetes + Minikube)无法从本地registry中获取Docker镜像

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

我build立一个图像和标签,然后将其推到本地registry,它推动成功,我也可以从registry中也拉,也当我运行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,并尝试访问它在本地registry中的这个图像

所以当我运行下一个命令

 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:连接被拒绝

所以我可以从我的机器上访问图像registry,但不是从minikube,当我在minikube上使用Kubernetes部署此图像,使部署失败,因为无法连接到http://127.0.0.1:5000

你能帮我configurationminikube来查看我的本地registry,所以我的问题将被解决,那么我可以使用kubernetes成功部署镜像到minikube?

UPDATE

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

当我运行描述命令

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

我在描述结果中find下一条消息

来自守护进程的错误响应:{“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中configuration了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运行将registry映射到127.0.0.1:5000和192.168.0.101:5000。 现在在你的机器上只有这个127.0.0.1才能工作。 现在当你使用

 3- minikube ssh 

你进入minikube机器,并没有一个运行在127.0.0.1:5000的registry。 所以错误。 使用机器IP的本机内部registry不可访问。

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

所以在你的机器上在/etc/hosts创build一个条目

 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 ,在/etc/hostsinputdocker.local的条目

 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 –insecure-registry 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 –insecure-registry 10.0.0.0/24 –insecure-registry docker.local:5000 – 不安全registry192.168.1.4:5000

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

 systemctl daemon-reload systemctl start docker 

之后,尝试拉

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

而命令应该工作

您可以发出以下命令,将docker CLI指向minikube:eval $(minikube docker-env)然后,您可以在那里创build映像,或者从您拥有并导入的位置导出映像。

如何在Docker容器中使用from from hostmachine访问进程?

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

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

Mac有一个不断变化的IP地址(如果你没有networking访问权限,则没有)。 从17.06开始,我们的build议是连接到特殊的仅限于Mac的DNS名称docker.for.mac.localhost,该名称将parsing为主机使用的内部IP地址。

假设这个minikube的主要目的是为了本地testing,有一个更简单的方法部署你的docker容器(这甚至不需要本地dockerregistry)

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

首先要理解的是,当你在你的机器上安装docker的时候,它有两个部分,1)一个docker cli,你可以和docker守护进程交互2)一个docker守护进程。 在这个方法中,我们将我们的本地docker cli指向minikube的docker守护进程并执行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守护进程非常方便; 因为这意味着您不必在主机上构builddockerregistry,并将图像推入其中,您可以在与minikube相同的docker守护进程中构build,从而加快本地实验的速度。 只要确保你用'最新'以外的东西来标记你的Docker镜像,并在你拉取镜像时使用这个标签。 否则,如果你没有指定图像的版本,那么它将被假定为:latest,带有总是相应的拉graphics策略,最终可能会导致ErrImagePull,因为在默认情况下你可能没有任何版本的Docker镜像dockerregistry(通常是DockerHub)呢。

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

eval $(minikube docker-env)

你现在应该可以在你的主机mac / linux机器上的命令行中使用docker与minikube VM里面的docker守护进程交谈:

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

现在build立你的docker形象。 那么它将在minikube为您提供。