已知这是后端项目中的application.yml中的部分内容: server: port: 9090 spring: data: redis: port: 6379 host: cache-server1 password: 123456 datasource: url: jdbc:mysql://db-server1:3306/docker?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=true username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath*:mapper/*.xml type-aliases-package: com.lu.hotel.entity configuration: map-underscore-to-camel-case: true 把后端项目打包成hotel-0.0.1-SNAPSHOT.jar后,在docker中使用docker compose对springboot项目进行部署,新建了一个mydata目录,下面是dockerfile,docker-compose.yml,mysql,redis和hotel-0.0.1-SNAPSHOT.jar,其中把数据库的hotel.sql文件放在了mysql/init下面,hotel.sql是整个数据库的SQL文件,里面有很多表,已知dockerfile的内容如下: FROM openjdk:23-jdk-bookworm MAINTAINER docker COPY hotel-0.0.1-SNAPSHOT.jar /hotel.jar ENTRYPOINT ["java", "-jar", "/hotel.jar"] EXPOSE 9090 已知docker-compose.yml的文件内容如下: services: back-server: build: . container_name: hotel ports: - "9090:9090" networks: - demo_net depends_on: - cache-server - db-server cache-server: image: redis:6.0.8 container_name: "cache-server1" ports: - "6379:6379" volumes: - ./redis/data:/data networks: demo_net: ipv4_address: 172.16.0.4 db-server: image: mysql:5.7 container_name: "db-server1" environment: MYSQL_ROOT_PASSWORD: 'root' MYSQL_ALLOW_EMPTY_PASSWORD: 'no' MYSQL_DATABASE: 'docker' MYSQL_USER: 'docker' MYSQL_PASSWORD: 'docker' ports: - "3307:3306" volumes: - ./mysql/db:/var/lib/mysql - ./mysql/init:/docker-entrypoint-initdb.d networks: demo_net: ipv4_address: 172.16.0.3 command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci networks: demo_net: ipam: config: - subnet: 172.16.0.0/24 以上部分
根据引用[2],使用Docker内部网络是关键,容器间可以通过服务名称作为主机名访问。所以应该在docker-compose.yml中定义自定义网络,确保所有服务都在同一个网络下。另外,引用[3]和[4]提到需要编写Dockerfile和docker-compose.yml文件,并且需要注意镜像的构建和依赖配置。
接下来,用户可能需要分步骤的指导,比如如何组织项目结构,编写Dockerfile,配置docker-compose.yml,处理环境变量,以及如何确保服务启动顺序正确。同时,常见的问题比如连接失败,可能需要检查网络配置、环境变量是否正确,以及服务是否健康。
还要注意Spring Boot应用的配置文件中,数据库和Redis的主机名应该使用docker-compose中定义的服务名称,比如mysql和redis,端口保持默认。此外,MySQL和Redis的容器可能需要一些初始化配置,比如root密码、数据库创建等,这些可以通过environment部分设置。
最后,用户可能想知道如何构建镜像、启动服务以及排查启动问题。需要提醒他们使用docker-compose up命令,并查看日志来调试问题。可能还需要提到健康检查或者depends_on来确保服务依赖正确。### 分步配置与启动Docker Compose环境
1. 项目结构准备
project/
├── src/ # Spring Boot项目源码
├── Dockerfile # Spring Boot应用镜像构建文件
└── docker-compose.yml # 定义多服务容器配置
2. Dockerfile配置
FROM openjdk:17-jdk-slim
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
3. docker-compose.yml核心配置
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql-8
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
ports:
- "3306:3306"
networks:
- app-network
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6.2-alpine
container_name: redis-6
ports:
- "6379:6379"
networks:
- app-network
volumes:
- redis_data:/data
springboot-app:
build: .
container_name: spring-app
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/appdb
SPRING_REDIS_HOST: redis
ports:
- "8080:8080"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mysql_data:
redis_data:
4. 关键配置说明
- 网络配置:所有服务共享
app-network
网络,确保容器间通过服务名直连[^2] - 依赖控制:使用
depends_on
+健康检查确保服务启动顺序 - 数据持久化:通过命名卷保持数据库和Redis数据
- 环境变量:Spring Boot通过服务名访问数据库和Redis(mysql/redis)
5. 启动流程
# 构建镜像并启动
docker-compose up -d --build
# 查看实时日志
docker-compose logs -f springboot-app
# 停止服务
docker-compose down
6. 常见问题排查
连接超时问题:
- 检查网络配置是否一致
- 验证容器IP是否在同一个子网(
docker network inspect
) - 确认服务名称拼写正确[^2]
数据库初始化失败:
# 添加初始化脚本(mysql服务配置) volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql
健康检查配置:
# 增强mysql健康检查 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 10s retries: 5
时区同步:
# 统一容器时区 environment: TZ: Asia/Shanghai
相关推荐

















