准备mysql镜像
docker pull mysql:5.7
#docker run -d -p 3300:3306 --name crmMysql-ee MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#docker run -d -p 3300:3306 --name crmMysql-ee MYSQL_ROOT_PASSWORD=Cjq86302353,./ mysql:5.7
docker run -d -p 3300:3306 --name crmMysql -e MYSQL_ROOT_PASSWORD=Cjq86302353,./ mysql:5.7
-d 后台执行
-p 3300:3306 将MySQL容器的默认3306端口 映射到 服务器的3300端口上
--name 给容器起别名
-e 配置环境,并且将密码设置为123456
导出云服务器上的debian数据库,导入我的PC虚拟机上的docker数据库
workbench 真是个好东西,用workbench来操作
● https://blog.csdn.net/bean_business/article/details/113407989
准备好web 的jar文件,略~
关键:yml文件配置需要修改web应用所需的对应的docker容器
安装java8
其实不需要为宿主机安全jdk,配置dockerfile ,有配置jdk源,构建镜像时会进行拉取
不过安装了,就放在在这里了,因为debian10 apt 安装库默认提供的 是 java11,要更需要使用第三方源AdoptOpenJDK进行安装,是需要一些额外操作的:
● 首先,更新软件包列表并安装通过HTTPS添加新存储所需依赖项
● 其次,使用wget命令导入存储库GPG密钥
● 添加AdoptOpenJDK APT存储库到你的系统
● 更新apt源软件列表,启用存储库,安装OpenJDK8
● https://zhuanlan.zhihu.com/p/86308378
创建springboot容器
在jar所在文件夹下创建dockerfile
# 基础镜像
FROM java:8
# 作者信息
MAINTAINER weder
# 将当前目录下的jar包复制到容器里(crm-0.0.1-SNAPSHOT.jar修改为你的jar包名字)
COPY crm-0.0.1-SNAPSHOT.jar /springboot.jar
# 提示当前项目在容器运行的端口
CMD ["========server.port = 8080=========="]
# 暴露运行的端口
EXPOSE 8080
# 执行jar包
ENTRYPOINT ["java","-jar","/springboot.jar"]
在jar文件和dockerfile文件下执行:docker build -t springboot .
启动容器:docker run -d -p 8081:8080 --name app springboot
Debug过程
上述过程一路下来,有一些小问题都很好解决,但遇到了一个bug,花了半个上午一个下午时间解决,最后解决方式也是一言难尽,记录一下...
在地址栏输入访问地址,总是默认跳转到应用拦截器设定的(包括非法访问和抛出异常时)的静态页面
初步分析:能连接上应用容器,说明容器配置和启动没问题,所以可能是数据库的问题
查看日志:docker logs app
看关键异常记录:
● com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
● “The last packet sent successfully to the server was 0 milliseconds ago. ”
确定是数据库连接错误,收不到到数据库返回packet
-
现在尝试在启动mysql时连接数据库
docker run --link crmMysql:mysql --name app -d -p 8081:8080 springboot
但还是无用。 -
查看了很多博客,有可能是由于数据库回收了连接,而系统的缓冲池不知道,继续使用被回收的连接所致的。大多数解决思路在yml文件中的数据库配置上下文章,诸如: SQL查询,用来验证从连接池取出的连接
dbcp.validationQuery=SELECT 1
#指明连接是否被空闲连接回收器(如果有)进行检验,如果检测失败,则连接将被从池中去除
dbcp.testWhileIdle=true
#在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位,一般比minEvictableIdleTimeMillis小
dbcp.timeBetweenEvictionRunsMillis=300000
#在每次空闲连接回收器线程(如果有)运行时检查的连接数量,最好和maxActive一致
dbcp.numTestsPerEvictionRun=50
#连接池中连接,在时间段内一直空闲,被逐出连接池的时间(1000*60*60),以毫秒为单位
dbcp.minEvictableIdleTimeMillis=3600000
ref 都不行。
难道是yml中 url: jdbc:mysql://xxx 配置不对?反复尝试了用虚拟主机ip , docker宿主机ip ,localhost ,还是不行.
3.再次分析,难道是防火墙, 端口之类的权限问题?但是不合理,mysql workbench明明可以连得上。尝试了,也确实不行
最后打算重启下再试试算了。 是的,重启虚拟机后它就好了!之前没重启是因为重启虚拟机可能会重复分配虚拟地址,所以一般开虚拟机不用时我都是挂机。anyway, sweet and f*k!
一些docker命令
docker ps
docker stop xx
docker rm xx
docker images -a
docker rmi xx
评论
1 / 0