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

Docker学习路径——6、Docker 微服务基础实战:Tomcat + MySQL + Redis 一站式部署指南

Docker 微服务基础实战:Tomcat + MySQL + Redis 一站式部署指南

在微服务架构中,应用通常由多个独立服务组成(如 Web 服务器、数据库、缓存)。Docker 让这些组件的部署变得前所未有的简单。本文将手把手教你用 Docker 快速搭建Tomcat(Web 服务) 三大核心组件,并解决常见配置陷阱,为构建完整微服务系统打下基础。

环境要求

  • 已安装 Docker(参考前文《Docker 安装与核心架构详解》)
  • 开放端口:8080(Tomcat)、3306(MySQL)、6379(Redis)

一、部署 Tomcat:Web 服务基石

问题背景:新版 Tomcat 镜像的“404 陷阱”

官方tomcat镜像(Tomcat 10+)默认不包含示例应用,直接访问会返回 404:

原因
为减小镜像体积,官方将webapps目录重命名为webapps.dist,需手动恢复。

方案 1:手动修复官方镜像(推荐学习原理)

步骤 1:启动容器
dockerrun-d-p8080:8080--nametomcat10 tomcat
步骤 2:进入容器修复目录
# 进入容器dockerexec-ittomcat10bash# 删除空 webapps 目录,恢复示例应用root@container:/usr/local/tomcat# rm -rf webappsroot@container:/usr/local/tomcat# mv webapps.dist webapps# 退出容器exit
步骤 3:验证

浏览器访问http://<服务器IP>:8080,成功显示 Tomcat 欢迎页!

💡原理
webapps.dist包含ROOTdocsexamples等标准目录,恢复后即可提供默认页面。


方案 2:使用预配置镜像(生产推荐)

社区维护的镜像已解决此问题,开箱即用:

# 拉取并运行预配置镜像dockerrun-d-p8081:8080\--nametomcat8\billygoo/tomcat8-jdk8# 验证(访问 8081 端口)curlhttp://localhost:8081

优势

  • 内置 JDK 8(兼容老项目)
  • 已配置好webapps
  • 无需手动干预

二、部署 MySQL 5.7:持久化数据库

核心需求

  • 数据持久化:避免容器删除导致数据丢失
  • UTF-8 编码:防止中文乱码
  • 安全密码:设置 root 密码

步骤 1:创建宿主机目录结构

mkdir-p/opt/mysql/{data,log,conf}
目录作用
/opt/mysql/data存储数据库文件
/opt/mysql/log存储日志文件
/opt/mysql/conf存储自定义配置

步骤 2:启动 MySQL 容器

dockerrun-d\-p3306:3306\-v/opt/mysql/log:/var/log/mysql\-v/opt/mysql/data:/var/lib/mysql\-v/opt/mysql/conf:/etc/mysql/conf.d\-eMYSQL_ROOT_PASSWORD=000000\# 设置 root 密码--namemysql5.7\mysql:5.7

⚠️关键参数

  • -e MYSQL_ROOT_PASSWORD:必须设置,否则容器启动失败
  • 三个-v挂载:确保数据、日志、配置持久化

步骤 3:配置 UTF-8 编码

创建配置文件
cat>/opt/mysql/conf/my.cnf<<EOF [client] default_character_set=utf8 [mysqld] collation_server=utf8_general_ci character_set_server=utf8 EOF
重启生效
dockerrestart mysql5.7

步骤 4:验证数据库操作

# 进入容器dockerexec-itmysql5.7 mysql-uroot-p000000# 在 MySQL 中执行mysql>SHOW VARIABLES LIKE'character%';-- 确认所有 character_set_* 均为 utf8 mysql>CREATE DATABASE test_db;mysql>USE test_db;mysql>CREATE TABLE users(id INT, name VARCHAR(20));mysql>INSERT INTOusersVALUES(1,'张三');mysql>SELECT * FROMusers;+------+--------+|id|name|+------+--------+|1|张三|+------+--------+

🔒安全建议
生产环境应:

  1. 使用强密码(非000000
  2. 创建专用用户(非 root)
  3. 限制网络访问(-p 127.0.0.1:3306:3306

三、部署 Redis:高性能缓存

核心需求

  • 外部访问:注释bind 127.0.0.1
  • 关闭保护模式protected-mode no
  • 持久化:启用 AOF 或 RDB
  • 密码认证requirepass <password>

步骤 1:准备配置文件

mkdir-p/opt/rediscat>/opt/redis/redis.conf<<EOF # 允许外部连接 # bind 127.0.0.1 # 关闭保护模式 protected-mode no # 必须为 no(Docker 中以非守护进程运行) daemonize no # 启用 AOF 持久化 appendonly yes # 设置密码 requirepass 000000 # 日志文件(留空或注释,避免权限问题) logfile "" EOF

⚠️关键配置说明

  • daemonize no:Docker 容器要求前台运行,设为yes会导致启动失败
  • logfile "":避免因日志目录权限问题崩溃

步骤 2:启动 Redis 容器

dockerrun-d\-p6379:6379\-v/opt/redis/redis.conf:/etc/redis/redis.conf\-v/opt/redis/data:/data\--nameredistest\redis\/etc/redis/redis.conf# 指定配置文件路径

步骤 3:验证 Redis 功能

# 进入容器dockerexec-itredistest redis-cli-a000000# 执行命令127.0.0.1:6379>SET user:1:name"李四"OK127.0.0.1:6379>GET user:1:name"李四"127.0.0.1:6379>PING PONG

步骤 4:调整数据库数量(可选)

Redis 默认 16 个数据库(0-15),可修改:

# 编辑配置文件echo"databases 10">>/opt/redis/redis.conf# 重启生效dockerrestart redistest# 验证127.0.0.1:6379>SELECT10(error)ERR DB index is out of range# 因只有 0-9

四、微服务互联:容器间通信

场景:Tomcat 应用连接 MySQL 和 Redis

方法 1:使用宿主机 IP(简单但耦合)
  • Tomcat 应用中配置:
    db.url=jdbc:mysql://<宿主机IP>:3306/test_db redis.host=<宿主机IP>
方法 2:Docker 自定义网络(推荐!)
# 创建自定义网络dockernetwork create micro-net# 重新启动服务(加入网络)dockerrun-d--networkmicro-net--namemysql-db mysql:5.7...dockerrun-d--networkmicro-net--nameredis-cache redis...dockerrun-d--networkmicro-net--namemy-tomcat tomcat...# 在 Tomcat 容器内直接通过服务名访问pingmysql-db# 解析到 MySQL 容器 IPpingredis-cache# 解析到 Redis 容器 IP

优势

  • 服务发现自动完成(无需硬编码 IP)
  • 网络隔离(仅 micro-net 内容器可互访)
  • 更安全(默认 bridge 网络所有容器互通)

五、常见问题排查

Q1:Tomcat 启动后无法访问?

  • 检查:是否修复了webapps目录?
  • 验证docker exec tomcat10 ls /usr/local/tomcat/webapps

Q2:MySQL 容器启动失败?

  • 查看日志docker logs mysql5.7
  • 常见原因
    • 未设置MYSQL_ROOT_PASSWORD
    • 挂载目录权限不足(chown -R 999:999 /opt/mysql

Q3:Redis 连接被拒绝?

  • 检查配置
    • bind是否注释?
    • protected-mode是否为no
  • 验证端口telnet <IP> 6379

六、总结与下一步

组件关键操作持久化方案
Tomcat修复webapps或用预配置镜像无(应用代码应外置)
MySQL挂载 data/log/conf 目录Bind Mounts
Redis自定义redis.confBind Mounts + AOF

🚀后续学习路径

  1. 编写 Dockerfile:将应用打包为镜像
  2. 使用 docker-compose:一键编排三大服务
  3. 配置 Nginx 反向代理:统一入口
  4. 集成 Spring Boot:开发真实微服务应用

通过本文,你已掌握 Docker 微服务基础组件的部署能力。现在,你可以开始构建自己的云原生应用了!

http://www.jsqmd.com/news/706332/

相关文章:

  • R语言机器学习实战:10大内置数据集应用指南
  • 基于PraisonAI的多智能体编排框架:从YAML配置到生产部署全解析
  • DeepLabv3+:融合空洞可分离卷积的编码器-解码器语义分割架构
  • gws:Google Workspace命令行工具,为AI自动化而生
  • Cursor Stats Extension:为AI编程助手打造数据可视化仪表盘
  • LLMStack:低代码平台如何简化大模型应用开发与RAG系统构建
  • 【3D】VTK-Ubuntu22.04安装VTK
  • AI日报:24小时全球科技热点速览
  • 2026如何选牛牛加速厂家:牛牛ip、牛牛加速、宽带多拨、模拟器、短效IP、静态IP、SDK包、http、socks5选择指南 - 优质品牌商家
  • 2026年平衡泥技术解析:平衡泥厂家、平衡泥品牌、平衡泥工厂、动平衡泥、平衡泥公司、平衡泥厂商、平衡土、高比重平衡胶泥选择指南 - 优质品牌商家
  • 基于用户行为数据的留存动因分析与预警策略研究
  • 【风暴之城】游玩日记 新手攻略(2)
  • 为Open WebUI构建安全代码执行沙箱:基于gVisor的本地LLM增强方案
  • 这些AI编曲软件到底强在哪,2026年度甄选5款AI编曲软件汇总,高质量助力音乐人制作编曲伴奏
  • 自洽性与Agent的结合
  • DeepSeek-V4-Pro API降价实测
  • 07.训练自己的数据集(上):标注与格式准备
  • Agent 安全性红队测试:如何防止 Prompt Injection 攻击你的智能体?
  • 基于RAG的ChatGPT文件检索工具:从原理到实践
  • 基于LangGraph的多智能体AI内容生成系统XunLong实战指南
  • 智能体的情景记忆
  • NLP文本表示方法对比:词袋、TF-IDF与LLM嵌入
  • 昨天晚上 口头发表政治评论 马桶提示:6 d 心
  • 深度学习实践
  • React Fiber 异步渲染原理讲解
  • 计算机视觉中图像数据预处理与增强技术详解
  • 为什么 Markdown 是大模型更优雅的对话格式?
  • 低功耗IoT自动调制识别:轻量特征+微型神经网络,一文吃透核心理论【附python代码】
  • GOSIM Spotlight 2026 Frontier Creators入围作品正式官宣!
  • Bridgic:轻量级数据集成平台的设计、实践与避坑指南