我有一个Nginx在码头集装箱里运行。我在主机系统上运行了MySql。我想从我的容器中连接到MySql。MySql仅绑定到本地主机设备。

是否有任何方法可以从这个docker容器连接到这个MySql或本地主机上的任何其他程序?

这个问题与“如何从docker容器中获取docker主机的IP地址”不同,因为docker主机IP地址可以是网络中的公共IP或私有IP,而这些IP可能在docker容器内无法访问(如果托管在AWS或其他地方,我指的是公共IP)。即使你有docker主机的IP地址,这并不意味着你可以从容器内连接到docker主机,因为你的docker网络可能是overlay、host、bridge、macvlan、none等,这限制了该IP地址的可达性。


当前回答

对于窗口,

我已经更改了spring配置中的数据库url:spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb

然后构建映像并运行。这对我有用。

其他回答

我通过在MySQL中为容器的ip创建一个用户来解决这个问题:

$ sudo mysql<br>
mysql> create user 'username'@'172.17.0.2' identified by 'password';<br>
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on database_name.* to 'username'@'172.17.0.2' with grant option;<br>
Query OK, 0 rows affected (0.00 sec)

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
<br>bind-address        = 172.17.0.1

$ sudo systemctl restart mysql.service

然后在容器上:jdbc:mysql://<b>172.17.0.1</b>:3306/database_name

适用于所有平台

Docker v 20.10及以上(自2020年12月14日起)

使用内部IP地址或连接到特殊DNS名称host.docker.internal,该名称将解析为主机使用的内部IP地址。

在Linux上,使用Docker命令,将--add host=host.Docker.internal:host gateway添加到Docker命令以启用此功能。

要在Linux上的Docker Compose中启用此功能,请在容器定义中添加以下行:

extra_hosts:
    - "host.docker.internal:host-gateway"

对于较旧的macOS和Windows版本的Docker

Docker v 18.03及以上(自2018年3月21日起)

使用内部IP地址或连接到特殊DNS名称host.docker.internal,该名称将解析为主机使用的内部IP地址。

Linux支持待定https://github.com/docker/for-linux/issues/264

对于Docker的旧macOS版本

Mac版本17.12至18.02的Docker

同上,但改用docker.for.mac.host.internal。

Mac版Docker 17.06至17.11

同上,但改用docker.for.mac.localhost。

适用于Mac 17.05及以下版本的Docker

要从docker容器访问主机,必须将IP别名附加到网络接口。您可以绑定任何您想要的IP,只需确保您没有将其用于其他任何内容。

sudo ifconfig lo0别名123.123.123.123/24

然后确保您的服务器正在侦听上面提到的IP或0.0.0.0。如果它在本地主机127.0.0.1上侦听,它将不接受连接。

然后只需将docker容器指向该IP,即可访问主机!

为了测试,可以在容器内运行类似curl-X GET 123.123.123.123:3000的命令。

别名将在每次重新启动时重置,因此如果需要,请创建启动脚本。

此处的解决方案和更多文档:https://docs.docker.com/docker-for-mac/networking/#use-案例和解决方案

Windows 10解决方案

Docker社区版17.06.0-ce-2018 2017-06-28(稳定)

您可以使用主机docker.for.win.localhost的DNS名称解析为内部IP。(警告一些消息来源提到了窗口,但应该是赢家)

概述我需要做类似的事情,即从Docker容器连接到运行Azure Storage Emulator和CosmosDB Emulator的本地主机。

Azure Storage Emulator默认监听127.0.0.1,虽然您也可以更改IP的绑定,但我正在寻找一个可以使用默认设置的解决方案。

这也适用于从Docker容器连接到SQL Server和IIS,两者都在我的主机上以默认端口设置本地运行。

我这样做的方式是将主机IP作为环境变量传递给容器。然后容器通过该变量访问主机。

在host.docker.internal为每个平台工作之前,您可以使用我的容器作为NAT网关,而无需任何手动设置:

https://github.com/qoomon/docker-host