让 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。
我一直在使用 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。