当前位置: 首页 > news >正文

docker容器中连接宿主机mysql数据库

最近要在docker中使用mysql数据库,首先考虑在ubuntu的镜像中安装mysql,这样的脚本和数据库都在容器中,直接访问localhost:3306,脚本很简单,如下:

import pymysql# 建立数据库连接
db = pymysql.connect(port=3306,host="localhost",user="root",password="password",database="my_db"
)# 创建游标对象
cursor = db.cursor()# 执行SQL查询
sql = "SELECT * FROM user"
cursor.execute(sql)# 获取查询结果
result = cursor.fetchall()# 处理查询结果
for row in result:print(row)# 关闭数据库连接
db.close()

但这样有个问题,数据库不能持久化,每次更新应用都要更更新数据库,而且每个应用都带个数据库会导致资源浪费,所以需要把数据库放在宿主机器,但这样宿主机和容器网络要相通。

于是我在windows中先试验连接,首先通过如下方式启动

docker run -it --network host --name my_continer_name my_image_name

注意我指定了host的网络模式,即主机和容器共享网络,理论上来讲在容器内访问宿主机可以通过localhost:3306访问了,但是一直遇到一个错误:

ConnectionRefusedError: [Errno 111] Connection refused

……

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)")

后来查询才发现,window不支持host模式,所以开了也没用。

window安装DockerDesktop无法使用host网络模式解决方案_docker注册服务为什么不认host-CSDN博客文章浏览阅读2.3k次,点赞7次,收藏12次。创建网桥启动容器的同时绑定网桥同时设置固定ip​启动另一个服务​使用网桥的好处就是容器之间是共享网络的,双向的,比–link的方式要灵活,而且容器内ip可以指定号,更加可控。_docker注册服务为什么不认hosthttps://blog.csdn.net/qq_35921773/article/details/134972007那么只能通过主机IP访问了,于是通过如下命令查询主机IP:

ipconfig

找到主机ip后替换上述 代码中的localhost,结果访问又报错

pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'MININT-3D1VJ7H.mshome.net' (using password: YES)")

上面的报错是说连接上mysql,但访问密码错了,但我确实是用root用户访问的,仔细观察发现通过容器访问宿主机的用户并不是root,而是

root@'MININT-3D1VJ7H.mshome.net

MySQL 用户身份验证是基于用户名和主机名的组合,当以 root 用户身份连接到 MySQL 服务器时,MySQL 会根据提供的主机名来确定连接的具体身份。可以使用通配符 % 来表示任何主机,为 root 用户授予来自任何主机的访问权限。

所以这个用户是另一个用户,你需要在mysql中执行以下命令给这个访问用户改成你的密码:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

 完成以上命令就能访问了。不过需要注意这样做可能会增加安全风险,因为允许 root 用户从任何主机连接可能会使数据库更容易受到攻击

http://www.lryc.cn/news/375996.html

相关文章:

  • Leetcode 41. 缺失的第一个正数
  • MyBatis 自定义映射 ResultMap:字段与属性的映射详解
  • 找单身狗2
  • element-ui将组件默认语言改为中文
  • SuperMap iClient3D 11i(2023) SP1 for Cesium 调整
  • 保姆级小白就业人工智能(视频+源码+笔记)
  • 微信小程序,分享和反馈功能
  • 数据安全未来之路,天空卫士荣誉领榜《中国数据安全50强(2024)》
  • CAD二次开发(10)-单行文字的添加+图形修改
  • 【SpringBoot集成Spring Security】
  • docker部署dm数据库
  • Shell中执行.sh文件的常见方式
  • 超分辨率重建——2022冠军RLFN网络推理测试(详细图文教程)
  • 国际荐酒师香港协会受邀参加2024年美国独立日庆祝活动
  • (微服务实战)聚合支付系统商户线上聚合收银台接口设计
  • 【漏洞复现】CRMEB开源电商系统 /api/products SQL注入漏洞(CVE-2024-36837)
  • 摄像头图像矫正的表格生成方法
  • 【Arc gis】Arc gis出现ERROR 999999问题的解决办法
  • 优化 Flutter 应用开发:探索 ViewModel 的威力
  • Android开发系列(四)Jetpack Compose之Button
  • Java17 --- RabbitMQ之插件使用
  • 6.18总结
  • 【ARM Cache 及 MMU 系列文章 1.4 -- 如何判断 L3 Cache 是否实现?】
  • 打印mybatis的sql日志
  • QT day4(对话框 事件机制)
  • 序列化与反序列化漏洞实例
  • 6、while循环 - 习题解析
  • ReentrantLock可重入锁
  • 如何秒杀系统架构设计
  • 深度神经网络——什么是降维?