【问题标题】:Localhost vs 0.0.0.0 with Docker on Mac OS本地主机与 0.0.0.0 在 Mac OS 上使用 Docker
【发布时间】:2018-04-12 01:06:48
【问题描述】:

我正在阅读文档here,我发现自己有点困惑,因为正在运行
docker run --name some-mysql -p 3306:3306 -d mysql

docker run --name some-mysql -p 127.0.0.1:3306:3306 -d mysql

然后mysql --host localhost --port 3306 -u root 给我以下错误:

ERROR 2002 (HY000): 无法通过套接字'/tmp/mysql.sock' (2) 连接到本地 MySQL 服务器。

但运行 mysql -u root -p --host 0.0.0.0 可以。

有人解释一下吗?

【问题讨论】:

标签: macos docker localhost


【解决方案1】:

使用 docker 端口转发,您需要跟踪两个网络命名空间。第一个在您的容器内。如果您在容器内的 localhost 上进行侦听,则容器外的任何内容都无法连接到您的应用程序。这包括阻止来自 docker 主机和容器到容器网络的端口转发。因此,除非您的容器正在与自己对话,否则您始终会在 0.0.0.0 上监听您在容器内运行的应用程序。

第二个网络命名空间在您的 docker 主机上。当您转发带有docker run -p 127.0.0.1:1234:5678 ... 的端口时,该端口在 docker 主机接口 127.0.0.1 端口 1234 上配置侦听器,并将其转发到容器命名空间端口 5678(该容器必须在 0.0.0.0 上侦听)。如果你不指定 ip,docker 会在主机的所有接口上发布端口。

因此,当您将 mysql 配置为侦听 127.0.0.1 时,无法从容器的网络命名空间之外访问它。如果您需要阻止 docker 主机之外的其他人访问该端口,请在 docker run cli 上发布该端口时配置该限制。

【讨论】:

    【解决方案2】:

    如 mysql 文档 (https://dev.mysql.com/doc/refman/5.7/en/connecting.html) 中所述,当您使用客户端连接到 127.0.0.1 时,它将尝试使用 unix 套接字执行此操作。通常这可以正常工作,因为它位于同一主机上。在 Docker 中,套接字文件不可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-11
      • 2022-08-18
      • 2022-06-14
      • 2016-01-17
      • 1970-01-01
      • 2022-01-02
      • 2021-06-02
      • 2021-01-20
      相关资源
      最近更新 更多