在Mac OS上使用Docker的Localhost vs 0.0.0.0

时间:2017-10-30 23:17:55

标签: macos docker localhost

我正在阅读文档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):无法通过socket' /tmp/mysql.sock'连接到本地MySQL服务器; (2)。

但正在运行mysql -u root -p --host 0.0.0.0

有人有解释吗?

2 个答案:

答案 0 :(得分:5)

使用docker端口转发,您需要跟踪两个网络命名空间。第一个是在容器内。如果您在容器内部侦听localhost,则容器外部的任何内容都不能连接到您的应用程序。这包括阻止从docker主机和容器到容器网络的端口转发。因此,除非您的容器正在自行处理,否则您始终使用正在容器内运行的应用程序监听0.0.0.0。

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

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

答案 1 :(得分:2)

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