服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景:

        虚拟机上Ubuntu系统安装了Mysql,现在有一个服务应用需要使用docker来部署,服务应用需要连接mysql做数据库基础使用,配置文件中配置了虚拟主机的IP和端口,但是还是无法连接到Mysql,报错无法连接超时异常

Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:111)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:98)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:90)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:64)at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:74)at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:885)at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:810)at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438)at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189)at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364)at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206)at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476)at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160)at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118)at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:81)... 25 common frames omitted

二、解决方案

要让 Docker 容器中的应用访问主机上的 MySQL 数据库,你需要确保以下几点:

  1. MySQL 服务在主机上正常运行
  2. Docker 容器可以通过网络访问主机的 MySQL 服务

1. 确保 MySQL 服务在主机上正常运行

首先,确保 MySQL 服务在你的 Ubuntu 主机上正常运行,并且你可以通过命令行或其他客户端工具连接到 MySQL。

sudo systemctl status mysql

如果 MySQL 没有运行,可以启动它:

sudo systemctl start mysql

2. 获取虚拟主机IP

方法 2:使用 ip addr 命令

在虚拟机的终端中执行以下命令:

ip addr show

这个命令会显示所有网络接口的信息。找到与你的网络连接相关的接口(例如 eth0 或 wlan0),并查看其 inet 地址。例如:

3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 08:00:27:53:8b:dc brd ff:ff:ff:ff:ff:ffinet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0valid_lft 86396sec preferred_lft 86396secinet6 fe80::a00:27ff:fe53:8bdc/64 scope link valid_lft forever preferred_lft forever

在上面的示例中,inet 192.168.1.100/24 表示虚拟机的 IP 地址是 192.168.1.100

方法 3:使用 ifconfig 命令

如果你的系统安装了 net-tools 包,你可以使用 ifconfig 命令:

ifconfig

类似于 ip addr show,这个命令也会显示所有网络接口的信息。找到与你的网络连接相关的接口,并查看其 inet 地址。例如:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255inet6 fe80::a00:27ff:fe53:8bdc  prefixlen 64  scopeid 0x20<link>ether 08:00:27:53:8b:dc  txqueuelen 1000  (Ethernet)RX packets 12345  bytes 67890123 (67.8 MB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 54321  bytes 12345678 (12.3 MB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在上面的示例中,inet 192.168.1.100 表示虚拟机的 IP 地址是 192.168.1.100

3. 查看docker容器是否可以访问虚拟主机和Mysql

首先确保容器已经启动。

方法1:

在 Docker 容器中执行以下命令,验证是否能够访问虚拟机上的 MySQL 服务:

docker exec -it yourappcontainer ping 192.168.1.100

如果能 ping 通虚拟机,再尝试通过 telnet 连接 MySQL 端口:

docker exec -it yourappcontainer telnet 192.168.1.100 3306

如果 telnet 成功,说明网络连接没有问题。如果失败,请检查防火墙设置和 Docker 网络配置。

方法2 :

如果你需要进入容器进行调试或其他操作,可以使用 docker exec 命令:

docker exec -it yourappcontainer /bin/bash

这将打开一个交互式的 Bash shell,让你可以在容器内执行命令。

例证:

这里展示我的虚拟机结果(使用docker exec 命令打开一个交互式的 Bash shell):

1、ip可以ping通

root@580c2f50a2d2:/# ping 10.0.2.15
PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 10.0.2.15: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from 10.0.2.15: icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from 10.0.2.15: icmp_seq=4 ttl=64 time=0.035 ms
64 bytes from 10.0.2.15: icmp_seq=5 ttl=64 time=0.033 ms
^C
--- 10.0.2.15 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4102ms
rtt min/avg/max/mdev = 0.032/0.040/0.055/0.009 ms

2、mysql(默认3306端口)telnet不通

root@580c2f50a2d2:/# telnet 10.0.2.15 3306
Trying 10.0.2.15...
telnet: Unable to connect to remote host: Connection refused

 3、检查配置防火墙

确保防火墙允许从 Docker 容器的 IP 地址访问 MySQL 端口。你可以使用 ufw 来管理防火墙规则:

sudo ufw allow 3306/tcp
sudo ufw reload

4、再次telnet

root@580c2f50a2d2:/# telnet 10.0.2.15 3306
Trying 10.0.2.15...
Connected to 10.0.2.15.
Escape character is '^]'.
CHost '172.17.0.2' is not allowed to connect to this MySQL serverConnection closed by foreign host.

这个错误信息表明你的 Docker 容器已经成功连接到 MySQL 服务器,但由于权限问题,MySQL 拒绝了连接请求。具体来说,MySQL 配置不允许来自 172.17.0.2(Docker 容器的 IP 地址)的连接。

接着往下操作。

4. 配置 MySQL 允许远程访问

默认情况下,MySQL 只允许本地连接。你需要修改 MySQL 配置文件以允许远程访问。

步骤1:检查Mysql配置并修改

编辑 MySQL 配置文件(通常位于 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/mysql/my.cnf):

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address 行,将其注释掉或者改为 0.0.0.0

# bind-address = 127.0.0.1
bind-address = 0.0.0.0

保存并关闭文件。

步骤2:授予远程访问权限

查看想要用于登录连接的账号权限:比如root账号

1、确保你已经以 root 用户身份登录到 MySQL 数据库:

mysql -u root -p

输入你的 MySQL root 用户密码。

2、指定到mqsql数据库

use mysql;

3、查看账号权限:

SELECT Host,User FROM user where User='root';

结果:

Host列为localhost说明该账号只允许从本地主机使用连接。

4、修改访问权限

执行以下 SQL 命令,授予 root 用户从任何主机(即 %)连接的权限:

update  user set Host = '%' where User='root';

 步骤3:重启 MySQL 服务
sudo systemctl restart mysql

root账号是为了演示作用,也可以新建一个账号,授予权限。

至此,docker容器的用于可以连接登录访问虚拟机主机的Mysql应用了。

三、总结

        通过以上步骤,你可以解决 MySQL 远程连接的问题。确保防火墙和网络配置正确,MySQL 配置允许远程连接,并且用户具有适当的权限。如果仍然遇到问题,请检查 MySQL 日志文件(通常位于 /var/log/mysql/)以获取更多信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/851465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stm32MP135裸机编程:修改基于SD卡的FSBL-A用户程序引导程序(boot)

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf stm32mp135官方开发板原理图&#xff08;mb1635-bdp-v1-0.zip&#xff09; STM32Cube_FW_MP13_V1.0.0 STM32CubeIDE v1.15 1 为什么需要修改FSBL-A用户程序引导程序 FSBL-A用户程序引导程序的作用在《…

03-240605-Spark笔记

03-240605 1. 行动算子-1 reduce 聚合 格式: def reduce(f: (T, T) > T): T 例子&#xff1a; val sparkConf new SparkConf().setMaster("local[*]").setAppName("Operator")val sc new SparkContext(sparkConf) ​val rdd sc.makeRDD(List(1…

基础IO (Linux文件操作)

目录 1.文件操作 2.文件描述符 3.缓冲区 4.系统的缓冲区 1.文件操作 在C语言学习中&#xff0c;我们就已经使用了一些文件操作相关的接口&#xff0c;在学习IO之前&#xff0c;我们首先要复习一些以前讲过的概念&#xff0c; 1. 空文件也要在磁盘中占用空间&#xff0c;因为…

OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装注意事项&#xff1a;包内有两个版本及圆形图片&#xff0c;请根据自身需要版本进行安装演示为&#xff1a;MacBook Pro M3芯片1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff08;最终目的&#xff1a;安装进…

python教程

python解释器的安装 https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe jetbrains官网 英文 PyCharm 专业的版本 Thank you for downloading PyCharm! 社区 Thank you for downloading PyCharm! 中文 PyCharm 专业的版本 感谢您下载PyCharm&#xff01…

[大模型]GLM-4-9B-Chat WebDemo 部署

环境准备 在autodl平台中租一个4090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.1.0–>3.10(ubuntu22.04)–>12.1 接下来打开刚刚租用服务器的JupyterLab&#xff0c; 图像 并且打开其中的终端开始环境配置、模型下载和运行演示。 pip换源和安装…

【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题

文章目录 1 前言2 导包导入数据集3 创建多路图&#xff0c;导入节点和边信息3 绘制线路图4 计算最短路径 1 前言 最近正在学习图神经网络&#xff0c;先pick up了一些最基础的图论知识并学习了一些好玩的应用。 本文启发于B站视频&#xff08;BV1LY411R7HJ&#xff09;&#…

【python】flask 框架

python flask 框架 flask是一个轻量级的python后端框架 (Django, tornado, flask) 官网&#xff1a;欢迎来到 Flask 的世界 — Flask中文文档(3.0.x) 安装&#xff1a;pip install Flask -i https://pypi.douban.com 常识&#xff1a; http,默认端口号为80; https,默认端口号…

国资e学快速学习实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

OSPF LSA头部详解

LSA概述 LSA是OSPF的本质 , 对于网工来说能否完成OSPF的排错就是基于OSPF的LSDB掌握程度 . 其中1/2类LAS是负责区域内部的 类似于设备的直连路由 . 加上对端的设备信息 3 类LSA是区域间的 指的是Area0和其他Area的区域间关系 , 设计多区域的初衷就是避免大型OSPF环境LSA太多…

Go模板页面浏览器显示HTML源码问题

<!--* Title: This is a file for ……* Author: JackieZheng* Date: 2024-06-09 17:00:01* LastEditTime: 2024-06-09 17:01:12* LastEditors: Please set LastEditors* Description:* FilePath: \\GoCode\\templates\\index.html --> <!DOCTYPE html> <html …

【RAG】浅尝基于多头注意力机制思想设计的Multi-Head RAG(多头RAG)

一、动机 现有RAG设计和评估方法&#xff0c;没有方案或评估方法明确针对具有多方面性的问题。下面解释一下多方面性的问题&#xff1a; "多方面性的问题"是指那些需要理解和整合多个不同领域或主题的知识和信息才能得到完整和准确回答的问题。这类问题的特点在于它…

Characters 2 01(卡通可爱人物动画模型)

● 包裹● - 26名男子; - 29个女孩。 ● 使用地点 ● - 游戏。针对游戏引擎优化的模型; -乘法; 广告和营销; - 虚拟现实/增强现实。 ● 特点 ● - 你可以很容易地改变物体的颜色 - 使用UV贴图; - 对象逻辑位置的枢轴; - 模型具有逻辑名称。 ● 几何学● 62个独特的资产(…

Objective-C 学习笔记 | Block 对象

Objective-C 学习笔记 | Block 对象 Objective-C 学习笔记 | Block 对象编写并使用 Block 对象Block 对象的返回值匿名 Block 对象外部变量在 Block 对象中使用 self在 Block 对象中无意使用 self修改外部变量 Objective-C 学习笔记 | Block 对象 Block 对象类似于匿名函数&am…

xLua(一) 环境安装笔记

为了方便查阅记录一下xLua的安装地址及方法 1.登录地址下载: https://github.com/Tencent/xLua 2.解压文件 将文件中的这些内容拷贝到项目中的Asset文件夹中 注意 : 工程项目路径不得含有中文 3.将Tools复制到Asset同级目录下 4.导入后会发现有Bug,需要导入工程 5.还有另…

Java:九九乘法表,打印三角形

文章目录 九九乘法表打印三角形改进:控制行数的三角形有空格的三角形 九九乘法表 package com.zhang; /* 打印九九乘法表*/ public class Test8 {public static void main(String[] args) {//i是竖着的 j是横着的for (int i 1; i < 9; i) {for(int j 1; j < 9; j) {i…

IP协议(二)

TOC 一: 网段划分 同一个局域网的主机,要按一定的规则分配IP地址 把一个IP地址分为两部分: 前半部分 ,网络号 >用来表示局域网后半部分,主机号 > 用来区分同一个局域网中的不同主机 同一个局域网内部&#xff0c;主机之间的IP &#xff0c; 网络号相同&#xff0c;主…

FuTalk设计周刊-Vol.039

&#x1f525;AI漫谈 热点捕手 1、AI视频生成工具大PK | Runway Gen-2、Pika、Moonvalley和W.A.L.T的文字生视频对比评测 AI届的学术大牛李飞飞最近推出了用于生成逼真视频的扩散模型W.A.L.T。效果很不错&#xff0c;不过目前还未开放公网的访问。于是我萌生了一个想法&#…

气体流量的换算

测量气体流量时&#xff0c;往往需要进行温压补偿。我们可以选择Nm:/h和m3/h作为测量单位&#xff0c;二者之间如何换算呢?在标准状态下&#xff0c;即温度为0℃℃(273.15K)和压力为1个标准大气压(101.325kPa)时&#xff0c;气体的体积被称为Nm3(标方)&#xff0c;N代表标准条…

rust asyn和await pin unpin加精!!!

15-探讨为什么Pin在Rust异步编程中如此重要 | Databend_哔哩哔哩_bilibili 能不能Pin住&#xff0c;取决于T是否实现了Unpin&#xff0c;如果实现了Unpin&#xff0c;那么Pin不住 Pin不能pin住u32等基础变量 编译器为async和await生成结构体实现了!Unpin 结构体中使用引用要…