所以我在 docker 容器中运行了一个 Nginx,我在主机系统上运行了一个 mysql,我想从我的容器中连接到 MySql。 MySql 仅绑定到 localhost 设备。
有没有办法从这个 docker 容器中连接到这个 MySql 或本地主机上的任何其他程序?
这个问题与“如何从 docker 容器内部获取 docker 主机的 IP 地址”不同,因为 docker 主机的 IP 地址可能是网络中的公共 IP 或私有 IP,这可能是也可能是无法从 docker 容器中访问(如果托管在 AWS 或其他地方,我的意思是公共 IP)。即使您拥有 docker 主机的 IP 地址,但这并不意味着您可以从容器内连接到 docker 主机,因为您的 Docker 网络的 IP 地址可能是覆盖、主机、网桥、macvlan、none 等,这限制了那个IP地址。
原文由 Phil 发布,翻译遵循 CC BY-SA 4.0 许可协议
编辑:
如果您使用的是 Docker-for-mac 或 Docker-for-Windows 18.03+,只需使用主机
host.docker.internal
连接到您的 mysql 服务(而不是连接字符串中的127.0.0.1
) .如果您使用的是 Docker-for-Linux 20.10.0+,您还可以使用主机
host.docker.internal
如果 您使用--add-host host.docker.internal:host-gateway
选项启动 Docker 容器。否则,请阅读下文
TLDR
在您的
docker run
命令中使用--network="host"
,然后在您的127.0.0.1
容器中使用 --- 将指向您的 docker 主机。注意: 根据文档,此模式仅适用于 Docker for Linux。
docker 容器网络模式注意事项
Docker 在运行容器时提供了 不同的网络模式。根据您选择的模式,您将连接到在 docker 主机上运行的 MySQL 数据库。
docker run –network=“bridge” (默认)
Docker 默认创建一个名为
docker0
的网桥。 docker 主机和 docker 容器在该网桥上都有一个 IP 地址。在 Docker 主机上,键入
sudo ip addr show docker0
您将得到如下输出:所以这里我的docker主机在
docker0
网络接口上有IP地址172.17.42.1
。现在启动一个新容器并在其上安装一个 shell:
docker run --rm -it ubuntu:trusty bash
并在容器类型ip addr show eth0
中发现它的主网络接口是如何设置的:这里我的容器有 IP 地址
172.17.1.192
。现在查看路由表:因此 docker 主机的 IP 地址
172.17.42.1
被设置为默认路由,并且可以从您的容器访问。搬运工运行–network =“主机”
或者,您可以运行一个将 网络设置设置为
host
的 docker 容器。这样的容器将与 docker 主机共享网络堆栈,从容器的角度来看,localhost
(或127.0.0.1
)将引用 docker 主机。请注意,在您的 docker 容器中打开的任何端口都将在 docker 主机上打开。这不需要
-p
或-P
docker run
选项。我的 docker 主机上的 IP 配置:
并从 主机 模式下的 docker 容器中:
如您所见,docker 主机和 docker 容器共享完全相同的网络接口,因此具有相同的 IP 地址。
从容器连接到 MySQL
桥接模式
要从容器以 桥接模式 访问在 docker 主机上运行的 MySQL,您需要确保 MySQL 服务正在侦听
172.17.42.1
IP 地址上的连接。为此,请确保您的 MySQL 配置文件 (my.cnf) 中有
bind-address = 172.17.42.1
或bind-address = 0.0.0.0
。如果需要使用网关的 IP 地址设置环境变量,可以在容器中运行以下代码:
然后在您的应用程序中,使用
DOCKER_HOST_IP
环境变量打开与 MySQL 的连接。注意: 如果您使用
bind-address = 0.0.0.0
您的 MySQL 服务器将侦听所有网络接口上的连接。这意味着可以从 Internet 访问您的 MySQL 服务器;确保相应地设置防火墙规则。注意 2: 如果您使用
bind-address = 172.17.42.1
您的 MySQL 服务器将不会侦听与127.0.0.1
的连接。在 docker 主机上运行的想要连接到 MySQL 的进程必须使用172.17.42.1
IP 地址。主机模式
要从 主机模式下 的容器访问在 docker 主机上运行的 MySQL,您可以在 MySQL 配置中保留
bind-address = 127.0.0.1
,您需要做的就是从您的容器连接到127.0.0.1
:注意:请 使用
mysql -h 127.0.0.1
而不是mysql -h localhost
;否则 MySQL 客户端将尝试使用 unix 套接字进行连接。