curl: (56) Recv failure: Connection reset by peer问题汇总和解决方案

这两天正在学习用docker制作tomcat镜像,有一个问题困扰了我3天,可能大家在学习时也会遇到,于是我就单独发一篇文章来解决这个问题。
解决办法我在上一篇文章 Docker进阶篇之DockerFile制作Tomcat镜像,教你如何发布镜像到DockerHub和阿里云 已经详细说明了,这里再说明一次。

问题描述:

[root@wyc tomcat]# curl localhost:9090
curl: (56) Recv failure: Connection reset by peer

curl: (56) Recv failure: Connection reset by peer ,意思是说访问失败,连接被重置,会出现这个错误的原因有很多种,我们需要查看日志文件来找出原因。

日志1:无法找到jdk路径

[root@1c299e7ab95c logs]# cat catalina.out
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory
/usr/local/apache-tomcat-10.1.0/bin/catalina.sh: line 466: /usr/local/jdk1.8.0_301/bin/java: No such file or directory

日志1解决办法:

1、如果单纯是dockerfile文件的路径错误,只需要修改文件中的路径即可,大概率是jdk的路径写错了

ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.60
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.60
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

如上写法是没问题的。

2、如果是jdk本身有问题,我的问题就是jdk的压缩包出问题了,下载jdk压缩包时要注意区分这个压缩包是不是真的是压缩包,可以用 cat jdk-8u281-linux-x64.tar.gz 查看,如果出现前端代码就代表这是个网址而不是压缩包,如果出现乱码,则是压缩包;或者用 ls -l 查看压缩包大小,如果很小则不是压缩包。解决办法是重新去官网找jdk的压缩包。

解决了上述问题后继续通过curl查看网络请求 curl localhost:9090,发现还是会报 curl: (56) Recv failure: Connection reset by peer ,继续查看日志。

日志2:jdk版本不匹配或jdk版本太高

[root@wyc tomcat]# curl localhost:9090
curl: (56) Recv failure: Connection reset by peer
[root@wyc tomcat]# docker logs a23b8ffe533a
Tomcat started.
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)

日志2解决办法:

出现这样的日志,有两种可能原因:

1、linux的jdk版本和完成的镜像中的jdk版本不一致。
解决办法就是让两者的jkd版本一致。当时我的tomcat镜像下载的的jdk版本是 jdk1.8.0_301,而linux的jdk版本是自带的 jdk1.8.0_262,于是我删除了linux自带的jdk下载了301版本的jkd。

2、当我解决了jdk不一致的问题后,发现还是会出现上述日志,此时原因是jdk版本太高。
解决办法是把已有的jdk删除后下载低版本的jdk(但是别忘了容器的jdk版本和linux的jdk版本要一致)
我刚开始用的是 jdk1.8.0_301 和 apache-tomcat-10.1.0,发现问题后改成了 jdk1.8.0_281 和 apache-tomcat-9.0.60,实测可以运行。
curl: (56) Recv failure: Connection reset by peer问题汇总和解决方案_第1张图片
上述解决办法是基于防火墙和安全组等都没有问题的情况,查看日志文件还是很重要的!
自己遇到的坑,跪着也要填完!

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