我在我的机器上设置了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来自哪里
那我怎么能解决这个问题呢。
谢谢:)
答案 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)
在码头工人土地上这是一个很受欢迎的问题。看这里。 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注册表)
首先要理解的是,当您在机器中安装docker时,它有2个部分,1)docker cli,您可以使用docker守护进程与docker守护进程进行交互2)docker守护进程。在这种方法中,我们将本地docker cli指向minikube的docker守护进程并执行docker build
。
引用相关部分
当使用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)然后您可以在那里构建图像,或者从您拥有它们的任何地方导出它们并导入。