必须创建自定义桥接网络(如myapp-net)并让所有容器加入该网络,才能通过容器名(如mysql-db、redis-cache)实现服务间通信;默认bridge网络不支持容器名解析。

Java 应用运行在 Docker 容器中时,若需多个容器(比如 Spring Boot 服务 + MySQL + Redis)互相通过**服务名通信**,不能依赖默认的 bridge 网络——它不支持容器名自动解析。必须创建自定义桥接网络(docker network create),让容器加入同一网络后,能直接用容器名(或 --alias 指定的别名)访问彼此。
1. 创建自定义桥接网络
执行命令创建一个用户定义的桥接网络,例如名为 myapp-net:
docker network create myapp-net
该命令会创建一个隔离的内部子网(如 172.18.0.0/16),并启用内置 DNS,使容器可通过名称发现彼此。无需指定参数即可满足大多数 Java 微服务场景。
立即学习“Java免费学习笔记(深入)”;
2. 启动容器并加入该网络
启动每个容器时,显式指定 --network myapp-net,并建议使用 --name 显式命名(这是后续互联的关键):
- MySQL 容器:
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123456 --network myapp-net -p 3306:3306 mysql:8 - Redis 容器:
docker run -d --name redis-cache --network myapp-net -p 6379:6379 redis:7-alpine - 你的 Java 应用(如 Spring Boot JAR):
docker run -d --name myapp-backend --network myapp-net -p 8080:8080 -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/mydb -e SPRING_REDIS_HOST=redis-cache my-java-app:1.0
注意:JDBC URL 中的 mysql-db、Redis 配置中的 redis-cache 就是其他容器的 --name 值,Docker DNS 会自动将其解析为对应容器的 IP。
3. Java 应用内配置要点
确保 Java 应用的连接配置使用**容器名而非 localhost 或宿主机 IP**:
- 数据库 URL 示例:
jdbc:mysql://mysql-db:3306/appdb(不是localhost:3306或host.docker.internal) - Redis 地址:
redis-cache:6379 - 若用 Feign/OpenFeign 调用其他 Java 服务,目标服务也应部署在同一网络,并用其
--name作为 host(如http://auth-service:8081/login)
Spring Boot 的 application.yml 中可这样写:
spring:
datasource:
url: jdbc:mysql://mysql-db:3306/myapp
redis:
host: redis-cache
4. 验证与排错技巧
若连接失败,按顺序检查:
- 确认所有容器都运行在同一个网络:
docker network inspect myapp-net,查看Containers字段是否包含目标容器 - 进入 Java 容器调试:
docker exec -it myapp-backend sh,然后 ping 或 telnet 测试连通性:ping mysql-db、telnet mysql-db 3306 - Docker 默认禁用 IPv6,如应用日志出现
xxx resolved to multiple addresses,可在启动容器时加--sysctl net.ipv6.conf.all.disable_ipv6=1避免 DNS 解析歧义
不复杂但容易忽略:容器名必须唯一且不含下划线(部分旧版 Docker 对 DNS 名有严格限制),推荐全小写字母+短横线。


















