Docker Compose连接到外部Postgres数据库

时间:2020-07-20 14:18:51

标签: java postgresql spring-boot docker

我有一个运行良好的SpringBoot应用程序。现在,我正在尝试对其进行Dockerise,但是在连接到数据库时遇到了一些问题。

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

application.properties

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数据库。

任何建议将不胜感激。

注意:数据库未在容器中运行,因为它们已由其他旧版应用程序使用。

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

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

3 个答案:

答案 0 :(得分:0)

尝试配置docker-compose文件以使用桥接网络:

version: '3.7'

services:
  product-service:
    build: ../nexct-approval-service
    volumes:
      - ../nexct-approval-service:/usr/src/app
    environment:
        POSTGRES_DB_PORT: "5432"
        POSTGRES_DB_HOST: "localhost"
        POSTGRES_PASSWORD:
        POSTGRES_USER: postgres
        POSTGRES_DB: pims
    networks:
        - product_service_network

networks:
    product_service_network:
        driver: bridge

如果要在产品服务容器中使用它们,还必须将ENVIRONMENT变量移至product-service

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

答案 1 :(得分:0)

version: '3.7'

services:
  product-service:
    build: ../nexct-approval-service
    volumes:
      - ../nexct-approval-service:/usr/src/app
    ports:
      - "8081:8081"
server.port=8081
# pims datasource
spring.datasource1.driver-class-name=org.postgresql.Driver
spring.datasource1.jdbc-url=jdbc:postgresql://<postgres_host_private_ip>: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://<postgres_host_private_ip>:5432/approval
spring.datasource2.username=postgres
spring.datasource2.password=

用托管postgres数据库的计算机的专用IP替换

我不确定您要使用嵌套的 db 服务要实现什么,但是由于您的数据库已经在外部运行,所以不需要这样做。

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

此外,您需要确保将postgres配置为接受来自“非本地主机”源的连接(请参见https://www.andrew-kirkpatrick.com/2017/05/allow-connection-postgresql-server-outside-localhost/)。

答案 2 :(得分:0)

要访问在ur Host上运行的应用程序,

  • 使用网桥网络。 (Doc
    • 创建网桥网络并分配子网地址和网关地址。
    • 现在您可以从<gateway address>:<port>(即172.28.0.1:<port>)的容器访问在主机上运行的应用程序
version: '3.7'

services:
  product-service:
    build: ../nexct-approval-service
    volumes:
      - ../nexct-approval-service:/usr/src/app
    ports:
      - "8081:8081"
    networks:
      hostnet: {}
           
networks:
  hostnet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16


  • 使用附加服务托管网络。 (Doc
    • network_mode: host添加到您的服务(仅适用于Linux)
    • 或创建一个外部网络
    • 现在,您可以通过localhost:<port>的容器访问在主机上运行的应用程序

使用network_mode:(Linux)

version: '3.7'

services:
 product-service:
   build: ../nexct-approval-service
   volumes:
     - ../nexct-approval-service:/usr/src/app
   ports:
     - "8081:8081"
   network_mode: host
相关问题