让 docker 个容器相互通信

Getting docker containers to communicate with each other

我一直在使用 quarkus 服务器 运行ning 在我的机器上开发一个开发项目。我在 docker 容器上有一个 keycloak 和 postgres 实例 运行ning。当前设置是我有一个用于 keycloak 和 postgres 的 docker-compose 文件和来自 CLI 的 运行 quarkus。所有 3 个进程都可以相互通信。

我现在想要将我的 quarkus 应用程序打包到一个 docker 容器中,并将其与 postgres 和 keycloak 一起托管在云端。问题是我很难让应用程序与数据库和密钥斗篷进行通信,我只能假设这是一个 docker 网络问题....

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

  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", "sudo pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - whole_network

networks:
  whole_network:
    driver: bridge

application.properties

quarkus.http.test-port=8888
quarkus.resteasy.path=/api/v1
quarkus.http.cors=true

quarkus.oidc.auth-server-url=http://keycloak:8180/auth/realms/realm
quarkus.oidc.client-id=candledata
quarkus.oidc.application-type=SERVICE
quarkus.http.auth.permission.authenticated.paths=/*
quarkus.http.auth.permission.authenticated.policy=authenticated

quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.url=jdbc:postgresql://postgres_db:5432/name?sslmode=disable
quarkus.datasource.username=admin
quarkus.datasource.password=password
quarkus.liquibase.migrate-at-start=true
quarkus.liquibase.change-log=db/changelog/db.changelog-master.xml
quarkus.hibernate-orm.database.generation=drop-and-create

在 app.props 文件中,我最初的 url 为 localhost,但当我将 quarkus 应用程序放入容器时将它们更改为容器名称。

Dockerfile 只是所有 quarkus 项目附带的标准文件。但是我用来构建图像和 运行 容器的命令是;

mvn package -DskipTests=true
docker build -f src/main/docker/Dockerfile.jvm -t backend .
docker run -i --rm -p 8888:8888 --network=cd_whole_network backend

当我 运行 我得到以下输出;

exec java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -XX:+ExitOnOutOfMemoryError -cp . -jar /deployments/app.jar
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-09-29 07:32:13,750 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.net.ConnectException: Connection refused
    at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:777)
    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:829)

谷歌搜索具体内容对我没有多大用处。我假设一个网络上的所有 3 个容器,它们将能够相互通信,但事实并非如此。任何关于此的 help/advice 将不胜感激

您在应用程序配置中为 keycloak 使用了错误的端口。
你有这样的配置:

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

但是,在您的 docker-compose 文件中,对于 keycloak 服务,您有这个

ports:
      - "8180:8080"

这意味着您可以从主机 8180 端口和容器[=[=] 端口 8080 访问 keycloak 24=]。当您使用 docker 网络访问您的服务时,您应该使用端口 8080 访问 keycloak。