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

安装必要的依赖:

# 安装 podman
$ sudo apt install podman

# 创建一个低权限用户,尽量不要使用root用户,身份操作podman,降低安全风险
$ sudo adduser podman

# 允许用户下的容器在系统启动的时候启动服务
$ sudo loginctl enable-linger podman

# 退出当前用户,切换到刚刚创建的低权限用户, 注意,不要使用 su - user 的方式切换,后续会执行各种报错
# 如果使用 su user 切换会导致环境变量被带到新用户,导致执行报错
# ERRO[0000] XDG_RUNTIME_DIR directory "/run/user/1000" is not owned by the current user 
# Error running systemd as user - Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined

$ exit

# 通过 ssh 登录用户名 podman 密码是创建用户的时候设置的密码

# 准备本地目录映射
$ mkdir ~/.dockers/tomcat

$ mkdir ~/.dockers/tomcat/webapps

$ mkdir ~/.dockers/tomcat/logs

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

$ touch Dockerfile

内容如下:

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

From docker.io/library/tomcat:10

# 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

构建镜像:

$ podman --cgroup-manager=cgroupfs build -t tomcat-10 .

设置容器开机自启:

$ podman stop tomcat-10

$ podman rm tomcat-10

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

$ podman run -d --name tomcat-10 -p 8080:8080 -p 8009:8009 -v ~/.dockers/tomcat/webapps:/usr/local/tomcat/webapps -v ~/.dockers/tomcat/logs:/usr/local/tomcat/logs localhost/tomcat-10

# 查看该容器
$ podman ps

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

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

查看启动文件:

$ cat container-tomcat-10.service

内容如下:

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

[Unit]
Description=Podman container-tomcat-10.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-10 -p 8080:8080 -p 8009:8009 -v /home/podman/.dockers/tomcat/webapps:/usr/local/tomcat/webapps -v /home/podman/.dockers/tomcat/logs:/usr/local/tomcat/logs localhost/tomcat-10
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

需要额外注意的一个地方是,给出的路径必须是完整路径 “/home/podman/.dockers/tomcat/webapps”,不能是 “~/.dockers/tomcat/webapps”,Systemd不能正确展开 “~” ,导致路径找不到,从而在启动的时候失败,报告错误代码 125

Systemd 配置,开机/系统重启自动启动服务:

# 保存到 ~/.config/systemd/user/
$ mkdir .config

$ mkdir .config/systemd

$ mkdir .config/systemd/user

# 保存到/etc/systemd/system/
$ mv container-tomcat-10.service ~/.config/systemd/user/

# 以当前用户身份刷新配置文件,让其生效
$ systemctl --user daemon-reload

# 设置容器开机自启,并且现在启动
$ systemctl --user enable --now ~/.config/systemd/user/container-tomcat-10.service

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

# 测试,重启系统,观察是否能开机自动启动
$ sudo reboot

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

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注