docker容器无法访问宿主机数据库

今天用docker部署一个web服务时遇到总是连不上宿主机mysql数据库的问题,报SQLSTATE[HY000] [2002] Connection refused,经过测试,宿主机用相同配置可以连上,登入docker容器内就连不上,初步判断容器内通过localhost或127.0.0.1是连不上宿主机的。具体原因和解决方法如下:

原因:

  1. docker容器内的localhost并不是指宿主机的localhost
  2. docker在运行时就建立了虚拟网卡,并命名为docker0,在宿主机ifconfig可以看到网桥的ip是172.17.0.1(不同机器或者docker版本ip可能不同,需要查下自己的是多少)

今天用docker部署一个web服务时遇到总是连不上宿主机mysql数据库的问题,报SQLSTATE[HY000] [2002] Connection refused,经过测试,宿主机用相同配置可以连上,登入docker容器内就连不上,初步判断容器内通过localhost或127.0.0.1是连不上宿主机的。具体原因和解决方法如下:

原因:

  1. docker容器内的localhost并不是指宿主机的localhost
  2. docker在运行时就建立了虚拟网卡,并命名为docker0,在宿主机ifconfig可以看到网桥的ip是172.17.0.1(不同机器或者docker版本ip可能不同,需要查下自己的是多少)
docker容器无法访问宿主机数据库

解决方法:

  1. 在容器内通过172.17.0.1:3306访问宿主机的mysql
$ docker exec -it 8686d3dda02c /bin/sh
 $ mysql -ushowx -p --database showx -P3306 -h172.17.0.1  #可以看到连上了,只是ip没有访问授权
ERROR 1130 (HY000): Host '172.17.0.2' is not allowed to connect to this MySQL server
  1. 设置宿主机mysql允许docker0的虚拟网卡ip访问
# 宿主机mysql设置允许用户showx通过172.17.0.2访问showx数据库的任意表
$ mysql -uroot -p
 mysql>GRANT ALL PRIVILEGES ON showx.* TO 'showx'@'172.17.0.2' IDENTIFIED BY 'password' WITH GRANT OPTION; 
 mysql>flush privileges; 

# docker内测试docker0 ip链接
$ docker exec -it 8686d3dda02c /bin/sh
$ mysql -ushowx -p --database showx -P3306 -h172.17.0.1
MySQL [showx]>
  1. 修改容器web服务的db ip配置即可

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9486

(0)
郭靖的头像郭靖
上一篇 2023年8月8日 下午5:26
下一篇 2023年8月9日 下午4:11

相关推荐

  • MySQL 中 DELETE 语句中可以使用别名么?

    某天,正按照业务的要求删除不需要的数据,在执行 DELETE 语句时,竟然出现了报错! 背景 某天,正按照业务的要求删除不需要的数据,在执行 DELETE 语句时,竟然出现了报错(MySQL 数据库版本 5.7.34): 这就有点奇怪了,因为我在执行删除语句之前,执行过同样条件的 SELECT 语句,只是把其中的 select * 换成了…

    2023年11月22日
    1.4K00
  • Redis 常用命令

    一、redis启动: Redis 连接命令 二、redis keys命令 三、reids字符串命令 四、Redis hash 命令 五、Redis 列表命令 六、Redis 集合命令 七、Redis 有序集合命令 八、Redis 发布订阅命令 九、Redis 事务命令 十、Redis 脚本命令 十一、Redis 服务器命令

    2022年7月29日
    1.3K00
  • MySQL 如何避免克隆失败后再次初始化

    在我之前关于 CLONE INSTANCE 命令的博客文章《MySQL 克隆插件不是你的备份》中,我提到使用选项 DATA DIRECTORY 有助于避免在克隆操作失败时需要从头开始重新初始化副本和克隆相关设置的情况。 MySQL 克隆插件简化了新副本的配置,但不会简化失败后的服务器恢复,除非您准备从头开始重新安装 M…

    2023年10月23日
    1.5K00
  • mysql误删数据后,从binlog中进行恢复删除数据

    从mysql的logbin中恢复误删数据在一次数据维护过程中,对数据删除时没有提前备份数据,导致数据被删除后无法通过备份文件直接恢复。 1.查找当前操作的binlog状态在myql命令行或者链接工具中,命令查看binlog当前的位置状态和文件信息。 2.flush logs刷新状态 在myql命令行或者链接工具中,使用flush logs命令重新生成新的bi…

    2023年7月29日
    1.1K00
  • 解决Redis、MySQL缓存双写不一致问题

    redis、mysql双写缓存不一致: 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。目前没有一篇全面的博客,对这几种方案进行解析。 正文 给缓存数据设置过期时间 先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过…

    2022年8月21日
    1.3K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信