说,如果我在Docker容器中使用此命令。
/opt/lampp/bin/mysql -h localhost -u root -pThePassword
这里的本地主机指的是什么?主机的IP还是Docker容器自己的IP?
从容器内部开始 ,localhost始终引用当前容器。它永远不会引用另一个容器,也永远不会引用物理系统中运行的不在同一容器中的任何其他内容。建立与数据库主机的出站连接localhost或将其配置localhost为数据库主机通常没有用。
localhost
从主机系统上的Shell中 ,localhost可以指代在Docker之外的系统上运行的守护程序,或者指代您已使用docker run -p选件发布的端口。
docker run -p
在不同的系统中 ,localhost是指从其调用的系统。
就IP地址而言 ,localhost始终为127.0.0.1,并且该IP地址是特殊的,并且始终localhost且其行为与上述相同。
如果要连接到容器…
…从另一个容器中 ,最好的方法是确保它们位于相同的Docker网络上(您是从相同的Docker Compose YAML文件启动的;您在同一网络上执行了docker network create,然后又docker run --net ...在同一网络上进行了操作)并使用Docker的内部DNS服务可以通过--nameDocker Compose YAML文件中的容器名称或容器内部的端口号来引用它们。即使目标具有已发布的带有docker run -p选项或Docker Compose ports:设置的端口,也要使用 第二个 (容器内部的)端口号。
docker network create
docker run --net ...
--name
ports:
…从Docker空间外部 ,确保您使用docker run -p或Docker Compose ports:选项启动了容器,并使用该选项中的第一个端口号连接到 主机的 IP地址或DNS名称。
…从同一物理主机上的终端窗口或浏览器而 不是在容器中,在这种情况下(仅在这种情况下)localhost将一致地工作。
除了:
如果您使用来启动容器--net host,则localhost指的是物理主机,并且您处于“同一物理主机上的终端窗口”场景中。
--net host
如果您不愿意在同一个容器中拥有多个服务器,则可以使用localhost它们之间进行通信。
如果您在Kubernetes中运行,并且同一容器中有多个容器,则可以使用localhost它们在它们之间进行通信。在Pod之间,您应该在每个Pod /部署之前设置服务,并使用形式的DNS名称service-name.namespace-name.svc.cluster.local。
service-name.namespace-name.svc.cluster.local