一、简介
最近参与开发一个项目,其中一部分系统需要迁移。从阿里云迁移到实体服务器,使用docker部署。系统使用Java语言开发,springboot单体应用,另外需要单独部署的服务为mysql和redis。环境如下:
软件 | 版本 | 描述 |
---|---|---|
springboot | 2.5.14 | Java web开发脚手架 |
mysql | 5.7.36 | 关系型数据库 |
redis | 6.2.6 | 内存数据库 |
tomcat | 8.5.x | web服务器 |
jdk | 1.8 | java开发工具集 |
二、部署
1、mysql数据迁移
这个没什么好说的,直接备份数据库,导入数据库即可。docer部署mysql可以参考下面链接1.
2、docker部署redis
redis单节点,拉取镜像,运行容器即可
docker run -d --name redis -p 6379:6379 redis
暂时不需要配置优化参数啥的
3、docker部署tomcat并运行war包
可以通过打镜像的方式吧war包放置在tomcat /usr/local/tomcat/webapps
下面,或者运行tomcat容器后,通过命令拷贝至该目录下。我这里用的docker桌面版,直接运行容器,上传war包。
运行tomcat容器
docker run -d --name tomcat-competition -p 8080:8080 tomcat:8.5.100-jdk8-temurin-jammy
上传war包
上传war包后自动解压为对应名称的文件夹,内容同工具jd-gui看到的一样。
三、报错
查看tomcat日志,报错内容如下:
2024-04-13 10:21:35 02:21:35.302 [localhost-startStop-1] ERROR c.a.d.p.DruidDataSource - [init,931] - init datasource error, url: jdbc:mysql://127.0.0.1:3306/xxxxx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
2024-04-13 10:21:35 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
- xxxx:数据库名称
四、解决
1 分析
我服务要访问mysql 但是配置的地址为127.0.0.1 即本机地址,但是我们知道docker容器网络运行在docker网络虚拟网卡上。我的tomcat-competition容器访问不到msyql5.7这个容器中mysql的。方案有两种,
- 方案1:查看容器在docker网络中ip地址,配置改为相应的地址
- 方案2:自定义docker网络,把相关容器放置在该自定义网络中,通过容器名访问。
因为给容器分配ip地址是动态的,每次启动可能ip地址会变,所以不建议用方案1。我们使用方案2。
2 解决
步骤一:创建自定义网络
docker network create --driver bridge common-net
步骤二:把相关容器加入该网络
docker network connect common-net mysql5.7
docker network connect common-net redis
docker network connect common-net tomcat-competition
步骤三:把msyql和redis配置中的host改为相应的容器名,重新打war包,重新上传至tomcat,重启容器。
现在容器间可正常通信。
关于docker容器通信内容,参考下面链接2
结语
欢迎小伙伴一起学习交流,需要啥工具或者有啥问题随时联系我。
❓QQ:806797785
⭐️源代码地址:https://github.com/gaogzhen/
[1]0101docker mysql8镜像主从复制-运维-mysql[CP/OL]
[2]Docker 网络模式详解及容器间网络通信[CP/OL]