debug小记--docker部署项目

ref1 ref2 ref3 事先工作:安装好docker

准备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

  1. 现在尝试在启动mysql时连接数据库 docker run --link crmMysql:mysql --name app -d -p 8081:8080 springboot 但还是无用。

  2. 查看了很多博客,有可能是由于数据库回收了连接,而系统的缓冲池不知道,继续使用被回收的连接所致的。大多数解决思路在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!

d1 d2

一些docker命令

docker ps
docker stop xx
docker rm xx
docker images -a
docker rmi xx
end
  • 作者:(联系作者)
  • 发表时间:2022-07-03 22:45
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论




    1 / 0