我有一个托管在服务器上的Web应用程序,它使用virtualEnv来分隔dev和prod实例。两个实例共享相同的postgres数据库。 (全部在同一台服务器上)
我是docker的新手,我想用docker容器替换dev和prod实例,以及每个链接到dev或prod postgres容器(或类似的效果,以便开发中的代码更改不会影响生产数据库。)
这种情况的最佳设计是什么?我应该将dev和prod容器映射到不同的端口吗?我可以为dev和prod容器提供1个dockerfile吗?我该如何处理2个postgres容器?
答案 0 :(得分:1)
似乎你的要求不是很复杂,所以我认为你可以运行2对容器(每对有一个应用容器和一个postgres容器)来实现这个,基本结构描述如下:
devContainer---> pgsDBContainer:<port_number1> ---> dataVolume1
prodContainer---> pgsDBContainer:<port_number2> ---> dataVolume2
每个容器对都有一个专用端口号和一个专用卷。用于dev或prod应用程序的端口号连接到相应的postgres数据库,应该很容易理解。但音量是另一个故事。
请阅读此Manage data in containers doc了解容器容量。正如你提到"a code change in development will not affect production database"
,这意味着你应该有两个独立的postgres容器卷,所以数据库的数据不会混淆。
我可以为dev和prod容器都有1个dockerfile吗?
是的,就像我提到的那样,当你使用docker run命令启动它们时,你应该为每个postgres容器提供不同的端口和卷配置。 docker run有EXPOSE选项和VOLUME选项供您配置端口号和卷位置。
提醒一下,当您在容器中运行数据库时,可能需要考虑容器环境中的Data Persistent以避免因删除容器而导致的数据丢失。可以找到关于容器数据持久性的一些讨论here和there。