Ubuntu 22.04使用Podman部署Tomcat 9的详细教程

安装必要的依赖:

# 安装 podman
$ sudo apt install podman

# 准备本地目录映射
$ mkdir /home/data/.tomcat

$ mkdir /home/data/.tomcat/webapps

$ mkdir /home/data/.tomcat/logs

官方镜像会在报错的时候暴露 Tomcat 9 版本号,错误堆栈,构成安全隐患,我们需要通过构建自定义镜像解决此问题:

$ touch Dockerfile

内容如下:

# 详细启动日志在 /usr/local/tomcat/logs 目录下

From docker.io/library/tomcat:9

# xml 编辑工具,方便我们后续修改 tomcat 的xml配置文件
# RUN apt update && apt install -y xmlstarlet

# 增加 <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" /> 阻止错误日志输出

RUN sed -i "s/<\/Host>/  <Valve className='org.apache.catalina.valves.ErrorReportValve' showReport='false' showServerInfo='false' \/>\n\t<\/Host>/" /usr/local/tomcat/conf/server.xml

# 配置AJP协议
# 如果只希望通过 AJP访问,可以参考如下命令 移除原有的 AJP 协议配置
# RUN xmlstarlet ed -L -P -S -d '/Server/Service/Connector' /usr/local/tomcat/conf/server.xml

# 增加新的协议配置
RUN sed -i "s/<\/Service>/  <Connector port='8009' protocol='AJP\/1.3' address='0.0.0.0' redirectPort='8443' secretRequired=''\/>\n  <\/Service>/" /usr/local/tomcat/conf/server.xml

# 移除 xml 编辑工具
# RUN apt -y autoremove --purge xmlstarlet

构建镜像:

$ sudo podman build -t tomcat-9 .

设置容器开机自启:

$ sudo podman stop tomcat-9

$ sudo podman rm tomcat-9

# 启动一个 tomcat 容器 8080 HTTP 访问端口 8009 AJP访问端口
# sudo podman run -d --name tomcat-9 -p 8080:8080 -p 8009:8009 -v /my/local/path:/usr/local/tomcat/webapps localhost/tomcat-9

$ sudo podman run -d --name tomcat-9 -p 8080:8080 -p 8009:8009 -v /home/data/.tomcat/webapps:/usr/local/tomcat/webapps -v /home/data/.tomcat/logs:/usr/local/tomcat/logs localhost/tomcat-9

# 查看该容器
$ sudo podman ps

# 如果需要进入容器查看执行情况,参考如下命令
# sudo podman exec -it tomcat-9 bash

# 每次都启动新容器方式创建servcie //--new参数,每次启动都删除旧容器,启动一个新容器 
$ sudo podman generate systemd --restart-policy=always -n --new -f tomcat-9

查看启动文件:

$ cat container-tomcat-9.service

内容如下:

# container-tomcat-9.service
# autogenerated by Podman 3.4.4
# Sun Mar 10 12:31:31 CST 2024

[Unit]
Description=Podman container-tomcat-9.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=always
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --sdnotify=conmon --replace -d --name tomcat-9 -p 8080:8080 -p 8009:8009 -v /home/data/.tomcat/webapps:/usr/local/tomcat/webapps -v /home/data/.tomcat/logs:/usr/local/tomcat/logs localhost/tomcat-9
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target

Systemd 配置:

# 保存到/etc/systemd/system/
$ sudo mv container-tomcat-9.service /etc/systemd/system/

# 刷新配置文件,让其生效
$ sudo systemctl daemon-reload

# 设置容器开机自启,并且现在启动
$ sudo systemctl enable --now /etc/systemd/system/container-tomcat-9.service

# 如果需要进入容器查看执行情况,参考如下命令
# sudo podman exec -it tomcat-9 bash

# 测试,重启虚拟机
$ sudo reboot

# 启动或重启服务 
# systemctl --user start container-tomcat-9.service 
# systemctl --user restart container-tomcat-9.service

# 如果启动失败,观察服务日志
# sudo journalctl -f

后续 WAR 包存储到 /home/data/.tomcat/webapps 目录下即可进行正常访问。

参考链接