使用 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.7
    container_name: mysql57
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"          # 可选,如需宿主机访问保留
    volumes:
      - ./mysql57/conf:/etc/mysql/conf.d:Z
      - ./mysql57/logs:/logs:Z
      - ./mysql57/data:/var/lib/mysql:Z
    networks:
      - wt-networks
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7.2.15
    container_name: redis7215
    restart: unless-stopped
    ports:
      - "6379:6379"          # 可选
    volumes:
      - ./redis7215/conf/redis.conf:/etc/redis/redis.conf:z
      - ./redis7215/data:/data:z
    command: ["redis-server", "/etc/redis/redis.conf"]
    networks:
      - wt-networks
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  springboot:
    image: springboot-redis-mysql-java25:1.1
    container_name: my-springboot
    restart: unless-stopped
    ports:
      - "7777:7777"          # 宿主机映射,外部访问
    environment:
      # 如果你的 SpringBoot 支持通过环境变量覆盖配置,可以这样设置
      # 否则请修改 application.yml 或 properties 中的连接地址
      SPRING_DATASOURCE_URL: "jdbc:mysql://mysql:3306/bigdata?useSSL=false&useUnicode=true&characterEncoding=utf8"
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: 123456
      SPRING_DATA_REDIS_HOST: redis
      SPRING_DATA_REDIS_PORT: 6379
    networks:
      - wt-networks
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy

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

posted on 2026-08-16 06:00  wtsgtc  阅读(2)  评论(0)    收藏  举报