三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

使用 podman-compose 重新编排微服务环境

使用 podman-compose 重新编排微服务环境

使用 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,所有服务都加入此网络。容器间通过服务名mysqlredis)互相访问。

  • 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   # 实时查看所有日志

✅ 步骤五:验证连接

  1. 验证 SpringBoot 容器内是否能解析服务名

    podman exec -it my-springboot ping mysql   # 如果容器内有 ping 工具
    podman exec -it my-springboot ping redis

     

    或者使用 getent hosts mysql

  2. 测试业务接口

    curl http://localhost:7777/your-api-path

     

  3. 查看 MySQL 数据

    podman exec -it mysql57 mysql -uroot -p123456 -e "SELECT * FROM bigdata.t_customer;"

     

  4. 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 的输出,我会帮你进一步诊断。😊

← 返回列表