【发布时间】:2018-05-10 17:45:39
【问题描述】:
说,如果我在 docker 容器中使用这个命令。
/opt/lampp/bin/mysql -h localhost -u root -pThePassword
这里的 localhost 指的是什么?主机的IP还是docker容器自己的IP?
【问题讨论】:
-
取决于(ish)但 99% 的时间 = 容器。
说,如果我在 docker 容器中使用这个命令。
/opt/lampp/bin/mysql -h localhost -u root -pThePassword
这里的 localhost 指的是什么?主机的IP还是docker容器自己的IP?
【问题讨论】:
从容器内部,localhost 总是指当前容器。它从不引用另一个容器,它从不引用不在同一个容器中的物理系统上运行的任何其他东西。与localhost 建立出站连接或将localhost 配置为您的数据库主机通常没有用处。
从主机系统上的 shell,localhost 可以指代在 Docker 之外的系统上运行的守护进程,或者指您使用 docker run -p 选项发布的端口。
来自不同的系统,localhost 指的是调用它的系统。
在 IP 地址方面,localhost 始终为 127.0.0.1,并且该 IP 地址是特殊的,始终为 localhost,其行为方式与上述相同。
如果您想与容器建立连接...
...从另一个容器,最好的方法是确保它们在同一个 Docker 网络上(你从同一个 Docker Compose YAML 文件启动它们;你做了一个docker network create然后在同一网络上执行docker run --net ...)并使用Docker的内部DNS服务通过容器的--name或其在Docker Compose YAML文件中的名称和容器内的端口号来引用它们。即使目标具有带有 docker run -p 选项或 Docker Compose ports: 设置的已发布端口,也请使用 second(容器内部)端口号。
...从 Docker 空间外部,确保使用 docker run -p 或 Docker Compose ports: 选项启动容器,并连接到 主机的 IP使用该选项中的第一个端口号的地址或 DNS 名称。
...来自同一物理主机上的终端窗口或浏览器,而不是在容器中,在这种情况下且仅在这种情况下,localhost 将始终如一地工作。
除外:
如果您使用--net host 启动容器,localhost 指的是物理主机,并且您处于“同一物理主机上的终端窗口”场景中。
如果您想在同一个容器中拥有多个服务器,您可以使用localhost 在它们之间进行通信。
如果您在 Kubernetes 中运行,并且在同一个 pod 中有多个容器,则可以使用 localhost 在它们之间进行通信。在 pod 之间,您应该在每个 pod/deployment 之前设置一个服务,并使用 service-name.namespace-name.svc.cluster.local 形式的 DNS 名称。
【讨论】:
localhost总是指当前容器,你怎么连接到运行在主机上的数据库,而不是在容器中?
当然,如果您在容器中运行命令,它将是您的容器。
/opt/lampp/bin/mysql -h localhost -u root -pThePassword
如果您在容器内运行此命令,那么它将尝试连接在容器内运行的 mysql。
【讨论】: