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

news2025/1/15 6:43:05

一、场景:

        虚拟机上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 1000
    link/ether 08:00:27:53:8b:dc brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 86396sec preferred_lft 86396sec
    inet6 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 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 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 0
        TX 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.coloradmin.cn/o/1810724.html

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

相关文章

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。

Apache POI这个库&#xff0c;可能是JAVA平台最好操作excel文件的库了。怎么才能使用呢&#xff1f; 1、下载Apache POI&#xff0c;本来是个很简单的事情&#xff0c;但是也有坑。这也就是我一直不敢用java的原因之一&#xff0c;这些莫名其妙的坑&#xff0c;总是让人烦躁。…

MAC安装idea教程

https://blog.csdn.net/qq_41810415/article/details/131649541 JDK安装 https://blog.csdn.net/dddebug/article/details/121713633 2、编辑.bash_profile文件 vim .bash_profile 进入编辑模式后 按 i 开始添加内容 结束编辑模式按 ESC 结束后保存输入 :wq! 不保存输入 :q! 检…

Apple - IOKit Fundamentals

本文翻译整理自&#xff1a;IOKit Fundamentals &#xff08;Updated: 2014-04-09 https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Introduction/Introduction.html 文章目录 一、I/O Kit 基础知识简介1、谁应该阅读本…

vue2插槽

本节目标 默认插槽后备内容具名插槽作用域插槽案例-商品列表 默认插槽 让组件内部的一些结构 支持自定义 步骤 组件内需要定制的结构, 使用<slot></slot>占位 使用组件时, 传入结构替换slot的位置 后备内容 封装组件时, 可以为预留的<slot>插槽提供默认内…

Nacos长轮询底层是怎么实现的?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

【perl】环境搭建

1、Vscode Strawberry Perl 此过程与tcl环境搭建很类似&#xff0c;请参考我的这篇文章&#xff1a; 【vscode】 与 【tclsh】 联合搭建tcl开发环境_tclsh软件-CSDN博客 perl语言的解释器可以选择&#xff0c;strawberry perl。Strawberry Perl for Windows - Releases。 …

一次性全部给你,这4款名不见经传的精品软件,用了就放不下

Geek Geek是个电脑卸载软件神器。 Geek 电脑空间不够了&#xff0c;想卸点应用来腾地方&#xff0c;但总是遇到各种问题&#xff0c;要么卸不干净&#xff0c;留下一些乱七八糟的文件&#xff0c;要么就是那些流氓软件&#xff0c;怎么卸都卸不掉&#xff0c;简直让人崩溃&am…

如何格式化U盘?4个正确方法,记得收藏好!

“我的u盘不知道是中病毒还是什么原因&#xff0c;现在没法使用了&#xff0c;我想将它进行格式化操作&#xff0c;想问问大家应该如何格式化u盘呢&#xff1f;请帮帮我&#xff01;” U盘作为我们日常生活中不可或缺的存储设备&#xff0c;常常用于传输和保存各种重要数据。然…

ES8.13 _bulk报错Malformed content, found extra data after parsing: START_OBJECT解决

在使用elaticsearch8.13.0使用批量创建索引时&#xff0c;根据谷粒中说的es7.9方法去批量操作请求&#xff1a; http://127.0.0.1:9200/shop/_doc/_bulk 注意1&#xff1a;设置header为Content-Type:application/x-ndjson,否则请求报错&#xff1a; {"error": &qu…

WWDC24 快速回顾

今天凌晨&#xff0c;苹果公司在2024年全球开发者大会&#xff08;WWDC24&#xff09;上&#xff0c;发布了一系列的系统更新。然而&#xff0c;对于期待苹果带来突破性创新的消费者来说&#xff0c;今年的大会似乎并没有达到预期的震撼效果。 下面让我看看&#xff0c;苹果都带…

html--万年历

<!DOCTYPE html> <html lang"zh_CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><meta charset"utf-8" /><title>万年历</title><link rel"styles…

第十篇——等价性:信息是如何压缩的?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 基于信息是如何进行压缩的&#xff0c;引出来等价信息的概念&#xff1b;…

英特尔MRT技术是什么?

在多个内存故障预测中&#xff0c;都有提到英特尔MRT技术&#xff0c;那么这个到底是什么&#xff0c;有什么作用。我们结合英特尔官网信息了解下&#xff1a; 英特尔MRT&#xff0c;全称Memory Resilience Technology&#xff0c;官网介绍它是一种内存 RAS 技术&#xff0c;用…

查找最佳分数Π

查找分子或分母不大于一亿的分数Π private static final int MAX_N 100000000;private static void findPIByDivider() {Log.d("findPI", "findPIByDivider start MAX_N" MAX_N);long curtime System.currentTimeMillis();double lastRet 1;int selec…

计算机网络9——无线网络和移动网络3 蜂窝移动通信网

文章目录 一、蜂窝无线通信技术的发展简介1、蜂窝移动通信系统问世2、2G 蜂窝移动通信系统3、数据通信被引入移动通信系统4、3G 蜂窝移动通信系统4、4G 蜂窝移动通信系统 一、蜂窝无线通信技术的发展简介 1、蜂窝移动通信系统问世 移动通信的种类很多&#xff0c;如蜂窝移动通…

MySQL密码自动过期配置

目录 一、密码自动过期 1、临时 2、永久 3、查看 4、账号设置 一、密码自动过期 登录数据库查看是否生效 mysql -u root -p #查看数据库账号状态 select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user; 1、passwo…

2024检索增强生成RAG最新综述

论文地址&#xff1a;https://arxiv.org/abs/2402.19473 项目存储库&#xff1a;https://github.com/hymie122/RAG-Survey 摘要—人工智能生成内容&#xff08;AIGC&#xff09;的发展得益于模型算法的进步、基础模型规模的增加以及大量高质量数据集的可用性。虽然AIGC取得了…

亚马逊、Lazada、shopee等跨境电商平台测评自养号怎么做?

近年来越来越多的国内卖家进入跨境电商市场&#xff0c;竞争日益激烈&#xff0c;测评的需求越来越大&#xff0c;那么什么是测评&#xff1f; 测评就是买家号通过平台进入自己的店铺购买产品增加销量&#xff0c;买家号收到产品后也可以进行评价&#xff0c;其中包括&#xf…

跨国大文件传输需要哪些方面?怎么实现数据快速传输?

跨国大文件传输涉及到许多方面&#xff0c;包括网络速度、安全性、可靠性和法律合规性等。 以下是跨国大文件传输时需要考虑的一些重要方面&#xff1a; 高速稳定的网络连接&#xff1a;确保有足够的带宽和稳定的网络连接以支持大文件的快速传输。这可能需要考虑到跨国网络的延…

【C++题解】1457 - 子数整除

问题&#xff1a;1457 - 子数整除 类型&#xff1a;循环应用 题目描述&#xff1a; 于一个五位数 abcde &#xff0c;可将其拆分为三个子数&#xff1a; sub1abc sub2bcd sub3cde 例如&#xff0c;五位数20207 可以拆分成sub1202 sub2020 (也就是 20) sub3207 现在给定一个正…