【问题标题】:Separate Dev and Production instances and database分离开发和生产实例和数据库
【发布时间】:2026-02-05 17:45:01
【问题描述】:

我有一个托管在服务器上的 Web 应用程序,它使用 virtualEnv 来分隔 dev 和 prod 实例。两个实例共享同一个 postgres 数据库。 (都在同一台服务器上)

我是 docker 的新手,我想用 docker 容器替换 dev 和 prod 实例,并且每个链接都指向其 dev 或 prod postgres 容器(或类似的效果,以便开发中的代码更改不会影响生产数据库。)

这个场景的最佳设计是什么?我应该将 dev 和 prod 容器映射到不同的端口吗?我可以为 dev 和 prod 容器提供 1 个 dockerfile 吗?如何处理 2 个 postgres 容器?

【问题讨论】:

    标签: postgresql docker docker-compose dockerfile


    【解决方案1】:

    看来你的要求不是很复杂,所以我认为你可以运行2对容器(每对有一个应用程序容器和一个postgres容器)来实现这一点,基本结构描述如下:

    devContainer---> pgsDBContainer:<port_number1> ---> dataVolume1
    
    prodContainer---> pgsDBContainer:<port_number2> ---> dataVolume2
    

    每个容器对都有一个专用端口号和一个专用卷。 dev 或 prod 应用程序连接到对应的 postgres 数据库的端口号,应该很容易理解。但数量是另一回事。

    请阅读此Manage data in containers 文档以了解容器容量。正如你提到的"a code change in development will not affect production database",这意味着你应该有两个独立的卷用于postgres容器,这样数据库的数据就不会混淆。

    我可以为 dev 和 prod 容器提供 1 个 dockerfile 吗?

    是的,正如我所提到的,当您使用docker run 命令启动每个 postgres 容器时,您应该为它们提供不同的端口和卷配置。 docker runEXPOSE 选项和VOLUME 选项供您配置端口号和卷位置。

    提醒一下,当您在容器中运行数据库时,您可能需要考虑容器环境中的数据持久性,以避免因容器移除而导致数据丢失。一些关于容器数据持久化的讨论可以在herethere找到。

    【讨论】: