本地主机与 0.0.0.0 在 Mac OS 上使用 Docker

Posted

技术标签:

【中文标题】本地主机与 0.0.0.0 在 Mac OS 上使用 Docker【英文标题】:Localhost vs 0.0.0.0 with Docker on Mac OS 【发布时间】: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 可以。

有人解释一下吗?

【问题讨论】:

***.com/questions/8348506/… 这看起来像是MySQL localhost / 127.0.0.1 problem的复制品(尤其是唐晓峰的回答)。 哦,我没有意识到问题出在 MySQL 而不是 Docker。谢谢大家的帮助! 【参考方案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 中,套接字文件不可用。

【讨论】:

以上是关于本地主机与 0.0.0.0 在 Mac OS 上使用 Docker的主要内容,如果未能解决你的问题,请参考以下文章

Docker 工具箱 - 本地主机不工作

Mac OS 名称问题及修改方法(修改终端中显示的hostname(主机名称) / 电脑名称 / 管理员名称 / LocalHostName(本地主机名称))

Mac OS 名称问题及修改方法(修改终端中显示的hostname(主机名称) / 电脑名称 / 管理员名称 / LocalHostName(本地主机名称))

nuxt项目修改本地运行的端口

nuxt项目修改本地运行的端口

0.0.0.0 127.0.0.1 localhost 192.168.1.xxx 区别与联系?