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. 重新构建并启动服务
- 先重新构建Quarkus镜像(确保已修正Keycloak端口配置):
mvn package -DskipTests=true docker build -f src/main/docker/Dockerfile.jvm -t backend .
- 用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
相关产品推荐
相关产品推荐

