Docker容器的程序连接宿主机的MySQL

本文介绍如何从Docker容器内访问宿主机上的MySQL服务器。由于容器内的localhost不指向宿主机,需通过特定IP(如172.17.0.1)访问。文章还介绍了设置MySQL权限的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker里面的代码生成的数据需要写入到宿主机的Mysql服务器上,想要用本地的数据库测试自己的代码正确性,项目程序安装在docker容器中,于是必定要在docker容器里访问到本地的数据库。

(1)在docker容器里localhost并不是指宿主机的localhost,因此不能在容器中通过localhost:3306访问到宿主机的mysql,也不可以通过127.0.0.1访问。

(2)docker在运行时就建立了虚拟网卡,并命名为docker0,可以在宿主机上运行ifconfig看到它,这就是宿主机建立的网桥,用于与各个容器之间通信。

[root@VM-8-15-centos ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:53ff:fed0:4c11  prefixlen 64  scopeid 0x20<link>
        ether 02:42:53:d0:4c:11  txqueuelen 0  (Ethernet)
        RX packets 4489  bytes 6944799 (6.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3379  bytes 999348 (975.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig 为什么看不到 docker0
在最近的 Docker 版本中,docker0 网络接口已经被弃用,因此您在使用最新版本的 Docker 时可能看不到该接口。

相反,Docker 现在使用名为 bridge 的网络驱动程序来管理 Docker 容器的网络连接。您可以使用 ip addr 命令来查看当前正在运行的 Docker 网络:

$ ip addr show docker0

(3)宿主机在与容器同一局域网的IP地址一般是docker0对应的IP地址段的首个地址(如172.17.0.1),因此,可以在容器里通过172.17.0.1:3306访问到宿主机的mysql服务器。

mysql服务器默认的设置为允许127.0.0.1段的ip地址访问

如果用172.17.0.1:3306仍然无法访问到宿主机的话,需要设置一下mysql的访问权限:

如果用的是宝塔面板,可以给nacos这个数据库设置权限为所有人

 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678' WITH GRANT OPTION;
 mysql>flush privileges;
// 其中各字符的含义:
// *.* 对任意数据库任意表有效
// "root" "12345678" 是数据库用户名和密码
// '%' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
// flush privileges 刷新权限信息