一、自定义Tomcat业务镜像

1.1软件包及镜像准备

    基于官方提供的centos、ubuntu、openEuler、alpine等基础镜像构建JDK(Java环境),然后再基于自定义的JDK镜像构建出业务需要的tomcat镜像。

1 [root@localhost tomcat]# cd /dockerfile/web/tomcat
2 [root@localhost tomcat]# wget  https://repo.huaweicloud.com/java/jdk/11.0.2+9/jdk-11.0.2_linux-x64_bin.tar.gz
3 [root@localhost tomcat]# wget  https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.96/bin/apache-tomcat-9.0.96.tar.gz
#拉取openEuler镜像
[root@localhost tomcat]# docker pull openeuler/openeuler:24.03

    编写脚本:手动指定 jdk 安装目录,把 java 命令加入系统命令路径,导出环境变量,供 tomcat 这类 Java 程序调用 JDK。

[root@localhost tomcat]# cat java.sh
1 JAVA_HOME=/usr/local/jdk
2 PATH=$JAVA_HOME/bin:$PATH
3 CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
4 export JAVA_HOME PATH CLASSPATH

  基于 openEuler24.03 构建镜像,内置 JDK11 + Tomcat9,制作 tomcat 运行容器镜像。

[root@localhost tomcat]# cat dockerfile
1 FROM openeuler/openeuler:24.03
2 LABEL maintainer="jungle jungle@qq.com"
3 RUN yum install -y gcc pcre-devel zlib-devel openssl-devel shadow-utils
4 ADD jdk-11.0.2_linux-x64_bin.tar.gz /usr/local/src
5 RUN ln -s /usr/local/src/jdk-11.0.2/ /usr/local/jdk
6 ADD java.sh /etc/profile.d/
7 ENV JAVA_HOME=/usr/local/jdk
8 ENV PATH=$JAVA_HOME/bin:$PATH
9 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
10 ADD apache-tomcat-9.0.96.tar.gz  /usr/local/src
11 RUN ln -s /usr/local/src/apache-tomcat-9.0.96 /usr/local/tomcat
12 EXPOSE 8080
13 CMD ["/usr/local/tomcat/bin/catalina.sh","run"]

编写一个构建镜像脚本

[root@localhost tomcat]# cat build-command.sh
1 #!/bin/bash
2 docker build -t tomcat:base .
[root@localhost tomcat]# docker run -d -P tomcat:base
[root@localhost tomcat]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED         STATUS         PORTS                                           NAMES
1117266c49e8   tomcat:base   "/usr/local/tomcat/b…"   3 minutes ago   Up 3 minutes   0.0.0.0:32768->8080/tcp, [::]:32768->8080/tcp   mystifying_goldberg

2.2定义tomcat业务镜像

[root@localhost tomcat-appv1]# cat index.jsp
<html>
<head><title>Hello World</title><meta charset="UTF-8"></head>
<body>
<p style="font-size:40px;font-weight:bold;">Hello World!&#128151</p>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
[root@localhost tomcat-appv1]# cat dockerfile
FROM tomcat:base
LABEL maintainer="jungle jungle@qq.com"
ADD index.jsp /usr/local/tomcat/webapps/ROOT/index.jsp
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
[root@localhost tomcat-appv1]# cat build-command.sh
#!/bin/bash
docker build -t tomcat:appv1 .
[root@localhost tomcat-appv1]# bash build-command.sh
[root@localhost tomcat-appv1]# docker run -d -P tomcat:appv1
ba625d1d591f703b84e95e8efb78bc522cafd0039a6ec3d476ae71e48e7ad940
[root@localhost tomcat-appv1]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS        PORTS                                           NAMES
ba625d1d591f   tomcat:appv1   "/usr/local/tomcat/b…"   1 second ago   Up 1 second   0.0.0.0:32769->8080/tcp, [::]:32769->8080/tcp   keen_lichterman

二、配置nginx反向代理

    在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,比如一个业务前端静态页面使用nginx,动态页面使用tomcat,由于容器在启动的时候内部的IP地址是DHCP随机分配,所以如果通过内部访问的话,自定义名称是相对比较固定的。

#运行tomcat容器
[root@localhost ~]# docker run --name tomcat-server -d tomcat:appv1
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS      NAMES
cb38a4a6b38a   tomcat:appv1   "/usr/local/tomcat/b…"   9 seconds ago   Up 9 seconds   8080/tcp   tomcat-server
[root@localhost nginx]# docker inspect -f {{.NetworkSettings.IPAddress}} tomcat-server
172.17.0.2

#运行nginx容器,并配置动态页面代理至tomcat业务容器
[root@localhost ~]# mkdir /nginx/
[root@localhost nginx]# tree /nginx/
/nginx/
├── conf
│   └── server.conf
└── html
    └── index.html

[root@localhost nginx]# cat /nginx/conf/server.conf
server {
  listen 80;
  server_name localhost;
  location / {
        root /html;
        index index.html index.htm;
  }
  location ~ \.jsp$ {
        proxy_pass http://tomcat-server:8080;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

[root@localhost nginx]# cat /nginx/html/index.html
<!DOCTYPE html>
<html lang="en">
        <head>
                <meta charset="UTF-8">
                <title>test</title>
        </head>
        <body>
                <h1>this is a static page</h1>
                <td><a href="/index.jsp">动态网站</a></td>
        </body>
</html>

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐