You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器间连接问题:Java应用容器无法连接MySQL容器

解决Docker Compose中Java应用连接MySQL容器的问题

兄弟,我看了你贴的Docker Compose配置,核心问题出在Java应用的DB_HOST配置上——你用了本地主机名Imrans-MacBook-Pro.local,但在Docker Compose创建的内部网络里,容器之间是通过服务名称来互相访问的,而不是宿主机的主机名。

给你修正后的完整配置,我补全了MySQL必要的环境变量,同时调整了DB_HOST:

version: "3"
services:
  app:
    build:
      context: ./
      dockerfile: /src/main/docker/Dockerfile
    image: app1
    environment:
      - DB_HOST=mysql  # 这里改成MySQL服务的名称,Docker会自动解析
      - DB_PORT=3306
    ports:
      - 8080:8080
    networks:
      - backend
    depends_on:
      - mysql
    # 可选:如果Java应用启动快,MySQL还没就绪,可以加健康检查等待
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"] # 根据你的应用健康端点调整
      interval: 10s
      timeout: 5s
      retries: 5

  mysql:
    image: mysql:5.7.20
    hostname: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=your_root_password  # 必须设置,MySQL镜像要求
      - MYSQL_DATABASE=your_app_db  # 提前创建你的应用需要的数据库
      - MYSQL_USER=app_user  # 可选:创建专门的应用用户
      - MYSQL_PASSWORD=app_password
    networks:
      - backend
    # 可选:如果需要外部访问MySQL,加上端口映射
    # ports:
    #   - 3306:3306
    volumes:
      - mysql_data:/var/lib/mysql  # 持久化MySQL数据,避免容器重启数据丢失

networks:
  backend:
    driver: bridge

volumes:
  mysql_data:

还要注意几个关键点:

  • depends_on只保证MySQL容器先启动,但不保证MySQL服务完全就绪(比如初始化完成)。如果你的Java应用启动时直接连接,可能会因为MySQL还没准备好失败。建议在Java应用里加数据库连接重试逻辑,或者用Docker的健康检查来让应用等待MySQL就绪。
  • 确保你的Java应用的数据库配置里,用户名、密码、数据库名和Docker Compose里MySQL的环境变量完全一致。
  • 两个服务都要加入同一个backend网络,这样才能互相通信(你的配置里已经加了,这点没问题)。

内容的提问来源于stack exchange,提问作者Imran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:06:58