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

Docker容器间通信问题排查:Quarkus应用容器无法连接Keycloak与PostgreSQL容器

解决Quarkus容器无法连接Keycloak与PostgreSQL的问题

你的连接拒绝问题主要源于两个常见的Docker容器通信误区,下面一步步帮你排查和解决:

1. 修正Keycloak的访问端口(核心错误)

你在application.properties里配置的Keycloak地址是:

quarkus.oidc.auth-server-url=http://keycloak:8180/auth/realms/realm

这里犯了一个关键错误:容器之间通信要使用容器内部的端口,而非主机映射的端口。

你的Docker Compose中Keycloak的端口映射是8180:8080,意思是把主机的8180端口转发到容器内部的8080端口。但Quarkus和Keycloak在同一Docker网络内时,应该直接访问Keycloak容器的内部端口8080,而不是主机的8180。

把配置改成:

quarkus.oidc.auth-server-url=http://keycloak:8080/auth/realms/realm

2. 推荐将Quarkus纳入Docker Compose统一管理

手动启动Quarkus容器时,即使指定了网络,也容易出现服务启动顺序混乱(比如Quarkus先启动,而Keycloak/PostgreSQL还没就绪)、网络名称匹配错误等问题。把Quarkus加入docker-compose.yml,让Docker Compose自动处理网络和依赖,稳定性会大幅提升:

修改后的完整docker-compose.yml:

version: "3.3"
services:
  keycloak:
    image: jboss/keycloak:13.0.1
    environment:
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: password
      DB_VENDOR: postgres
      DB_ADDR: postgres_db
      DB_DATABASE: name
      DB_SCHEMA: keycloak
      DB_USER: admin
      DB_PASSWORD: password
      KEYCLOAK_IMPORT: /tmp/keycloak-realm.json
    volumes:
      - ./keycloak-realm.json:/tmp/keycloak-realm.json
    depends_on:
      - postgres_db
    ports:
      - "8180:8080"
    networks:
      - whole_network
    # 添加健康检查,确保Keycloak完全就绪后再启动Quarkus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/auth/realms/realm"]
      interval: 10s
      timeout: 5s
      retries: 10

  postgres_db:
    build: postgres/.
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: admin
      POSTGRES_DB: name
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin"] # 容器内无需sudo,直接用指定用户检查
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - whole_network

  quarkus-backend:
    image: backend:latest # 用你构建的Quarkus镜像名
    ports:
      - "8888:8888"
    depends_on:
      postgres_db:
        condition: service_healthy
      keycloak:
        condition: service_healthy
    networks:
      - whole_network
    # 可选:在这里覆盖配置,避免修改镜像内的application.properties
    environment:
      QUARKUS_OIDC_AUTH_SERVER_URL: http://keycloak:8080/auth/realms/realm
      QUARKUS_DATASOURCE_JDBC_URL: jdbc:postgresql://postgres_db:5432/name?sslmode=disable

networks:
  whole_network:
    driver: bridge

3. 重新构建并启动服务

  1. 先重新构建Quarkus镜像(确保已修正Keycloak端口配置):
mvn package -DskipTests=true
docker build -f src/main/docker/Dockerfile.jvm -t backend .
  1. 用Docker Compose启动所有服务:
docker-compose up -d

额外排查步骤(如果问题仍存在)

  • 检查网络归属:运行docker network inspect 你的网络名(比如项目目录是cd的话,网络名是cd_whole_network),确认三个容器都在同一网络内
  • 容器内连通性测试:进入Quarkus容器,尝试ping Keycloak和PostgreSQL
docker exec -it 你的Quarkus容器名 sh
ping keycloak
ping postgres_db

如果ping不通是网络问题;如果ping通但连接拒绝,再检查服务端口和启动状态

  • 查看服务日志:确认Keycloak和PostgreSQL是否正常启动
docker-compose logs keycloak
docker-compose logs postgres_db

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:09:07