【问题标题】:How to deploy Spring app in docker container?如何在 docker 容器中部署 Spring 应用程序?
【发布时间】:2020-01-13 12:09:16
【问题描述】:

我对 Docker-compose 有疑问。在我的机器上,我有一个 Ubuntu。而且,当我将应用程序部署到容器中时,我看到了该异常:

        at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:307) ~[liquibase-core-3.6.3.jar!/:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837) ~[spring-beans-5.1.6.RELEASE.jar!/:5.1.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774) ~[spring-beans-5.1.6.RELEASE.jar!/:5.1.6.RELEASE]
        ... 26 common frames omitted
Caused by: org.postgresql.util.PSQLException: Connection to 0.0.0.0:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:280) ~[postgresql-42.2.5.jar!/:42.2.5]
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.5.jar!/:42.2.5]
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195) ~[postgresql-42.2.5.jar!/:42.2.5]
        at org.postgresql.Driver.makeConnection(Driver.java:454) ~[postgresql-42.2.5.jar!/:42.2.5]
        at org.postgresql.Driver.connect(Driver.java:256) ~[postgresql-42.2.5.jar!/:42.2.5]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-3.2.0.jar!/:na]
        at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:302) ~[liquibase-core-3.6.3.jar!/:na]
        ... 28 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:240) ~[na:na]
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[na:na]
        at java.base/java.net.Socket.connect(Socket.java:591) ~[na:na]
        at org.postgresql.core.PGStream.<init>(PGStream.java:70) ~[postgresql-42.2.5.jar!/:42.2.5]
        at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:91) ~[postgresql-42.2.5.jar!/:42.2.5]
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192) ~[postgresql-42.2.5.jar!/:42.2.5]
        ... 40 common frames omitted

我有PostgreSQL的配置:


# "local" is for Unix domain socket connections only
local   all         all                               trust

# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         100.200.300.50/32       trust

那个选项设置“listen_addresses = 'localhost'”;

Docker-compose 配置:

version: '3'
services:

  web:
service
    image: webserviceimage
    ports:
      - 8080:8080 
    depends_on:
      - db 
      - redis
    environment:
      POSTGRES_URL:
      POSTGRES_USER:
      POSTGRES_PASSWORD:

  redis:
    image: "redis:alpine"
    restart: unless-stopped
    environment:
      REDIS_URL: redis:6379
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD:
      POSTGRES_USER:

我该如何解决?

【问题讨论】:

  • 您缺少应用程序访问数据库容器的配置:0.0.0.0 是“无处不在”的特殊 IPv4 地址,它不是出站连接的正常地址。相反,如果您将数据库容器配置为只接受来自localhost 的连接,那么它就不能接受来自其他容器的连接;切换回默认配置。
  • 我需要在“listen_addresses = '*”上切换“listen_addresses = 'localhost'”;然后我将添加所有 0.0.0.0/32 信任,我是对的吗?

标签: java spring postgresql docker docker-compose


【解决方案1】:

步骤:1 创建 Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

步骤:2 运行命令创建 docker 文件

docker build -t webapp:latest -f Dockerfile .

步骤:3 将 docker 镜像添加到 docker-compose 中

version: '3'
services:
  web:
service
    image: webapp:latest
    ports:
      - 8080:8080 
    depends_on:
      - db 
      - redis
    environment:
      POSTGRES_URL:
      POSTGRES_USER:
      POSTGRES_PASSWORD:

  redis:
    image: "redis:alpine"
    restart: unless-stopped
    environment:
      REDIS_URL: redis:6379
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD:
      POSTGRES_USER:

注意事项: web 应用环境变量用户进入 application.properties 文件之类的

spring.datasource.url = ${POSTGRES_URL}:${POSTGRES_PORT}/"nameofDB"

【讨论】:

    【解决方案2】:

    确保您已将 Postgres 配置为侦听所有可用的 IP 地址。配置文件postgresql.conf(一般位于/var/lib/postgresql/data/postgresql.conf)必须有:

    listen_addresses = '*'
    

    (这是默认配置)。更多here

    文件pg_hba.conf 包含基于主机的身份验证的配置。发布的配置意味着来自具有已定义掩码或 unix 套接字的 IP 的连接是可信的(不需要身份验证)。除非您有特定的安全要求,否则您不必更改此文件。默认情况下,远程客户端必须提供一个 MD5 加密的密码进行身份验证:

    host all all all md5
    

    更多信息请见The pg_hba.conf File

    cmets中的建议是在spring boot应用程序的配置中更改数据库的URL。从日志中,应用程序尝试连接到不是有效出站地址的0.0.0.0(请参阅here)。 将应用程序属性中的 URL 更改为如下内容:

    spring.datasource.url=jdbc:postgresql://db:5432/<database_name>
    spring.datasource.username=<database_user>
    spring.datasource.password=<password>
    

    db 是数据库容器的名称,service 容器可以将其解析为正确的数据库 IP 地址。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 2016-10-06
      • 2023-03-15
      • 2018-11-07
      • 2017-02-19
      • 1970-01-01
      • 2022-01-23
      • 2018-03-16
      相关资源
      最近更新 更多