欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker容器内访问宿主机MySQL

程序员文章站 2024-03-11 19:08:55
...

背景

最近把docker的一些基本操作都学了一下,想试着把个人博客通过docker来进行部署,部署过程中遇到了这么一个问题:

liquibase.exception.DatabaseException: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

这问题看着就像连接不上数据库,所以就报错了,只要解决Docker容器内访问宿主机的MySQL,这个问题就能得到解决。

解决(CentOS8)

一、开放端口

将宿主机用到的mysql端口开放出来,默认是3306,如果是阿里云服务器,可以将连接数据库的url的ip写为内网ip,这样不用去阿里云控制台安全组上再配置端口

#开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#刷新一下
firewall-cmd --reload

二、尝试启动

博主已经通过dockerfile构建好了镜像,这里先尝试启动一下

docker run rrblog

启动日志内报错如下,端口172.17.0.3不允许连接到mysql

java.sql.SQLException: null,  message from server: "Host '172.17.0.3' is not allowed to connect to this MySQL server"

三、开放权限,允许ip访问数据库

从二可以得出,容器内是通过这个端口172.17.0.3连接宿主机mysql的,所以要给它开放一下权限

  1. 先以root进入mysql,记得输密码
mysql -u root -p
  1. 进入mysql后,开放权限,当root用户以pwd(密码记得换成自己的)从端口172.17.0.3登入时,允许它操作数据库的所有表,下面的单引号别省了
grant all privileges on *.* to 'root'@'172.17.0.3' identified by 'pwd' with grant option;

开放权限成功是这个样子的

Query OK, 0 rows affected, 1 warning (0.01 sec)

四、再次尝试启动容器,并查看日志

  1. 这次应该是没有问题了,好好写条docker run 命令
docker run -d -p 8080:8080 --name=rrblog rrblog
  1. 查看容器内日志,这里查看指定容器id近30分钟的日志,那个报错已经不见了,具体日志就不放了,没啥营养
docker logs --since 30m 6a3c47ac9db8

总结

这个问题的解决步骤就大致上面这三点了:

  1. 开放数据库端口
  2. 查看容器是从哪个IP连宿主机MySQL
  3. 开放权限给这个IP

最后贴一下我的个人博客链接,项目做得垃圾求大佬轻喷---->渣渣博客链接