首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker: Springboot容器无法连接到PostgreSql容器连接错误

Docker: Springboot容器无法连接到PostgreSql容器连接错误
EN

Stack Overflow用户
提问于 2018-11-22 10:38:36
回答 4查看 11.4K关注 0票数 6

我正在构建我的第一个Springboot 2.0应用程序。我正在尝试将我的Springboot应用程序放到一个对接器容器中,将我的PostgresDB放到另一个容器中。

我的Dockerfile

代码语言:javascript
复制
    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    ADD springboot-api-demo-0.1*.jar app.jar
    RUN sh -c 'touch /app.jar'
    EXPOSE 9443
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/urandom -jar /app.jar" ]

我的码头-Compose.yml文件

代码语言:javascript
复制
version: "2.1"

services:
  springboot-api-demo:
    image: "fw/springboot-api-demo"
    mem_limit: 1024m
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - AWS_REGION=local
      - ENVIRONMENT=local
      - AUTH_ENABLED=false
  postgres:
    container_name: pgdb
    image: postgres:9.6-alpine
    environment:
    - 'POSTGRES_ROOT_PASSWORD=postgres'
    - 'POSTGRES_USER=postgres'
    - 'POSTGRES_PASSWORD=postgres'
    ports:
    - "54321:5432"

我在我的application.properties中使用Springboot JPAData2.0和下面的配置数据

代码语言:javascript
复制
spring.datasource.url= jdbc:postgresql://localhost:54321/java_learning
spring.datasource.username=postgres
spring.datasource.password=postgres

我可以测试这两个图像是否都亮了。另外,从docker日志和docker事件中,我看到postgres容器运行良好,甚至可以访问它,也可以创建一个DB。但是springboot容器启动了,但是我死了,因为它无法连接到后置并在下面抛出错误。

无法从数据库获得连接:连接尝试失败

请注意,我的主机在端口5432上已经有Postgres,这就是为什么在postgres容器上执行54321:5432端口映射的原因。这是证据:) -

代码语言:javascript
复制
➜  springboot-api-demo git:(master) ✗ lsof -i:54321              
COMMAND     PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 44345 shailendra.singh   18u  IPv4 0xf62897fbdd69e31d      0t0  TCP *:54321 (LISTEN)
com.docke 44345 shailendra.singh   21u  IPv6 0xf62897fbdd119975      0t0  TCP localhost:54321 (LISTEN)

➜  springboot-api-demo git:(master) ✗ lsof -i:5432 
COMMAND  PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
postgres 715 shailendra.singh    5u  IPv6 0xf62897fbb43e03b5      0t0  TCP localhost:postgresql (LISTEN)
postgres 715 shailendra.singh    6u  IPv4 0xf62897fbbaeea9bd      0t0  TCP localhost:postgresql (LISTEN)

我不知道问题出在哪里。但是,我的Springboot应用程序无法连接postgres容器,后者运行良好,并具有适当的Cread便器。

EN

回答 4

Stack Overflow用户

发布于 2018-11-22 10:52:12

试着:

代码语言:javascript
复制
spring.datasource.url= jdbc:postgresql://pgdb:5432/java_learning

postgres数据库不是在localhost上运行的,而是运行在另一个具有其他IP (还不知道)的容器中。

谢天谢地,docker自动创建一个在docker-come.yml中的所有容器之间共享的网络(除非明确地说不是这样),因此您可以神奇地使用服务名称作为主机名

另外,端口中有一个错误,默认情况下,Postgres使用5432,而不是54321

票数 7
EN

Stack Overflow用户

发布于 2018-11-22 11:04:23

您将您的应用程序指向localhost,但这不是容器之间共享的。

要访问另一个容器,您必须参考它的hostname

您应该使用以下datasource url:

代码语言:javascript
复制
spring.datasource.url=jdbc:postgresql://pgdb:5432/java_learning

请参阅有关从另一个容器连接容器的简单教程:https://docs.docker.com/compose/gettingstarted/

票数 4
EN

Stack Overflow用户

发布于 2018-12-12 04:46:28

您缺少docker-compose.yml规范中的网络配置。通过使用“网络”,您可以通过容器的服务名称(使用dns,服务名称作为主机名)有效地在容器之间进行通信。

下面是更新的docker-compose.yml

代码语言:javascript
复制
version: "2.1"

services:
  springboot-api-demo:
    image: "fw/springboot-api-demo"
    mem_limit: 1024m
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - AWS_REGION=local
      - ENVIRONMENT=local
      - AUTH_ENABLED=false
    networks:
      - mynet

  postgres:
    container_name: pgdb
    image: postgres:9.6-alpine
    environment:
    - 'POSTGRES_ROOT_PASSWORD=postgres'
    - 'POSTGRES_USER=postgres'
    - 'POSTGRES_PASSWORD=postgres'
    ports:
    - "54321:5432"
    networks:
    - mynet

networks:
  mynet:
    driver: bridge

您的数据库url应该类似于spring.datasource.url=jdbc:postgresql://postgres:5432/java_learning (请注意主机名postgres等于服务名称的名称)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53429062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档