java应用与mysql通过docker自定义网络互通,核心是创建myapp-network并让两者加入该网络,java容器用mysql-db容器名连接,无需暴露mysql端口。

Java 应用通过 Docker 容器化部署 MySQL,核心在于:MySQL 单独运行在独立容器中,Java 应用(如 Spring Boot)运行在另一个容器里,两者通过 Docker 自定义网络互通——不依赖 localhost,也不用暴露 MySQL 到宿主机端口(除非调试需要)。
1. 创建自定义 Docker 网络
容器间通信推荐使用用户定义的桥接网络,它支持容器名自动 DNS 解析,比默认 bridge 更可靠、更安全。
执行命令创建网络:
docker network create myapp-network后续启动的 MySQL 和 Java 容器都加入该网络,就能直接用容器名(如 mysql)互相访问。
2. 启动 MySQL 容器并配置关键参数
运行 MySQL 容器时需指定网络、root 密码、数据库名,并可选挂载数据卷保障持久化:
docker run -d \--name mysql-db \
--network myapp-network \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=myapp \
-v mysql-data:/var/lib/mysql \
-p 3307:3306 \
-d mysql:8.0
- --name mysql-db:给容器起固定名字,Java 容器将用这个名字作为数据库主机地址
- --network myapp-network:确保与 Java 容器处于同一网络,才能互通
- -p 3307:3306:仅用于本地调试(如用 Navicat 连接),生产环境可省略此映射
- -v mysql-data:/var/lib/mysql:命名卷方式持久化数据,重启或重部署不会丢库
3. Java 应用容器连接 MySQL 容器
Spring Boot 项目中,application.yml 的数据库配置应使用 MySQL 容器名 + 默认端口:
spring:datasource:
url: jdbc:mysql://mysql-db:3306/myapp?useSSL=false&serverTimezone=UTC
username: root
password: 123456
构建 Java 镜像后,启动时也加入同一网络:
docker run -d \--name my-spring-app \
--network myapp-network \
-p 8080:8080 \
my-spring-boot-app:1.0
此时 Java 容器内发起的 jdbc:mysql://mysql-db:3306/... 请求,会被 Docker 内置 DNS 解析为 mysql-db 容器的 IP,完成通信。
4. 注意事项与排错要点
- MySQL 8.0 默认启用 caching_sha2_password 插件,Java 驱动需 8.0.19+ 版本;若报
Public Key Retrieval is not allowed,可在 URL 加&allowPublicKeyRetrieval=true&useSSL=false - 启动 Java 容器前,确认 MySQL 容器已运行(
docker ps | grep mysql-db),否则连接会因“Connection refused”失败 - 若需等待 MySQL 就绪再启动 Java 应用,可在启动脚本中加简单健康检查(如用
nc -z mysql-db 3306循环探测) - 避免使用
host.docker.internal或localhost:它们在 Linux 上不可靠,在多容器场景下必然失效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











