【问题标题】:Getting docker containers to communicate with each other让 docker 容器相互通信
【发布时间】:2021-11-21 02:59:16
【问题描述】:

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

我现在想将我的 quarkus 应用程序打包到一个 docker 容器中,并将它与 postgres 和 keycloak 一起托管在云上。问题是我很难让应用程序与 db 和 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$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.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 个容器都可以相互通信,但事实并非如此。对此的任何帮助/建议将不胜感激

【问题讨论】:

  • 嗯,我认为你混合了两个概念,容器端口和主机端口检查 docker 网络指南,docs.docker.com/compose/networking,容器在同一网络中使用容器端口(8080)相互访问,以防万一您的 keycloak 服务而不是主机端口 (8180),它用于向本地主机公开访问权限,如果您在同一网络中运行 quarkus,则使用 8080,而不是,删除网络配置并将所有内容指向主机端口
  • @Javier Toja,你是个天才!!我欠你一杯啤酒:)

标签: docker quarkus docker-networking


【解决方案1】:

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

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

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

ports:
      - "8180:8080"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2020-06-10
    • 2015-11-01
    • 2017-01-28
    • 1970-01-01
    • 2021-11-23
    • 2022-11-10
    相关资源
    最近更新 更多