Docker容器内访问宿主机MySQL

背景

最近把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"

其实这个端口也可以通过以下指令获取

docker exec -it 容器ID ip addr

三、开放权限,允许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

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

你可能感兴趣的:(linux,docker,docker)