如何使用java.sql包连接到Docker上的Postgres?

时间:2019-06-15 19:09:16

标签: java postgresql docker

如何使用java.sql.模块连接到PostgreSQL数据库(在Docker容器内部)?

我已经在运行Postgres并使用pgadmin在此配置下对其进行访问:

version: '3'

services:
  teste-postgres-compose:
    image: postgres
    environment:
      POSTGRES_PASSWORD: "Postgres2019!"
    ports:
      - "15432:5432"
    volumes:
      - /home/renatogroffe/Desenvolvimento/Docker-Compose/PostgreSQL:/var/lib/postgresql/data 
    networks:
      - postgres-compose-network

  teste-pgadmin-compose:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: "admin@admin.com.br"
      PGADMIN_DEFAULT_PASSWORD: "PgAdmin2019!"
    ports:
      - "16543:80"
    depends_on:
      - teste-postgres-compose
    networks:
      - postgres-compose-network

networks: 
  postgres-compose-network:
    driver: bridge

但是,如果我尝试通过Java应用程序进行连接,则会收到错误消息:

  

org.postgresql.util.PSQLException:连接尝试失败。

这是我要呼叫的连接:

try{
    Class.forName("org.postgresql.Driver");            
    connection = DriverManager.getConnection("jdbc:postgresql://teste-postgres-compose:15432/postgres", "postgres", "Postgres2019!");
} catch(ClassNotFoundException erro1){
    throw new RuntimeException(erro1);
} catch (SQLException erro2) {
    throw new RuntimeException(erro2);
}

return connection;

1 个答案:

答案 0 :(得分:2)

在您的配置中发现2种类型错误

services:
  teste-postgres-compose:
    image: postgres
    environment:
      POSTGRES_PASSWORD: "Postgres2019!"
    ports:
      - "15432:5432"
connection = DriverManager.getConnection("jdbc:postgresql://test-postgres-compose:5432/postgres", "postgres", "Postgres2019!");
  1. 您的服务的名称为teste-postgres-compose,但是您连接到test-postgres-compose
  2. - "15432:5432"您已暴露了端口15432,但已连接到5432

更新

对不起,我的错。当然,第二个容器是pgadmin,而不是您的应用程序。

teste-postgres-compose等容器的名称仅在postgres-compose-network网络中可用,并且同一网络中的其他容器也可以将其用作其他容器。应用程序是在本地启动的(我想您是从IDE启动的Java代码)可能只使用本地主机的公开端口。服务名称在网络外部不可用。

例如,您的postgres必须按地址提供:

  

localhost:15432

因为您已经在撰写文件中公开了此端口。另外,您也可以尝试环回127.0.0.1或您的主机IP地址。