如何在 Docker 和 PostgreSQL 数据库中同时使用 Java?

How to use both Java in Docker and PostgreSQL database?

我正在开发 Heroku 玩具应用程序,想使用 PostgreSQL 数据库来存储配置。我要么在 Docker.

上看到有关如何使用 Java + PostgreSQL 或 Java 的教程

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

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

我查看了 Whosebug、教程和 Heroku 文档,但到目前为止,运气不好。

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

How can I connect to PostgreSQL from Java in Docker on Heroku?

相关文档可以在下面找到URL:

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

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

这符合 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 服务只是一个 dev/test 实例……鉴于 Heroku 中唯一打算成为 pushed/released 的图像是 app 图像……

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

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

指南:

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