安装必要的依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 安装 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 版本号,错误堆栈,构成安全隐患,我们需要通过构建自定义镜像解决此问题:
1 |
$ touch Dockerfile |
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 详细启动日志在 /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 |
构建镜像:
1 |
$ podman --cgroup-manager=cgroupfs build -t tomcat-10 . |
设置容器开机自启:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ 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 |
查看启动文件:
1 |
$ cat container-tomcat-10.service |
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# 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 配置,开机/系统重启自动启动服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 保存到 ~/.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 目录下即可进行正常访问。
参考链接
- 使用Docker部署Tomcat的详细教程
- Podman设置容器开机自启
- Docker 大势已去,Podman 即将崛起!
- podman-generate-systemd
- containers.podman.podman_generate_systemd module – Generate systemd unit from a pod or a container
- Docker Centos 7.X部署Tomcat 并且修改Server.xml配置文件方案 并设置时区 只要十一步
- Ubuntu Server 18.04 LTS隐藏Tomcat-9.0.16.0的版本号与操作系统类型
- Linux shell修改xml文件
- XMLStarlet Command Line XML Toolkit
- How To Install xmlstarlet on Ubuntu 22.04
- 如何使用xmlstarlet更新xml文件
- [Rootless container] sd-bus call: Permission denied: OCI runtime permission denied error #6368
- Why is systemctl --user broken unless I run it using su?