KeyClope docker容器在启动期间抛出'java.net.UnknownHostException'

KeyClope docker容器在启动期间抛出'java.net.UnknownHostException',java,docker,keycloak,Java,Docker,Keycloak,我正试图在我的docker主机上设置KeyClope容器。不幸的是,KeyClope容器无法连接到我的db容器,并且总是抛出java.net.UnknownHostException 我的docker compose文件: version: '2' services: keycloak: image: quay.io/keycloak/keycloak:latest container_name: keycloak restart: always

我正试图在我的docker主机上设置KeyClope容器。不幸的是,KeyClope容器无法连接到我的db容器,并且总是抛出
java.net.UnknownHostException

我的
docker compose
文件:

version: '2' 

services:
  keycloak:
      image: quay.io/keycloak/keycloak:latest
      container_name: keycloak
      restart: always
      networks:
        - webgateway
        - keycloak-net
      environment:
        - DB_VENDOR=MYSQL
        - DB_ADDR=keycloak-db
        - DB_DATABASE=keycloak
        - DB_USER=keycloak
        - DB_PASSWORD=password
        - KEYCLOAK_USER=admin
        - KEYCLOAK_PASSWORD=password
      depends_on:
        - keycloak-db

  keycloak-db:
      image: mysql:5.7
      container_name: keycloak-db
      restart: always
      volumes:
        - /var/keycloak/database:/var/lib/mysql
      networks:
        - keycloak-net
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=keycloak
        - MYSQL_USER=keycloak
        - MYSQL_PASSWORD=password

networks:
  keycloak-net:
  webgateway:
    external:
      name: docker_webgateway
错误消息:

Caused by: java.net.UnknownHostException: keycloak-db: Name or service not known,
    at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method),
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929),
    at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515),
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848),
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505),
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364),
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298),
    at com.mysql.jdbc@8.0.19//com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:132),
    at com.mysql.jdbc@8.0.19//com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65),
    ... 64 more,
,
23:44:04,490 FATAL [org.keycloak.services] (ServerService Thread Pool -- 72) java.lang.RuntimeException: Failed to connect to database,
有人知道我做错了什么吗


另外,docker主机在本地运行,所以不要担心我的密码太弱。

标志
取决于
只确保容器启动的顺序,而不确保容器是否准备好为请求服务,这就是这里发生的事情,SQL容器已启动,但由于需要时间,尚未准备好接收请求。请按照以下命令和文件操作,我在docker compose中添加了
健康检查
,您需要将版本更改为
2.1或更高版本

创建外部docker网络

docker network create docker_webgateway
docker compose.yaml

      container_name: keycloak
      restart: always
      networks:
        - webgateway
        - keycloak-net
      environment:
        - DB_VENDOR=MYSQL
        - DB_ADDR=keycloak-db
        - DB_DATABASE=keycloak
        - DB_USER=keycloak
        - DB_PASSWORD=password
        - KEYCLOAK_USER=admin
        - KEYCLOAK_PASSWORD=password
      depends_on:
        - keycloak-db
  keycloak-db:
      image: mysql:5.7
      container_name: keycloak-db
      restart: always
      healthcheck:
          test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
          timeout: 20s
          retries: 10
      volumes:
        - /var/keycloak/database:/var/lib/mysql
      networks:
        - keycloak-net
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=keycloak
        - MYSQL_USER=keycloak
        - MYSQL_PASSWORD=password
networks:
  keycloak-net:
  webgateway:
    external:
      name: docker_webgateway
通过运行以下命令创建堆栈

docker-compose up

取决于
可能有点不可预测。最好将
keydape db
放在compose的第一位file@surfer190就这样。非常感谢。永远不要认为
所依赖的
并没有像我预期的那样工作。把你的评论作为答案发表,我会接受的。@surfer190,那不是真的。没关系,你放在哪里取决于你的答案。你能解释更多关于健康检查的内容吗?我无法使用高于2的版本。只有在版本2.1之后才启用健康检查。Healthchecks用于在服务开始接受任何请求之前检查服务是否准备好为您的请求提供服务请检查此项以供参考。我希望这能回答你的问题