![](/img/trans.png)
[英]“Connection refused”, when trying to connect to DB from inside the Docker container
[英]Quarkus docker container failed to run / connect to the DB
在我的項目中,使用 Quarkus、Angular 和 PostgreSQL 數據庫,當我在開發模式下運行后端和前端時,我可以連接到數據庫(這是在 docker 容器中運行的 postgreSQL 映像)並在表中創建新行和只是工作正常。 當然 Quarkus docker 文件是自動生成的。 這是我輸入的“application.properties”文件(在 Quarkus 項目中):
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username= username
quarkus.datasource.password= pwd
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db-mcs-thirdparty
quarkus.flyway.migrate-at-start=true
quarkus.flyway.baseline-on-migrate=true
quarkus.flyway.out-of-order=false
quarkus.flyway.baseline-version=1
這是我放在后端文件夾(Quarkus)中的“docker-compose.yml”文件:
version: '3.8'
services:
db:
container_name: pg_container
image: postgres:latest
restart: always
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pwd
POSTGRES_DB: db-mcs-thirdparty
ports:
- "5432:5432"
pgadmin:
container_name: pgadmin4_container
image: dpage/pgadmin4
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: usernamepgadmin
PGADMIN_DEFAULT_PASSWORD: pwdpgadmin
ports:
- "5050:80"
但是當我構建一個 Quarkus docker 鏡像並嘗試在 docker 容器中運行它時,它失敗了!! 知道 Angular docker 容器運行良好,數據庫也是如此。 這是我在運行容器后得到的錯誤日志:
使用 /opt/jboss/container/java/run/run-java.sh 啟動 Java 應用程序 ...
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2022-05-06 12:58:31,967 WARN [io.agr.pool] (agroal-11) Datasource '<default>': The connection attempt failed.
2022-05-06 12:58:32,015 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.net.UnknownHostException: db
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:229)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at org.postgresql.core.PGStream.createSocket(PGStream.java:241)
at org.postgresql.core.PGStream.<init>(PGStream.java:98)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:109)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)
at org.postgresql.Driver.makeConnection(Driver.java:400)
at org.postgresql.Driver.connect(Driver.java:259)
at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:210)
at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:513)
at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:494)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at io.agroal.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:75)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1126)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
所以我在以下位置替換了“localhost”:
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db-mcs-thirdparty
使用 IP 地址,使用數據庫的名稱,甚至我嘗試在同一行中輸入用戶名和 psw 等....,但沒有用。
我什至停止了所有正在運行的容器(數據庫、前端)並嘗試只運行 Quarkus 容器,同樣的情況也發生了。 對於我使用的端口,您可以查看附件圖像。 使用的端口
應該如何解決這個問題? 先感謝您。
application.properties
文件中的localhost
url 是指容器自己的系統 localhost。 這意味着您的 quarkus 應用程序容器在其自己的本地端口上尋找該端口。
據我所知,每個 docker docker-container
和每個啟動docker-compose.yaml
創建自己的網絡,並且只有在這個網絡中,啟動的服務才能通過它們的服務名稱進行連接。
因此,您的 quarkus docker 容器必須連接到由 docker-compose 啟動的服務。 一種解決方案可能是在一個 docker-compose.yaml 中定義所有服務(數據庫、角度和后端),然后在您的 url 中引用服務名稱。
另一種解決方案可能是使用host.docker.internal
而不是localhost
。
可在此處說明有關 docker 網絡和host.docker.internal
的更多信息: https ://docs.docker.com/desktop/windows/networking/
您可以使用網絡模式主機 ( --network host
) 運行 Quarkus 容器,如下例所示:
$ docker run --rm -d --network host --name my_nginx nginx
https://docs.docker.com/network/network-tutorial-host/
你也可以像這個例子一樣將你的 Quarkus 添加到你的 docker-compose 中:
https://github.com/quarkusio/quarkus-quickstarts/blob/main/kafka-quickstart/docker-compose.yaml
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.