# docker-project **Repository Path**: yangkunliang/docker-project ## Basic Information - **Project Name**: docker-project - **Description**: docker项目学习 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-12 - **Last Updated**: 2025-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot + MySQL + Docker 项目 ## 项目概览 - 技术栈:`Spring Boot 3.x`、`Java 17`、`MySQL 8.0`、`Docker`、`Docker Compose` - 功能点:用户实体的基础增改查接口、健康检查接口 - 生产化要点:多阶段 Docker 构建、非 root 运行、MySQL 初始化脚本、Compose 依赖健康检查 ## 目录结构 ``` . ├── Dockerfile ├── docker-compose.yml ├── .dockerignore ├── pom.xml ├── README.md ├── db │ └── init.sql └── src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── demo │ │ ├── DemoApplication.java │ │ ├── controller │ │ │ ├── HealthController.java │ │ │ └── UserController.java │ │ ├── entity │ │ │ └── User.java │ │ └── repository │ │ └── UserRepository.java │ └── resources │ └── application.yml └── test ``` ## 本地运行(不使用 Docker) - 前置要求:安装 `Java 17+` 与 `Maven 3.6.3+` - 启动 MySQL(本地或远端)并创建数据库 `app_db` - 设置环境变量(可选): - `DB_HOST`、`DB_PORT`、`DB_NAME`、`DB_USER`、`DB_PASSWORD` - 构建与运行: ``` # 若使用本地 Maven(3.6.3 亦可),已在 .mvn/maven.config 指定 settings mvn -DskipTests clean package java -jar target/spring-docker-mysql-0.0.1-SNAPSHOT.jar # 如需显式使用仓库设置: mvn -s .mvn/settings.xml -DskipTests clean package ``` - 接口验证: ``` # 健康检查 curl http://localhost:8080/api/health # 查询用户列表(初始数据来自 init.sql) curl http://localhost:8080/api/users # 创建用户 curl -X POST http://localhost:8080/api/users \ -H 'Content-Type: application/json' \ -d '{"name":"Charlie","email":"charlie@example.com"}' ``` ## Docker 构建与运行 - 前置要求:安装 `Docker` 与 `Docker Compose` - 一键启动: ``` docker compose up --build -d ``` - 查看日志: ``` docker compose logs -f app ``` - 关闭并清理: ``` docker compose down -v ``` ### 使用本机 MySQL(镜像拉取受限时) - 启动前确保本机 MySQL 有数据库与账号(`app_db`、用户 `app/app_pass`) - 启动仅应用服务(不启 `db`): ``` DB_HOST=host.docker.internal docker compose up --build -d app ``` - 如端口冲突,调整 `docker-compose.yml` 的端口映射:例如 `9090:8080` ### Docker Hub 镜像加速配置(macOS Docker Desktop) - 打开 `Docker Desktop` → `Settings` → `Docker Engine` - 在 JSON 中添加镜像源后 `Apply & Restart`: ``` { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.ccs.tencentyun.com" ] } ``` - 验证: ``` docker pull hello-world docker pull mysql:8.0 docker compose up --build -d ``` ## Compose 服务说明 - `db`:`mysql:8.0` - 环境变量:`MYSQL_ROOT_PASSWORD=root_pass`、`MYSQL_DATABASE=app_db`、`MYSQL_USER=app`、`MYSQL_PASSWORD=app_pass` - 挂载:`./db/init.sql` 到 `/docker-entrypoint-initdb.d/` - 端口:`3306` - `app`:基于多阶段构建生成的 Spring Boot 镜像 - 端口:`8080` - 依赖:等待 `db` 服务健康检查通过后启动 - 环境:`SPRING_PROFILES_ACTIVE=docker` 以及数据库连接相关变量 ## 关键配置说明 - `src/main/resources/application.yml` - 默认从环境变量读取数据库连接信息 - `spring.jpa.hibernate.ddl-auto=update` 便于快速演示 - Docker profile 会将 `DB_HOST` 默认值置为 `db` - `Dockerfile` - 使用 `maven:3.9-eclipse-temurin-17` 进行依赖预取与构建 - 使用 `eclipse-temurin:17-jre` 作为运行时镜像,非 root 用户运行 - `db/init.sql` - 初始化 `users` 表并插入两条样例数据 - `.mvn/settings.xml` 与 `.mvn/maven.config` - 强制使用 Maven Central,避免私有仓库导致拉取失败 - 通过 `maven.config` 自动应用 settings(无需每次写 `-s`) ## 版本兼容说明 - JDK:项目以 `Java 17` 为编译目标,使用 `Java 21` 运行/编译亦可(向下编译到 17)。 - Maven:本地 `Maven 3.6.3` 可正常构建;如有私有仓库影响,请使用提供的 settings。 ## 常见问题 - 无法连接数据库:确认 `db` 容器健康、端口未冲突、账号密码正确 - 启动失败:确认本机或容器内 Java 版本为 17,网络可访问 Maven 仓库 ## 版权与许可 - 代码仅用于示例,可自由修改与使用 ``` ### Maven 镜像拉取问题(可选替代) - 若 `maven:3.9-eclipse-temurin-17` 镜像拉取失败,可在构建时覆盖镜像: ``` docker compose build \ --build-arg MAVEN_IMAGE=maven:3.8.6-openjdk-17 \ --build-arg RUNTIME_IMAGE=eclipse-temurin:17-jre docker compose up -d ``` - 或者本地先构建 JAR,再用本地镜像运行: ``` mvn -DskipTests clean package docker build -f Dockerfile -t spring-docker-mysql:latest . docker compose up --no-build -d ```