如何在Docker容器中部署Spring应用程序?

时间:2019-09-11 15:49:07

标签: java spring postgresql docker docker-compose

我对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:

我该如何解决?

2 个答案:

答案 0 :(得分:0)

步骤: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”

答案 1 :(得分:0)

确保已将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

在注释中建议的是在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地址。

希望有帮助