本地主机vs 0.0.0.0与Mac OS上的Docker

我正在阅读这里的文档,从运行起,我发现自己有些困惑
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给我以下错误:

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

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

有人有解释吗?

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

使用docker端口转发,有两个networking名称空间需要跟踪。 首先是在你的容器内。 如果您在容器内的本地主机上侦听,则容器外部没有任何内容可以连接到您的应用程序。 这包括阻止从docker主机和容器到集装箱联网的端口转发。 所以,除非你的容器是自带的,否则你总是在容器中运行的应用程序听0.0.0.0。

第二个networking命名空间在你的docker主机上。 当你用docker run -p 127.0.0.1:1234:5678 ...转发一个端口docker run -p 127.0.0.1:1234:5678 ...在docker主机接口127.0.0.1端口1234上configuration一个监听器,并将其转发到容器命名空间端口5678(该容器必须监听在0.0.0.0)。 如果你离开的IP,docker将在主机上的所有接口发布端口。

所以当你configurationmysql在127.0.0.1上侦听的时候,没有办法从容器的networking命名空间以外访问它。 如果需要防止docker主机外的其他人到达端口,请在docker run cli上发布端口时configuration该限制。