laravel 为什么host.docker.internal无法解析我的内部IP

ukxgm1gy  于 2023-02-05  发布在  Docker
关注(0)|答案(2)|浏览(301)

我试图通过host.docker.internal连接到host OS MySQL,如果我直接在Docker容器内托管的Laravel应用程序中提到我的内部IP,我就可以连接。

    • 操作系统/环境:**主机操作系统和版本:MacOS Monterey 12.5.1 Docker桌面版:4.12.0(85629)Docker桌面引擎:引擎:2017年10月20日Docker桌面合成版本:版本2.10.2
    • 问题:**这些是我将Docker中的Laravel应用程序连接到我的主机操作系统MySQL所采取的步骤。我成功地通过主机操作系统的内部IP地址连接了我的应用程序,但内部IP不断变化,每次IP变化时都很难更改laravel. env中的DB_HOST。所以我想使用host.docker.internal,但我不工作。
    • 步骤:**

1:docker-compose down(删除所有容器)
2:我删除了devilbox .env portHOST_PORT_MYSQL=
3:我更改了我的host OS MySQL to 3306的端口,并使用sequel ace,我成功地使用这些凭据连接到mysql
x1名6名1 x 1名7名1 x 1名8名1 x 1名9名1 x
4:为了从Docker连接到我的主机操作系统MySQL,我必须编辑我的my.cnf文件,或者在这种情况下为MySQL创建一个新的文件,这里是my. cnf
一个月十一个月一个月一个月一个月十二个月一个月
5:重新启动MySQL服务器并确认MySQL现在可以侦听所有IP,而不仅仅是localhost
6:使用此命令
netstat -anp tcp | grep 3306 OR netstat -ap tcp | grep -i "listen"
x一个米14个一个米15个一个x一个米16个一个x一个米17个一个x一个米18个一个x一个米19个一个x一个米20个一个x一个米21个一个x一个米22个一个x一个米23个一个x一个米24个
7:确认3306已列出后,需要创建一个MySQL用户,该用户将从localhost以外的其他位置连接
8:在MySQL shell中,我执行了这些查询,因为我使用的是MySQL 8.0.27,所以创建用户和授予权限必须在单独的查询中。
x 1米26英寸x 1米27英寸x 1米28英寸
9:要确保已创建root@%用户,请键入
SELECT User, Host FROM mysql.user;存在two root usersone with host set to localhostsecond one is %
10:现在是时候编辑Laravel .env MySQL部分了
DB_CONNECTION=mysqlDB_HOST=192.168.18.190//我的主机内部ip(主机. docker.内部不工作)DB_PORT=3306DB_DATABASE=hangerDB_USERNAME=rootDB_PASSWORD=root
注意:我的DB_HOST不能与127.0.0.1host.docker.internal一起工作,所以我想它可能能与我的本地IP一起工作,它做到了。
11:要查找我在MAC上的本地IP,请转到系统偏好设置〉网络〉我的wifi连接〉高级〉TCP/IP〉IPv4下www.example.com192.168.43.182
我担心的事情是,我的本地IP不断变化,根据文档The following sections will give you the IP address and/or the CNAME where the host os can be reached from within a container. www.example.com Docker应该能够通过host.docker.internal连接到我的主机,它没有,我不知道为什么。你能请任何人请指出我的方向,我应该怎么做才能找出这个问题?https://devilbox.readthedocs.io/en/latest/advanced/connect-to-host-os.html#docker-18-03-0-ce-and-docker-compose-1-20-1 The docker should be able to connect through host.docker.internal to my Host machine, which it does not and i don't know why. Can you please anyone please point me in the direction what should i do to figure out this issue ?

yhuiod9q

yhuiod9q1#

不知道为什么它能在一些mac机器上工作而在另一些上不能,但是你可以通过在你的docker-compose的extra_hosts下添加"host.docker.internal:host-gateway"来强迫dockerMaphost.docker.internal,你应该可以用它来发布这个。

wecizke3

wecizke32#

同样的问题,"host. docker. internal"用于开发目的,在Docker Desktop以外的生产环境中不起作用。
https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
建议解决方案:
1.数据库端口(通常为3306,用于mysql、mariadb等)必须在主机上可用,您必须检查防火墙并打开该端口。
如果使用ufw,则命令如下:

sudo ufw allow 3306

1.应在数据库配置中更改bind_address。
一般情况下,可通过以下方式访问文件:/etc/我的. cnf

bind_address = 0.0.0.0

在你的情况下,你已经这样做了。
1.之后,您需要查看码头桥网络网关的IP地址,并输入此值作为数据库的主机访问值,通常为IP地址: www.example.com172.17.0.1
要检查网桥网络详细信息,请运行以下命令:

docker network inspect bridge

结果将是一个JSON,您将在其中找到网桥网关的IP:

"IPAM": {
     "Driver": "default",
     "Options": null,
     "Config": [
         {
             "Subnet": "172.17.0.0/16",
             "Gateway": "172.17.0.1"
         }
     ]
 }

如果一切都设置正确,您可以从Docker容器访问主机上的数据库。

相关问题