当前位置: 首页 > news >正文

容器化部署 Tomcat + MySQL 实战指南:从入门到进阶

🌟 背景与目标

       在现代软件开发中,容器化部署已成为主流方式。通过 Docker 部署 Tomcat 和 MySQL,可以实现快速构建、部署、调试和维护。本文将从最基础的镜像构建开始,逐步深入到数据持久化、配置热更新、日志管理、多服务编排等进阶主题,并对比不同部署方案的优劣,帮助您构建一套可维护、可扩展、可复制的容器化部署方案。

🧱 第一:基础部署 —— 构建自定义zprint_tomcat镜像

1. 创建zprint-tomcat镜像构建目录结构

zprint-tomcat/
├── Dockerfile
├── webapps/
│   └── ROOT  # 本应用目录为ROOT, 如果为app.WAR 会自动解压被tomcat 加载
├── conf/
│   └── server.xml
├── logs/
└── temp/

2. 编写 Dockerfile(zprint_Tomcat)

dockerfile

# 使用官方 Tomcat 8.5 作为基础镜像
FROM tomcat:8.5
# 设置环境变量(时区)
ENV TZ=Asia/Shanghai
# 创建 webapps 目录
RUN mkdir -p /usr/local/tomcat/webapps
# 拷贝您的应用到镜像中
COPY webapps/ /usr/local/tomcat/webapps/
# 拷贝自定义 server.xml(可选)
COPY conf/server.xml /usr/local/tomcat/conf/
# 暴露端口
EXPOSE 8099

3. 构建并推送zprint_tomcat镜像到阿里云

#!/bin/bash# 构建自定义 Tomcat 镜像使用,如果使用已有镜像只需要允许zprint.yaml dockercompse这个文件即可自动组织zprint_mysql+zprint_tomcat容器允许
DOCKER_IMAGE_NAME=crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5
# 构建镜像
docker build -t $DOCKER_IMAGE_NAME .# 添加远程仓库标签
docker tag $DOCKER_IMAGE_NAME crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5# 登录阿里云私有仓库(如需推送)
echo "请手动执行登录(如需推送):"
echo "docker login --username=ailiylz crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com"echo "构建完成。如需推送,请执行:"
echo "docker push crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5"

🧱 第二层:基础部署 —— 构建自定义zprint_mysql镜像

1. 创建zprint-tomcat镜像构建目录结构

zprint-mysql/
├── Dockerfile
├── conf.d/
│   └── custom.cnf
└── schema/├── zprint_Schema.sql  <- 数据库结构初始化脚本└── zprint_Data.sql    <- 数据初始化脚本

2. 编写 Dockerfile(zprint_mysql)

# 使用基础 MySQL 5.7 镜像
FROM mysql:5.7
# 设置时区
ENV TZ=Asia/Shanghai
# 拷贝初始化脚本(容器启动时自动执行)
COPY schema/*.sql /docker-entrypoint-initdb.d/
# 拷贝自定义配置文件
COPY conf.d/custom.cnf /etc/mysql/conf.d/
# 设置工作目录
WORKDIR /usr/local/mysql

3. 构建并推送zprint_mysql镜像到阿里云

#!/bin/bash# 构建自定义 Tomcat 镜像使用,如果使用已有镜像只需要允许zprint.yaml dockercompse这个文件即可自动组织zprint_mysql+zprint_tomcat容器允许
DOCKER_IMAGE_NAME=crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_mysql:5.7
# 构建镜像
docker build -t $DOCKER_IMAGE_NAME .
# 添加远程仓库标签
docker tag $DOCKER_IMAGE_NAME crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_mysql:5.7
# 登录阿里云私有仓库(如需推送)
echo "请手动执行登录(如需推送):"
echo "docker login --username=ailiylz crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com"
echo "构建完成。如需推送,请执行:"
echo "docker push crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_mysql:5.7"

🧩 第三:服务编排 —— 使用 zprint.yaml

🛠 示例 zprint.yaml 文件方式持久化

# 以文件方式挂载持久化
version: '3.8'services:mysql:image: crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint-mysql:5.7container_name: zprint_dbenvironment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: zprint_dbMYSQL_USER: FaureciaMYSQL_PASSWORD: 1qaz2wsxports:- "33306:3306"volumes:- ./mysql_data:/var/lib/mysql- ./mysql_data:/etc/mysql/conf.d/healthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 10stimeout: 3sretries: 3networks:- zprint_nettomcat:image: crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint-tomcat:8.5container_name: zprintports:- "8099:8099"environment:TZ: Asia/ShanghaiLANG: C.UTF-8LC_ALL: C.UTF-8depends_on:mysql:condition: service_healthyhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8099"]interval: 30stimeout: 10sretries: 5volumes:- ./tomcat_conf:/usr/local/tomcat/conf- ./tomcat_webapps:/usr/local/tomcat/webapps- ./tomcat_logs:/usr/local/tomcat/logs- ./tomcat_temp:/usr/local/tomcat/tempnetworks:- zprint_netnetworks:zprint_net:driver: bridge

🛠 示例二 zprint.yaml 卷volumes方式持久化

# 已挂载卷方式持久化
services:mysql:image: crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint-mysql:5.7container_name: zprint_dbenvironment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: zprint_dbMYSQL_USER: FaureciaMYSQL_PASSWORD: 1qaz2wsxports:- "33306:3306"volumes:- zprint_mysql_data:/var/lib/mysql- zprint_mysql_conf:/etc/mysql/conf.d/healthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 10stimeout: 3sretries: 3networks:- zprint_nettomcat:image: crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint-tomcat:8.5container_name: zprintports:- "8099:8099"environment:TZ: Asia/ShanghaiLANG: C.UTF-8LC_ALL: C.UTF-8depends_on:mysql:condition: service_healthyhealthcheck:test: ["CMD", "curl", "-f", "http://localhost:8099"]interval: 30stimeout: 10sretries: 5volumes:- zprint_tomcat_conf:/usr/local/tomcat/conf- zprint_tomcat_webapps:/usr/local/tomcat/webapps- zprint_tomcat_logs:/usr/local/tomcat/logs- zprint_tomcat_temp:/usr/local/tomcat/tempnetworks:- zprint_netvolumes:zprint_mysql_conf:zprint_mysql_data:zprint_tomcat_conf:zprint_tomcat_webapps:zprint_tomcat_logs:zprint_tomcat_temp:networks:zprint_net:driver: bridge

🧪 启动和关闭服务

#"-d"参数表示在后台运行(daemon模式)
"up"命令会创建并启动容器
"down"命令会停止并移除容器、网络等资源
执行命令前确保在包含yaml文件的目录下
# bash
docker-compose -f zprint.yaml up -d # 
docker-compose -f zpirnt.yaml down  
# 使用默认的docker-compose.yaml文件
docker-compose up -d  # 启动
docker-compose down   # 停止

📦 第四:数据持久化与配置热更新

🧾 1. 命名卷 vs 绑定挂载 —— 对比与选择

对比项

命名卷 (Named Volume)

绑定挂载 (Bind Mount)

定义方式

tomcat_logs:/usr/local/tomcat/logs

./logs:/usr/local/tomcat/logs

存储位置

Docker 自动管理(如 /var/lib/docker/volumes/...)

手动指定宿主机目录(如 ./logs)

是否可见

❌ 不可见,需用 docker volume inspect 查看

✅ 可见,直接在宿主机上查看

是否便于维护

✅ 是,Docker 自动管理权限、生命周期等

⚠️ 否,需手动创建、维护目录

是否适合团队协作

✅ 是,不依赖本地路径结构

❌ 否,路径可能因人而异

是否推荐用于生产

✅ 是

⚠️ 否

2.  centos 下命名卷挂载路径/var/lib/docker/volumes

4. ‌推荐使用命名卷的场景:

  • 多容器数据共享‌:如共享数据库或配置,命名卷允许跨容器访问同一数据源,支持 --volumes-from 继承配置,适合微服务架构‌。
  • 生产环境持久化存储‌:Docker 管理卷数据,独立于容器生命周期,删除容器后数据保留,适合关键业务数据(如数据库文件)‌。
  • 数据备份与迁移‌:卷存储在 Docker 托管目录(/var/lib/docker/volumes/),便于跨主机迁移或备份,避免依赖宿主机路径差异‌。
  • 高性能需求场景‌:在高并发或 I/O 密集型应用中,命名卷比绑定挂载性能更优,减少文件系统开销‌。

 ‌5.推荐使用绑定挂载的场景:

  • 开发与测试环境‌:实时同步宿主机代码到容器(如本地源码挂载到容器 Web 目录),支持热更新,无需重建镜像‌。
  • 访问宿主机特定文件‌:直接挂载主机配置文件(如 /etc/app/config)或日志目录(/var/log),容器可直接读写宿主机资源‌。
  • 简单数据共享‌:快速共享宿主机目录(如日志或临时数据),无需创建卷,适用于单次任务或调试。
  • 主机依赖型应用‌:当应用需强绑定宿主机文件系统结构时(如使用绝对路径的脚本),优先绑定挂载‌。

🧪 第五、容器常用命令及操作案例

操作

命令

启动服务

docker-compose -f docker-compose.yaml up -d

停止服务

docker-compose -f docker-compose.yaml stop

重启 Tomcat

docker-compose -f docker-compose.yaml restart tomcat

查看日志

docker logs zprint

进入容器调试

docker exec -it zprint /bin/bash

删除容器(保留数据)

docker-compose -f docker-compose.yaml down

1. docker image 命令管理实例

[root@localhost ~]# docker image rm f41e0c55a09a
Untagged: crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5
Untagged: crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat@sha256:61a3748e8be4d27edb1a45a707bbad32cda9679773397db0fa79c828d4af0eee
Deleted: sha256:f41e0c55a09afa83a366e5292df4b980d833b7415dba37ea4f50d1b95e07e581
[root@localhost ~]# docker image ls
REPOSITORY                                                                        TAG             IMAGE ID       CREATED         SIZE
crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_mysql   5.7             3fae0828f4b4   4 days ago      507MB
mysql                                                                             8.0             12a2ae8fe734   3 months ago    772MB
hello-world                                                                       latest          74cc54e27dc4   6 months ago    10.1kB
dpanel/dpanel                                                                     lite            6f81b76efea8   8 months ago    159MB
tomcat                                                                            8.5             0a2249be3d31   16 months ago   456MB
mysql                                                                             5.7             5107333e08a8   19 months ago   501MB
registry.cn-beijing.aliyuncs.com/dc3/iot-dc3-web                                  2023.4.0.demo   4f9cdb8a7a03   2 years ago     22.1MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-mysql                                    2023.4.0.demo   ac415318842e   2 years ago     449MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-gateway                                  2023.4.0.demo   7ca89202d3bc   2 years ago     244MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-center-manager                           2023.4.0.demo   87a93b5cacf1   2 years ago     241MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-center-data                              2023.4.0.demo   02507a999618   2 years ago     253MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-center-auth                              2023.4.0.demo   37b010ca4c2f   2 years ago     239MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-driver-virtual                           2023.4.0.demo   3ae832335eef   2 years ago     185MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-mongo                                    2023.4.0.demo   61fa1629960b   2 years ago     736MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-rabbitmq                                 2023.4.0.demo   3f30ca529949   2 years ago     108MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-redis                                    2023.4.0.demo   0fafd8a3e04c   2 years ago     32.5MB
registry.cn-beijing.aliyuncs.com/dc3/dc3-center-register                          2023.4.0.demo   880a539df928   2 years ago     544MB
crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/mydockerdemo   latest          97f57120105e   2 years ago     341MB

2. 镜像创建过程实例

[root@localhost ~]# cd /app/zprint-tomcat/
[root@localhost zprint-tomcat]# ls
conf  Dockerfile  logs  temp  webapps  zprint_tomcat_build.sh
[root@localhost zprint-tomcat]# sh zprint_tomcat_build.sh
[+] Building 7.3s (9/9) FINISHED                                                                                                                 docker:default=> [internal] load build definition from Dockerfile                                                                                                       0.0s=> => transferring dockerfile: 424B                                                                                                                       0.0s=> [internal] load .dockerignore                                                                                                                          0.0s=> => transferring context: 2B                                                                                                                            0.0s=> [internal] load metadata for docker.io/library/tomcat:8.5                                                                                              0.0s=> [1/4] FROM docker.io/library/tomcat:8.5                                                                                                                0.0s=> [internal] load build context                                                                                                                          7.2s=> => transferring context: 76.69MB                                                                                                                       7.0s=> CACHED [2/4] RUN mkdir -p /usr/local/tomcat/webapps                                                                                                    0.0s=> CACHED [3/4] COPY webapps/ /usr/local/tomcat/webapps/                                                                                                  0.0s=> CACHED [4/4] COPY conf/server.xml /usr/local/tomcat/conf/                                                                                              0.0s=> exporting to image                                                                                                                                     0.0s=> => exporting layers                                                                                                                                    0.0s=> => writing image sha256:20a4645b4bbe1445284b10730bcbf5fbc6aa94aae8a7951b3f253a8deb60e114                                                               0.0s=> => naming to crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5                                                      0.0s
请手动执行登录(如需推送):
docker login --username=ailiylz crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com
构建完成。如需推送,请执行:
docker push crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5
[root@localhost zprint-tomcat]# docker login --username=ailiylz crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com
Password:
Error response from daemon: Get "https://crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/v2/": Get "https://dockerauth.cn-hangzhou.aliyuncs.com/auth?account=ailiylz&client_id=docker&offline_token=true&service=registry.aliyuncs.com%3Acn-hangzhou%3A26842": read tcp 192.168.1.199:53244->120.55.35.37:443: read: connection reset by peer
[root@localhost zprint-tomcat]# docker login --username=ailiylz crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com
Password:
Error response from daemon: Get "https://crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/v2/": Get "https://dockerauth.cn-hangzhou.aliyuncs.com/auth?account=ailiylz&client_id=docker&offline_token=true&service=registry.aliyuncs.com%3Acn-hangzhou%3A26842": read tcp 192.168.1.199:35932->120.55.35.34:443: read: connection reset by peer
[root@localhost zprint-tomcat]# docker login --username=ailiylz crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com
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-storeLogin Succeeded
[root@localhost zprint-tomcat]# ^C
[root@localhost zprint-tomcat]# docker push crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat:8.5
The push refers to repository [crpi-61kqwp5ugch8hao1.cn-hangzhou.personal.cr.aliyuncs.com/ylzzone/zprint_tomcat]
24fc90e0759b: Layer already exists
acc82c5341a3: Layer already exists
5f70bf18a086: Pushed
2a0c096d3062: Layer already exists
fb0f37a0ea02: Layer already exists
02a99687e95e: Layer already exists
3e75af8aba85: Layer already exists
c2ef3e72aded: Layer already exists
d5a8ba654b65: Layer already exists
17031737aa00: Layer already exists
5498e8c22f69: Layer already exists
8.5: digest: sha256:4aaab71ca074a0f1266b0c646cd178923bf6eb00ae46caea73ec60441063c11b size: 2621
[root@localhost zprint-tomcat]#

3.docker-compse 容器管理实例

Last login: Mon Jul 21 16:14:42 2025 from 192.168.1.120
[root@localhost ~]# cd /app/zprint_test/
[root@localhost zprint_test]# ls
zprint.yaml[root@localhost zprint_test]# docker-compose -f zprint.yaml up -d
[+] Running 4/4✔ Network zprint_test_zprint_net              Created                                                                                                     0.1s✔ Volume "zprint_test_zprint_tomcat_webapps"  Created                                                                                                     0.0s✔ Container zprint_db                         Healthy                                                                                                     0.3s✔ Container zprint_tomcat                     Started                                                                                                    12.0s
[root@localhost zprint_test]# docker-compose -f zprint.yaml down
[+] Running 3/3✔ Container zprint_tomcat         Removed                                                                                                                 0.4s✔ Container zprint_db             Removed                                                                                                                 1.3s✔ Network zprint_test_zprint_net  Removed                                                                                                                 0.1s
[root@localhost zprint_test]# docker-compose -f zprint.yaml up -d
[+] Running 5/5✔ Network zprint_test_zprint_net              Created                                                                                                     0.1s✔ Volume "zprint_test_zprint_tomcat_conf"     Created                                                                                                     0.0s✔ Volume "zprint_test_zprint_tomcat_webapps"  Created                                                                                                     0.0s✔ Container zprint_db                         Healthy                                                                                                     0.0s✔ Container zprint_tomcat                     Started                                                                                                     5.0s

🚨 第六:容器化部署 Tomcat + MySQL 常见易错点汇总

以下是我们沟通中总结的最容易出错的点,按类别分类整理,帮助您避免“踩坑”。


📁 1. 目录结构与挂载问题

错误点描述解决方案
📁 挂载路径错误容器路径与宿主机路径不一致,导致配置或应用未生效确保 volumes: 中路径匹配,如 - zprint_tomcat_webapps:/usr/local/tomcat/webapps
📁 webapps/ROOT/ 目录结构错误应用文件不在正确路径下,导致 404检查 /usr/local/tomcat/webapps/ROOT/ 下是否有 index.jsp
📁 WAR 包未解压server.xml 中 unpackWARs="false" 导致 WAR 包未展开修改为 true,并重启容器
📁 挂载卷未初始化命名卷首次运行时未自动填充内容使用绑定挂载或在构建镜像时复制内容进去
📁 挂载权限问题宿主机文件权限导致 Tomcat 无法读取使用 chmod 或 chown 修改权限

⚙️ 2. 配置文件问题

错误点描述解决方案
📄 server.xml 配置错误Host 或 Context 配置不正确,导致应用未加载确保 Host 中 appBase="webapps" 且 unpackWARs="true"
📄 web.xml 缺失或错误导致 JSP 页面无法加载或 404确保 WEB-INF/web.xml 存在且配置正确
📄 jdbc.properties 配置错误数据库连接失败,导致页面空白或 500 错误检查 jdbc.properties 中的 URL、用户名、密码
📄 context.xml 配置缺失导致 JNDI 数据源未正确加载添加 context.xml 配置文件
📄 server.xml 中未配置 Context导致应用未自动加载添加 <Context path="" docBase="ROOT" reloadable="false"/>

🧱 3. 镜像构建问题

错误点描述解决方案
📦 文件未正确复制到镜像中构建时未复制 webapps/conf/ 等目录检查 Dockerfile 中的 COPY 指令
📦 构建后未推送镜像本地构建后未 docker push,导致其他机器无法拉取构建完成后执行 docker push
📦 镜像版本未更新使用旧版本镜像,未生效新配置明确指定镜像版本(如 :8.5
📦 镜像未包含依赖库缺少 lib/*.jar,导致 JSP 编译失败确保构建时复制所有依赖文件
📦 Dockerfile 未设置工作目录导致文件复制路径错误添加 WORKDIR /app 等指令确保路径正确

🧩 4. docker-compose 编排问题

错误点描述解决方案
🔄 服务启动顺序错误Tomcat 启动时 MySQL 未就绪使用 depends_on + condition: service_healthy
🔁 服务重启后数据丢失未使用命名卷或绑定挂载添加 volumes: 挂载数据目录
📦 镜像地址错误使用了错误的镜像名或仓库地址检查 image: 字段是否与推送镜像一致
📦 服务名错误depends_on 中服务名拼写错误检查服务名与 services: 中一致
📦 网络配置缺失服务间无法通信使用 networks: 定义共享网络

📁 5. 命名卷 vs 绑定挂载混淆

错误点描述解决方案
🧾 使用命名卷但未初始化数据容器内无内容,导致应用未加载使用绑定挂载或在构建时复制内容
🧾 使用绑定挂载路径错误宿主机路径不存在或未正确映射确保路径存在且映射正确
🧾 混合使用两种方式导致混乱本地修改未生效选择一种方式并统一使用
🧾 容器中路径与挂载路径不一致导致配置未覆盖确保挂载路径与容器路径一致,如 /usr/local/tomcat/conf
🧾 未查看卷实际路径无法定位日志或配置文件使用 docker volume inspect 查看实际路径

📊 6. 日志与调试问题

错误点描述解决方案
📝 日志未持久化容器删除后日志丢失使用 volumes: 挂载日志目录
📝 日志路径错误查看日志时路径错误检查容器内路径 /usr/local/tomcat/logs/
📝 未查看 Tomcat 日志不知道应用启动失败原因查看 catalina.out 和 localhost.log
📝 未查看 MySQL 日志不知道数据库连接失败原因查看 mysql 容器日志
📝 使用 docker logs 时未指定容器名查看日志时混淆多个容器使用 docker logs zprint 指定容器名

🧩 7. 网络与访问问题

错误点描述解决方案
🌐 端口未正确映射外部无法访问 Tomcat 或 MySQL检查 ports: 配置,如 "8099:8099"
🌐 容器间网络不通Tomcat 无法连接 MySQL使用 networks: 定义共享网络
🌐 使用错误的 IP 地址访问使用了容器 IP 而非宿主机 IP使用宿主机 IP 访问应用
🌐 使用错误的上下文路径访问应用部署为 /ROOT,但访问 /app确保访问路径为 http://ip:8099/
🌐 未等待健康检查完成Tomcat 启动后立即访问,MySQL 未准备好等待 healthcheck 成功后再访问

🧪 8. 数据库连接问题

错误点描述解决方案
📥 数据库未初始化表不存在或数据未导入使用 docker-entrypoint-initdb.d/ 初始化脚本
📥 数据库连接失败用户名、密码、URL 错误检查 jdbc.properties 或 context.xml
📥 数据库未持久化容器删除后数据丢失使用 volumes: 持久化 /var/lib/mysql
📥 数据库连接池配置错误连接池超时、最大连接数限制调整 maxActivemaxWait 等参数
📥 数据库未暴露端口外部无法访问数据库检查 ports: 配置 "33306:3306"

🧰 9. 命令执行问题

错误点描述解决方案
📝 未使用 -f 指定 compose 文件默认使用 docker-compose.yml使用 docker-compose -f zprint.yaml up -d
📝 未重启服务修改配置后未重启容器使用 docker-compose restart tomcat
📝 使用 docker run 替代 compose导致配置复杂且易错优先使用 docker-compose
📝 未清理缓存旧容器数据影响新部署使用 docker-compose down -v 清理卷
📝 未查看容器运行状态不知道服务是否运行正常使用 docker ps 查看容器状态

📋 总结表格:常见错误点汇总

类别错误点原因解决方案
📁 目录结构webapps/ROOT/ 不存在或内容错误Tomcat 无法加载应用确保目录结构正确
📁 挂载问题挂载路径错误或权限问题应用未加载使用绑定挂载调试
⚙️ 配置文件server.xmlweb.xml 配置错误JSP 页面未加载检查配置文件
🧱 镜像构建未复制文件或镜像未更新应用未生效检查 Dockerfile 和镜像版本
🧩 Compose 编排服务顺序错误、网络不通数据库连接失败使用 depends_on + healthcheck
📁 卷挂载WAR 未解压、文件未生效应用未加载检查 server.xml 中 unpackWARs
📊 日志查看未查看日志无法定位问题查看 catalina.out 和 localhost.log
🌐 网络访问端口未映射、上下文路径错误无法访问页面检查端口和访问路径
🧪 命令执行未重启服务、未查看容器状态不知道服务是否正常使用 docker-compose restart 和 docker ps

📌第七:异常操作查询及脚本

1. 常用DOCKER 排产命令

# 确认服务是否运行正常
# bash
docker ps
#查看 Tomcat 日志
docker exec -it zprint cat /usr/local/tomcat/logs/catalina.out
#进入容器检查应用目录
docker exec -it zprint ls /usr/local/tomcat/webapps/ROOT
#检查数据库连接
docker exec -it zprint mysql -h mysql -u Faurecia -p -e "use zprint_db; show tables;"
#重启服务
docker-compose -f zprint.yaml restart tomcat

2. zprint-check.sh 脚本

# zprint-check.sh
# !/bin/bash# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color# 检查 docker-compose 文件是否存在
if [ ! -f "docker-compose.yaml" ]; thenecho -e "${RED}❌ docker-compose.yaml 文件不存在,请确保当前目录正确。${NC}"exit 1
fi# 获取当前目录
CURRENT_DIR=$(pwd)# 检查容器是否运行
check_container_status() {echo -e "${YELLOW}🔍 检查容器运行状态...${NC}"docker-compose -f docker-compose.yaml ps | grep -E "zprint|zprint_db" | awk '{print $1, $2, $3, $5}'
}# 检查容器健康状态
check_health_status() {echo -e "${YELLOW}🧬 检查容器健康状态...${NC}"docker inspect zprint | grep -i "health" | grep -v "Healthcheck" | head -n 3docker inspect zprint_db | grep -i "health" | grep -v "Healthcheck" | head -n 3
}# 检查挂载目录
check_mounted_dirs() {echo -e "${YELLOW}📁 检查挂载目录是否存在...${NC}"if [ -d "./tomcat_webapps/ROOT" ]; thenecho -e "${GREEN}✅ webapps/ROOT 目录存在${NC}"elseecho -e "${RED}❌ webapps/ROOT 目录不存在,请检查挂载配置${NC}"fiif [ -d "./tomcat_conf" ]; thenecho -e "${GREEN}✅ tomcat_conf 目录存在${NC}"elseecho -e "${RED}❌ tomcat_conf 目录不存在,请检查挂载配置${NC}"fi
}# 检查 Tomcat 日志
check_tomcat_logs() {echo -e "${YELLOW}📄 检查 Tomcat 日志是否有错误...${NC}"if [ -f "./tomcat_logs/catalina.out" ]; thenERROR_COUNT=$(grep -c "ERROR\|SEVERE\|Exception" ./tomcat_logs/catalina.out)if [ $ERROR_COUNT -gt 0 ]; thenecho -e "${RED}❌ 日志中发现 $ERROR_COUNT 个错误,请检查:${NC}"grep -A 5 -B 5 "ERROR\|SEVERE\|Exception" ./tomcat_logs/catalina.out | head -n 20elseecho -e "${GREEN}✅ 日志中未发现严重错误${NC}"fielseecho -e "${RED}❌ catalina.out 日志文件不存在,请检查挂载是否正确${NC}"fi
}# 检查数据库连接
check_database_connection() {echo -e "${YELLOW}🔌 检查数据库连接...${NC}"docker exec -it zprint_db mysql -u Faurecia -p1qaz2wsx -e "use zprint_db; show tables;" 2>/dev/nullif [ $? -eq 0 ]; thenecho -e "${GREEN}✅ 数据库连接正常,已找到表${NC}"elseecho -e "${RED}❌ 数据库连接失败,请检查用户名/密码/网络配置${NC}"fi
}# 检查应用是否加载
check_app_deployment() {echo -e "${YELLOW}📦 检查 Tomcat 是否加载应用...${NC}"docker exec -it zprint ls /usr/local/tomcat/webapps/ROOT/index.jsp 2>/dev/nullif [ $? -eq 0 ]; thenecho -e "${GREEN}✅ 应用文件存在,index.jsp 已加载${NC}"elseecho -e "${RED}❌ 应用文件未找到,请检查挂载或 WAR 解压配置${NC}"fidocker exec -it zprint cat /usr/local/tomcat/logs/catalina.out | grep -i "deployed" | grep -q "ROOT"if [ $? -eq 0 ]; thenecho -e "${GREEN}✅ 应用已成功部署${NC}"elseecho -e "${RED}❌ 应用未部署,请检查 server.xml 或挂载配置${NC}"fi
}# 检查服务访问
check_service_access() {echo -e "${YELLOW}🌐 检查服务访问...${NC}"curl -s -o /dev/null -w "%{http_code}" http://localhost:8099/HTTP_CODE=$?if [ $HTTP_CODE -eq 0 ]; thenecho -e "${GREEN}✅ 服务已响应 HTTP 200 OK${NC}"elseecho -e "${RED}❌ 服务返回错误,请检查 Tomcat 或网络配置${NC}"fi
}# 执行检查
check_container_status
check_health_status
check_mounted_dirs
check_tomcat_logs
check_database_connection
check_app_deployment
check_service_accessecho -e "
${GREEN}✅ 检查完成!请根据上述信息判断问题所在。${NC}"
echo -e "💡 提示:如需进一步分析,请查看日志文件 ./tomcat_logs/catalina.out"

2. 执行zprint-check.sh bash 命令

chmod +x c:\your .sh file absulutly path\Tomcat 8.5\zprint-check.sh

📌第八: 下一步建议

希望这篇博文对您有帮助!如需进一步定制或扩展,请随时告诉我。

  • 是否需要我帮您生成一键备份脚本?
  • 是否需要我优化日志轮转策略?
  • 是否需要我演示如何动态更新 JDBC 配置?
  • 本地开发调试
  • 快速修改配置文件或日志
  • 需要直接访问宿主机文件内容
  • 生产环境部署
  • 多人协作项目
  • 需要镜像+卷组合发布的场景
  • 实现日志、配置、临时文件的持久化
  • 支持本地修改配置文件后重启容器生效
  • 使用 docker-compose 启动 MySQL 和 Tomcat 容器
  • 设置依赖关系,确保启动顺序正确
  • 构建包含 Web 应用的 Tomcat 镜像
  • 构建包含初始化数据的 MySQL 镜像
http://www.xdnf.cn/news/1167517.html

相关文章:

  • 分布式高可用ELK平台搭建及使用保姆级教程指南
  • 智能制造——解读52页汽车设计制造一体化整车产品生命周期PLM解决方案【附全文阅读】
  • linux用户态各定时器抖动测试
  • 操作符练习
  • 【Linux内核模块】模块声明与描述
  • nginx使用手册
  • 在easyui中如何自定义表格里面的内容
  • MCU中的总线桥是什么?
  • 分布在内侧内嗅皮层(MEC)的边界细胞对NLP中的深层语义分析的积极影响和启示
  • 深入浅出理解 TCP 与 UDP:网络传输协议的核心差异与应用
  • JMeter groovy 编译成.jar 文件
  • oracle里面concat函数用法,oracle wm_concat函数用法-
  • python学习-读取csv大文件
  • Apache Ignite实现无死锁特性
  • PHP与Web页面交互:从基础表单到AJAX实战
  • k8s:利用helm离线部署consul v1.21.2
  • 【菜狗学聚类】时间序列聚类主要方法—20250722
  • web3.0怎么入局
  • PePeOnTron上线 Binance Alpha:中文社区正走出自己的Web3之路
  • 内核协议栈源码阅读(一) ---驱动与内核交互
  • 进程优先级切换调度-进程概念(6)
  • Taro 网络 API 详解与实用案例
  • SecretFlow (3) --- 添加合作方并创建项目
  • JavaScript,发生异常,try...catch...finally处理,继续向上层调用者传递异常信息
  • RabbitMQ03——面试题
  • uniapp各大平台导航组件
  • 在 Ubuntu 22.04 上安装并优化 Nginx nginx入门操作 稍难,需要有一定理论 多理解 多实践
  • 《Uniapp-Vue 3-TS 实战开发》自定义时间选择
  • Kafka基础理论速通
  • IDEA全局Maven配置