无法连接正在运行的 Docker 容器 (minikube docker daemon)。

4
当我使用Docker Desktop for Windows运行我的Docker容器时,我可以通过以下方式连接到它:
docker run -p 5051:5000 my_app

http://0.0.0.0:5051

然而,当我打开另一个终端并执行以下操作时:

minikube docker-env | Invoke-Expression

使用与上文相同的运行命令,构建并运行相同的容器。

我无法连接到正在运行的实例。

我应该使用Docker桌面版来运行和测试容器,然后只将镜像存储在minikube中(用于Kubernetes)吗?还是可以通过minikube运行和测试它们?


你有没有在单台机器上同时使用Docker Desktop和Minikube的特定原因? - mario
@mario 不,我最近才知道minikube有一个docker守护进程,这就是为什么我两个都有的原因。 - erotavlas
2个回答

6

这是因为在第二次尝试时,容器不是在主机上运行,而是在minikube虚拟机上运行。 您可以使用minikube虚拟机IP访问它。
要获取minikube IP,可以运行minikube ip

为什么?

调用minikube docker-env会设置所有docker env变量以匹配minikube环境。 这意味着在此之后运行容器时,它将与minikube VM上的docker守护程序一起运行。


所以在运行容器之后,我应该像这样访问它:http://<minikubeip>:5051 - erotavlas
是的。为了确保,您可以使用 minikube ssh 连接到 minikube 并尝试查看您的容器是否在虚拟机中运行。 - Marc ABOUCHACRA

1
我问你是否有任何特定原因在单台计算机上同时使用Docker DesktopMinikube,因为这两个竞争性解决方案基本上可以让您执行类似的任务并实现相同的目标。 这篇文章很好地解释了这两个工具之间的区别。
Docker-for-windows使用Type-1 hypervisor(例如Hyper-V),这比Type-2 hypervisors(例如VirtualBox)更好,而Minikube支持两种hypervisors。不幸的是,由于您不能在同一时间在计算机上运行Type-1或Type-2 hypervisors,因此存在一些技术限制。
如果您同时使用Docker DesktopMinikube,我假设您正在使用Type-1 hypervisor,如上述Hyper-V,但请记住,即使它们使用相同的hypervisor,这两个工具也会创建自己的虚拟机实例。基本上,您不应该使用这两个工具,期望它们将作为混合体,让您管理单个容器环境。

首先确定您使用的是哪种虚拟化软件。如果您使用的是 Hyper-V,则在 Powershell 中简单运行 Get-VM 命令(更多详细信息请参见 this 文章),这将告诉您当前正在使用的虚拟化软件。

@mario 不,我不知道 minikube 最近有一个 docker 守护程序,这就是为什么我两者都有的原因

是的,Minikube内置了Docker环境(实际上它会设置所有内容,但确实也会设置容器运行时),因此基本上您不需要额外安装Docker。正如@Marc ABOUCHACRA在他的答案中建议的那样,Minikube在单独的VM上运行整个环境(带有Docker运行时的单节点k8s集群)。Linux版本有一个选项--vm-driver=none,允许您使用主机容器运行时并在其上设置k8s组件,但Windows版本不支持这种情况-在这里,您只能使用两种当前支持的hypervisor之一:Hyper-V或VirtualBox(ref)。
我不会说Docker Destkop在您的主机上运行所有内容。它还使用Type-1 hypervisor来运行容器运行时环境。请检查计算机上的Get-VM命令,应该清楚您拥有哪些VM以及由哪个工具创建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接