【问题标题】:What does localhost means inside a Docker container?localhost 在 Docker 容器中是什么意思?
【发布时间】:2018-05-10 17:45:39
【问题描述】:

说,如果我在 docker 容器中使用这个命令。

/opt/lampp/bin/mysql -h localhost -u root -pThePassword

这里的 localhost 指的是什么?主机的IP还是docker容器自己的IP?

【问题讨论】:

  • 取决于(ish)但 99% 的时间 = 容器。

标签: linux docker


【解决方案1】:

从容器内部localhost 总是指当前容器。它从不引用另一个容器,它从不引用不在同一个容器中的物理系统上运行的任何其他东西。与localhost 建立出站连接或将localhost 配置为您的数据库主机通常没有用处。

从主机系统上的 shelllocalhost 可以指代在 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 名称。

【讨论】:

【解决方案2】:

当然,如果您在容器中运行命令,它将是您的容器。

/opt/lampp/bin/mysql -h localhost -u root -pThePassword

如果您在容器内运行此命令,那么它将尝试连接在容器内运行的 mysql。

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 2019-10-27
    • 2021-01-19
    • 1970-01-01
    • 2018-12-17
    • 2023-03-27
    • 2019-02-18
    • 2021-07-21
    相关资源
    最近更新 更多