Java Docker Compose连接到外部Postgres数据库

Java Docker Compose连接到外部Postgres数据库,java,postgresql,spring-boot,docker,Java,Postgresql,Spring Boot,Docker,我有一个SpringBoot应用程序,它工作得非常好。现在我正在尝试对接它,但是在连接到数据库时出现了一些问题 该应用程序有两个数据源: @Configuration @ComponentScan(basePackages = "com.nexct") public class MultipleDBConfig { @Bean(name = "datasource1") @ConfigurationProperties("spr

我有一个SpringBoot应用程序,它工作得非常好。现在我正在尝试对接它,但是在连接到数据库时出现了一些问题

该应用程序有两个数据源:

@Configuration
@ComponentScan(basePackages = "com.nexct")
public class MultipleDBConfig {

    @Bean(name = "datasource1")
    @ConfigurationProperties("spring.datasource1")
    @Primary
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "datasource2")
    @ConfigurationProperties("spring.datasource2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }
}
应用程序属性

server.port= 8081
# pims datasource
spring.datasource1.driver-class-name=org.postgresql.Driver
spring.datasource1.jdbc-url=jdbc:postgresql://localhost:5432/pims
spring.datasource1.username=postgres
spring.datasource1.password=
spring.jpa.database-platform=postgres
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
# approval datasource
spring.datasource2.driver-class-name=org.postgresql.Driver
spring.datasource2.jdbc-url=jdbc:postgresql://localhost:5432/approval
spring.datasource2.username=postgres
spring.datasource2.password=
在应用程序中,我使用Spring访问两个数据源:

@Configuration
@ComponentScan(basePackages = "com.nexct")
public class MultipleDBConfig {

    @Bean(name = "datasource1")
    @ConfigurationProperties("spring.datasource1")
    @Primary
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "datasource2")
    @ConfigurationProperties("spring.datasource2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }
}
因此,我创建了:

Dockerfile

FROM openjdk:14
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} nexct-approval-service.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","/nexct-approval-service.jar"]
docker compose.yml

version: '3.7'

services:
  product-service:
    build: ../nexct-approval-service
    volumes:
      - ../nexct-approval-service:/usr/src/app
    ports:
      - "8081:8081"
    db:
      image: postgres
      environment:
        POSTGRES_DB_PORT: "5432"
        POSTGRES_DB_HOST: "localhost"
        POSTGRES_PASSWORD:
        POSTGRES_USER: postgres
        POSTGRES_DB: pims
但是,我不知道如何配置这两个Postgres数据库

如有任何建议,将不胜感激

注意:数据库不是在容器中运行的,因为它们被其他遗留应用程序使用

如果我从
docker compose.yml
中删除
db
。当我运行
docker compose up
时,Spring启动应用程序启动,我可以访问RESTful服务。但是,我得到以下错误:

PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

尝试将docker compose文件配置为使用桥接网络:

版本:“3.7”
服务:
产品服务:
生成:../NEXT批准服务
卷数:
-../NEXTT审批服务:/usr/src/app
环境:
POSTGRES_DB_端口:“5432”
POSTGRES_DB_主机:“本地主机”
POSTGRES_密码:
POSTGRES\u用户:POSTGRES
博士后数据库:pims
网络:
-产品服务网络
网络:
产品、服务和网络:
司机:驾驶台
如果要在产品服务容器中使用
环境
变量,还必须将其移动到
产品服务

如果
localhost
不起作用,请改用
127.0.0.1

版本:“3.7”
服务:
产品服务:
生成:../NEXT批准服务
卷数:
-../NEXTT审批服务:/usr/src/app
端口:
- "8081:8081"
server.port=8081
#pims数据源
spring.datasource1.driver类名=org.postgresql.driver
spring.datasource1.jdbcurl=jdbc:postgresql://:5432/pims
spring.datasource1.username=postgres
spring.datasource1.password=
spring.jpa.database platform=postgres
#spring.jpa.properties.hibernate.dialogue=org.hibernate.dialogue.PostgreSqlDialogue
spring.jpa.show sql=false
#批准数据源
spring.datasource2.driver类名=org.postgresql.driver
spring.datasource2.jdbc url=jdbc:postgresql://:5432/approval
spring.datasource2.username=postgres
spring.datasource2.password=
替换为承载postgres数据库的计算机的专用IP

我不确定您试图通过嵌套db服务实现什么,但由于您的数据库已经在外部某处运行,因此不需要这样做

由于docker隔离,您的Spring应用程序将在与主机隔离的网络上运行(除非明确要求在网络模式下使用主机网络:“主机”)。知道“localhost”不能在容器内工作,您需要使用托管数据库的机器的真实IP。很可能是192.168.xxx.xxx


此外,您需要确保postgres配置为接受来自“非本地主机”源的连接(请参阅)。

要访问在您的主机上运行的应用程序,几乎没有选项

  • 使用网桥网络。()
    • 创建网桥网络并分配子网地址和网关地址
    • 现在,您可以从位于
      的容器(即
      172.28.0.1:
版本:“3.7”
服务:
产品服务:
生成:../NEXT批准服务
卷数:
-../NEXTT审批服务:/usr/src/app
端口:
- "8081:8081"
网络:
主机:{}
网络:
主机网络:
司机:驾驶台
ipam:
配置:
-子网:172.28.0.0/16
  • 使用“将服务连接到主机网络”。()
    • 网络\u模式:主机
      添加到您的服务中(仅适用于Linux)
    • 或者创建一个外部网络
    • 现在,您可以从
      localhost:
使用网络模式:(Linux)

版本:“3.7”
服务:
产品服务:
生成:../NEXT批准服务
卷数:
-../NEXTT审批服务:/usr/src/app
端口:
- "8081:8081"
网络模式:主机

您是否尝试过使用127.0.0.1而不是localhost?您好@DominikK,谢谢您的回复。我不知道如何编写yml文件,以便Spring可以访问数据源,例如
@ConfigurationProperties(“Spring.datasource1”)
只是为了澄清一下,postgres dbs与容器运行在同一主机上,对吗?如果是这样,您需要在docker compose文件中指定网络,将驱动程序设置为桥接。是的,应用程序和数据库将在同一台主机上运行,这就是为什么我将其称为
localhost
。SpringBoot应用程序正在Docker容器中运行,但这两个数据库没有运行(它们是其他应用程序使用的旧数据库)。如果数据库在主机上运行,请尝试将
网络模式:“主机”
添加到
产品服务
定义中,并完全删除
db
部分。我不知道当你说你在你的主机上运行时,你为什么添加了
db
部分。我如何配置第二个数据库?如何让spring连接到数据库?
错误:组合文件“/docker Compose.yml”无效,因为:services.product-service的配置选项不受支持:“db”
如果您使用的是桥接网络,您可以通过本地主机和各自的端口号访问这两个数据库。如果我运行它,就会出现上述错误。如果我按照您的建议删除
db
并添加
network
部分,那么它构建时不会出错。但是,当我访问该应用程序时,它会出现以下错误:
PSQLException:与localhost的连接被拒绝:5432。检查主机名和端口是否正确