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的,所以要给它开放一下权限
- 先以root进入mysql,记得输密码
mysql -u root -p
- 进入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)
四、再次尝试启动容器,并查看日志
- 这次应该是没有问题了,好好写条docker run 命令
docker run -d -p 8080:8080 --name=rrblog rrblog
- 查看容器内日志,这里查看指定容器id的近30分钟的日志,那个报错已经不见了,具体日志就不放了,没啥营养
docker logs --since 30m 6a3c47ac9db8
总结
这个问题的解决步骤就大致上面这三点了:
- 开放数据库端口
- 查看容器是从哪个IP连宿主机MySQL
- 开放权限给这个IP
最后贴一下我的个人博客链接,项目做得垃圾求大佬轻喷---->渣渣博客链接
推荐阅读
-
如何让宿主机访问docker容器内的服务
-
Docker容器内访问宿主机MySQL
-
详解如何解决docker容器无法通过IP访问宿主机问题
-
Docker内如何访问本机(宿主机)的具体方法
-
Docker容器访问宿主机网络的方法
-
docker、k8s基础:mysql容器化部署,挂载data到宿主机
-
docker 容器挂载主机目录,访问出现 cannot open directory /mnt/home/webroot/: Permission denied 的解决办法...
-
详解如何解决docker容器无法通过IP访问宿主机问题
-
Docker内如何访问本机(宿主机)的具体方法
-
Docker容器访问宿主机网络的方法