news 2026/4/27 2:37:23

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 微服务基础组件的部署能力。现在,你可以开始构建自己的云原生应用了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 2:31:01

Arm Neoverse V1 PMU架构与性能监控实战

1. Neoverse V1 PMU架构深度解析1.1 PMUv3p4架构特性Arm Neoverse V1采用的PMUv3p4是Armv8.4-A架构中的性能监控扩展实现。这个版本在基础PMU功能上引入了多项增强特性&#xff1a;扩展事件空间&#xff1a;通过新增的PMMIR_EL1寄存器提供更多微架构事件编码空间&#xff0c;支…

作者头像 李华
网站建设 2026/4/27 2:28:21

Devart数据连接工具全解析与26周年庆优惠指南

1. 项目背景与核心价值Devart作为数据连接工具领域的资深厂商&#xff0c;在26周年庆之际推出全线产品20%折扣活动。这不仅是简单的促销行为&#xff0c;更是对开发者社区长期支持的实质性回馈。作为使用过多种数据库工具的老兵&#xff0c;我亲历过从手工编写连接字符串到可视…

作者头像 李华
网站建设 2026/4/27 2:14:37

3个步骤快速掌握MTK设备修复:新手完整救砖指南

3个步骤快速掌握MTK设备修复&#xff1a;新手完整救砖指南 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient MTKClient是一款强大的开源联发科设备修复工具&#xff0c;能够帮助用户解决手机…

作者头像 李华