使用 podman-compose 重新编排你的微服务环境,并采用自定义网络 wt-networks,可以统一管理容器间的通信,并通过服务名实现互相访问。
以下是在你的 Rocky Linux 系统上的完整方案。
📁 目录结构
你的现有数据目录位于 /wtdata/ccompose/weifuwu/,其下已有:
/wtdata/ccompose/weifuwu/ ├── mysql57/ │ ├── conf/ │ ├── data/ # 已有数据 │ └── logs/ ├── redis7215/ │ ├── conf/ │ │ └── redis.conf │ └── data/ # 已有数据 └── springboot.jar # 你可能需要把 jar 和 Dockerfile 单独放,这里假设镜像已 build
为了使用 podman-compose,我们将在 /wtdata/ccompose/weifuwu/ 下创建一个 docker-compose.yml 文件,并将 SpringBoot 镜像也纳入服务。
🛠️ 步骤一:准备 SpringBoot 镜像(如果尚未构建)
如果还没构建镜像,请先在项目目录(如 /wtdata/ccompose/weifuwu/springboot)放置 Dockerfile 和 jar 包,然后构建:
cd /wtdata/ccompose/weifuwu/springboot # 将你的 jar 复制到这里,假设名为 redisStudy-0.0.1-SNAPSHOT.jar podman build -t springboot-redis-mysql-java25:1.1 .
如果已经构建过,可以跳过。
📝 步骤二:编写 docker-compose.yml
在 /wtdata/ccompose/weifuwu/ 下创建 docker-compose.yml 文件:
cd /wtdata/ccompose/weifuwu
vim docker-compose.yml
将以下内容粘贴进去,注意修改 SpringBoot 的环境变量或配置文件,使其连接 MySQL 和 Redis 时使用服务名。
version: '3.8'services:mysql:image: mysql:5.7container_name: mysql57restart: unless-stoppedenvironment:MYSQL_ROOT_PASSWORD: 123456ports:- "3306:3306" # 可选,如需宿主机访问保留volumes:- ./mysql57/conf:/etc/mysql/conf.d:Z- ./mysql57/logs:/logs:Z- ./mysql57/data:/var/lib/mysql:Znetworks:- wt-networkshealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p$MYSQL_ROOT_PASSWORD"]interval: 10stimeout: 5sretries: 5redis:image: redis:7.2.15container_name: redis7215restart: unless-stoppedports:- "6379:6379" # 可选volumes:- ./redis7215/conf/redis.conf:/etc/redis/redis.conf:z- ./redis7215/data:/data:zcommand: ["redis-server", "/etc/redis/redis.conf"]networks:- wt-networkshealthcheck:test: ["CMD", "redis-cli", "ping"]interval: 10stimeout: 5sretries: 5springboot:image: springboot-redis-mysql-java25:1.1container_name: my-springbootrestart: unless-stoppedports:- "7777:7777" # 宿主机映射,外部访问environment:# 如果你的 SpringBoot 支持通过环境变量覆盖配置,可以这样设置# 否则请修改 application.yml 或 properties 中的连接地址SPRING_DATASOURCE_URL: "jdbc:mysql://mysql:3306/bigdata?useSSL=false&useUnicode=true&characterEncoding=utf8"SPRING_DATASOURCE_USERNAME: rootSPRING_DATASOURCE_PASSWORD: 123456SPRING_DATA_REDIS_HOST: redisSPRING_DATA_REDIS_PORT: 6379networks:- wt-networksdepends_on:mysql:condition: service_healthyredis:condition: service_healthynetworks:wt-networks:driver: bridge# 使用桥接驱动,podman-compose 会自动创建
关键点说明:
-
自定义网络:
networks定义wt-networks,所有服务都加入此网络。容器间通过服务名(mysql、redis)互相访问。 -
SpringBoot 连接配置:
-
通过环境变量覆盖 Spring Boot 的
application.properties或application.yml中的配置项。请确认你的 SpringBoot 是否支持通过环境变量覆盖(如spring.datasource.url->SPRING_DATASOURCE_URL)。 -
如果不支持,你需要在 SpringBoot 的配置文件中直接将数据库 URL 改为
jdbc:mysql://mysql:3306/bigdata...,Redis host 改为redis,然后重新构建镜像。推荐使用环境变量方式更灵活。
-
-
数据卷:使用相对路径
./mysql57/...,对应/wtdata/ccompose/weifuwu/mysql57/...,保留原有数据。 -
健康检查:
depends_on配合condition: service_healthy确保 SpringBoot 在 MySQL 和 Redis 就绪后再启动。 -
SELinux 标签:保留
:Z或:z以适配 SELinux。
🧹 步骤三:停止并移除旧容器(保留数据卷)
先停止并删除之前手动启动的容器,以免端口冲突:
podman stop mysql57 redis7215 my-springboot podman rm mysql57 redis7215 my-springboot
数据卷目录不会受影响,数据完好。
🚀 步骤四:使用 podman-compose 启动新环境
在 /wtdata/ccompose/weifuwu/ 目录下执行:
podman-compose up -d
观察启动过程,第一次会拉取镜像(如果本地没有),然后创建并启动三个容器。
检查状态:
podman-compose ps
podman-compose logs -f # 实时查看所有日志
✅ 步骤五:验证连接
-
验证 SpringBoot 容器内是否能解析服务名:
podman exec -it my-springboot ping mysql # 如果容器内有 ping 工具 podman exec -it my-springboot ping redis
或者使用
getent hosts mysql。 -
测试业务接口:
curl http://localhost:7777/your-api-path
-
查看 MySQL 数据:
podman exec -it mysql57 mysql -uroot -p123456 -e "SELECT * FROM bigdata.t_customer;"
-
Redis 测试:
podman exec -it redis7215 redis-cli ping
🔧 常见问题与调整
-
SpringBoot 连接超时:如果应用启动过早,可增大
depends_on的condition为service_started(默认)但不如 healthcheck 可靠。你的 Dockerfile 中未提供wait-for-it脚本,如果仍然失败,可考虑在 SpringBoot 应用中启用重试机制(如 Spring Retry)。 -
环境变量覆盖不生效:检查 SpringBoot 配置是否使用
@Value或@ConfigurationProperties并支持Relaxed Binding。例如,spring.datasource.url可以通过SPRING_DATASOURCE_URL覆盖。如果不生效,请修改配置文件并重新构建镜像。 -
持久化数据:由于我们保留了原数据卷,MySQL 和 Redis 的数据不会丢失。
-
端口映射:如果你不希望宿主机暴露 MySQL 和 Redis 端口(提高安全性),可以注释掉
ports部分,仅在内部网络中访问。 -
SELinux 权限:如果启动容器时遇到权限错误,检查卷目录的 SELinux 上下文。可以执行:
sudo chcon -Rt container_file_t /wtdata/ccompose/weifuwu/mysql57 sudo chcon -Rt container_file_t /wtdata/ccompose/weifuwu/redis7215或者使用
chcon -Rt svirt_sandbox_file_t(适用于 Podman)。
📌 总结
现在你拥有一个完整的 podman-compose 编排文件,通过自定义网络 wt-networks 让 SpringBoot、MySQL、Redis 互相通信,同时保留了原有数据,便于管理和迁移。
如果一切顺利,你的微服务环境将更加稳定、可维护。如果遇到具体问题,请随时提供 podman-compose logs 的输出,我会帮你进一步诊断。😊
