Docker进阶篇之DockerFile制作Tomcat镜像,教你如何发布镜像到DockerHub和阿里云

一、准备镜像文件

需要准备tomcat压缩包和jdk的压缩包

在这里插入图片描述

二、编写 dockerfile 文件

官方命名 Dockerfile,build会自动寻找这个文件,就不需要 -f 指定文件名了

FROM centos:7
MAINTAINER wyc<837279588@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.60.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

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

EXPOSE 8080

CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

三、构建镜像

[root@wyc tomcat]# docker build -t diytomcat .

四、启动镜像

[root@wyc tomcat]# docker run -d -p 9090:8080 --name wyctomcat -v /home/wyctest/build/tomcat/test:/usr/local/apache-tomcat-9.0.60/webapps/test -v /home/wyctest/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.60/logs diytomcat

五、进入容器

[root@wyc tomcat]# docker exec -it 容器id /bin/bash

5.1 curl 网路请求

curl localhost:9090 网络请求是否成功,这里我遇到了两个问题(实际上是一个问题,但根据log能分成两类):

大问题都是 curl: (56) Recv failure: Connection reset by peer,访问失败,连接被重置,但光看句话看不出什么问题来,所以我查看了生成的log。

问题1:无法找到jdk路径

[root@wyc tomcat]# curl localhost:9090
curl: (56) Recv failure: Connection reset by peer
[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

遇到如上问题,简单来说是找不到jdk的路径,我出现这个问题的原因是:jdk的压缩包实际上不是压缩包。

jdk的压缩包看似是压缩包,实则不是压缩包。这个很容易发现,可以用 cat jdk-8u301-linux-x64.tar.gz 查看,如果出现前端代码就代表这是个网址而不是压缩包,如果出现乱码,则是压缩包;或者用 ls -l 查看压缩包大小,如果很小则不是压缩包。解决办法是重新去官网找jdk的压缩包。当我解决了问题1后,出现了问题2。

问题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)

遇到如上问题,简单来说是jdk版本问题,就我而言有两种出现以上问题的情况:

第一种情况:容器中的jdk版本和linux环境的jdk版本不一致(当时我的容器内的jdk版本是 jdk1.8.0_301,而linux的jdk版本是自带的 jdk1.8.0_262),解决办法就是把linux自带的jdk删除后下载和容器内一致的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 localhost:9090 ,如下图:

在这里插入图片描述

六、发布项目

由于做了卷挂载,我们直接在本地test文件夹下编写项目就可以发布了

创建web.xml文件,路径为/tomcat/test/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5">
</web-app>

创建index.jsp文件,路径为/tomcat/test/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello,WYC!</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("----my test web logs----");
%>
</body>
</html>

七、发布自己的镜像

7.1 发布镜像到Docker hud

1、地址 https://hub.docker.com/ 注册帐号

2、确定这个帐号可以登录

3、在服务器上提交自己的镜像

4、linux上通过命令行登录

docker login --help 查看登录帮助

[root@wyc tomcat]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

docker login -u username 登录

root@wyc tomcat]# docker login -u chisatooo
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

5、登录完毕后就可以提交镜像了

docker push

# push镜像出现的问题
[root@wyc tomcat]# docker push chisatooo/diytomcat:1.0
The push refers to repository [docker.io/chisatooo/diytomcat]
An image does not exist locally with the tag: chisatooo/diytomcat

# 增加一个tag即可解决
[root@wyc tomcat]# docker tag 79ddadee54f6 chisatooo/tomcat:1.0

# docker push username:tomcat:tag 尽量带上版本号
root@wyc tomcat]# docker push chisatooo/tomcat:1.0

在这里插入图片描述

6、查看docker hub上是否发布成功

在这里插入图片描述

发布成功!

7.2 发布镜像到阿里云

1、登录阿里云

2、找到容器镜像服务

3、创建命名空间

在这里插入图片描述

4、创建容器镜像

在这里插入图片描述

5、浏览阿里云

在这里插入图片描述

6、根据阿里云官方步骤发布镜像,发布成功后如下图:

在这里插入图片描述

八、小结

在这里插入图片描述

参考源:【狂神说Java】Docker最新超详细版教程通俗易懂

猜你喜欢

转载自blog.csdn.net/wyc837279588/article/details/128049313
今日推荐