在Mac OS上使用Docker的Localhost与0.0.0.0

Aym*_* R. 3 macos localhost 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有效。

有人有解释吗?

BMi*_*tch 8

使用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 runcli 上发布端口时配置该限制。