【发布时间】: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