【问题标题】:How to use both Java in Docker and PostgreSQL database?如何在 Docker 和 PostgreSQL 数据库中同时使用 Java?
【发布时间】:2021-02-21 19:44:40
【问题描述】:

我正在开发 Heroku 玩具应用程序,并希望使用 PostgreSQL 数据库来存储配置。我要么看到有关如何在 Docker 上使用 Java + PostgreSQL 或 Java 的教程。

我找不到如何在 Docker + PostgreSQL 中使用 Java 的方法。

注意:数据库是一个相当不重要的部分。它可以是任何可以持久化信息的东西,例如 Redis、其他数据库。

我查看了 StackOverflow、教程和 Heroku 文档,但到目前为止,没有运气。

如何在 Heroku 上的 Docker 中从 Java 连接到 PostgreSQL?

【问题讨论】:

    标签: java postgresql docker heroku heroku-postgres


    【解决方案1】:

    如何在 Heroku 上的 Docker 中从 Java 连接到 PostgreSQL?

    相关文档可在以下网址找到:

    https://devcenter.heroku.com/articles/connecting-heroku-postgres#connecting-in-java

    综上所述,Heroku 提供了对 PostgreSQL 的原生支持(独立于 Docker),您的 Java 应用程序可以通过专用环境变量 DATABASE_URL(或 JDBC_DATABASE_URL)连接到数据库,该环境变量应导出为Docker 容器环境变量在您的情况下,部署您的应用程序通过 Heroku's Docker container registry.

    这符合 Docker 关于访问外部数据库的最佳实践,即 PostgreSQL 数据库不是应用容器的一部分,但应用容器与数据库通信通过 HTTP 请求。

    其他细节

    此外,如果您对 CI/CD 感兴趣,希望使用包含 PostgreSQL 数据库副本(或存根)的完整开发配置在本地全面测试您的应用,请注意,您可能有兴趣设计docker-compose.yml 配置,例如:

    version: '3'
    services:
      db:
        image: 'postgres:13'
        # cf. https://devcenter.heroku.com/articles/heroku-postgresql#version-support
        environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: TestPhasePassword
          POSTGRES_DB: mydb
        # The following is UNNEEDED for the app service to access the db.
        # Enable it ONLY IF YOU NEED TO ALSO ACCESS THE DB FROM THE HOST.
        # ports:
        #   - '5432:5432'
        networks:
          - db-net
        # The volume is useful to locally test the webapp data persistence,
        # after running "docker-compose down && docker-compose up --build".
        volumes:
          - postgres-data-dev:/var/lib/postgresql/data
      app:
        build: .
        # image: name-of-your-app  # optional
        environment:
          DATABASE_URL: 'postgres://postgres:TestPhasePassword@db:5432/mydb'
        ports:
          - '8080:8080'
        networks:
          - db-net
        depends_on:
          - db
    networks:
      db-net:
        driver: bridge
    volumes:
      postgres-data-dev:
        driver: local
    

    然后运行docker-compose up

    所以在这里,db 服务只是一个开发/测试实例……鉴于唯一打算在 Heroku 中推送/发布的图像是 app 图像……

    【讨论】:

      【解决方案2】:

      为了扩展@ErikMD 的答案,我必须补充一点,有许多用于不同数据库的插件可用于在 Java 应用程序中建立连接,并且无需在内部运行带有 DB 的 Docker,而是依赖插件供应商。

      我尝试了 MySQL、PostgreSQL,但从未遇到过 DB 问题。如果您使用插件解决方案,请检查它们的定价模型和限制,以避免陷入计费问题。此外,一些插件提供了较旧的数据库,您可能需要花费更多精力来解析正确的库版本。

      指南:

      • 选择数据库插件
      • 运行heroku config -a <app_name>获取数据库凭据
      • 将它们放入application.propertiesapplication.yml
      • 瞧,你已连接到 DB

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2011-12-18
        • 2017-12-09
        • 2022-01-23
        相关资源
        最近更新 更多