无需Docker Compose,动态配置多域名Django与PostgreSQL Docker容器
解决方案
1. 用环境变量动态配置Django数据库连接
修改Django的settings.py,将数据库配置的关键参数改为从环境变量读取,彻底摆脱硬编码:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.getenv('DB_NAME', 'erp'), 'USER': os.getenv('DB_USER', 'erp_user'), 'PASSWORD': os.getenv('DB_PASSWORD', '123'), 'HOST': os.getenv('DB_HOST', 'localhost'), 'PORT': os.getenv('DB_PORT', '5432'), } }
2. 利用Docker网桥的容器名称解析
你已经搭建了自定义Docker网桥,同网桥内的容器可以直接通过容器名称互相访问(Docker内置DNS会自动解析容器名称到对应IP)。
创建租户容器时,只需给Django容器设置DB_HOST环境变量为对应PostgreSQL容器的名称:
- 比如创建
mycomp_web时,设置环境变量DB_HOST=mycomp_db - 创建
mycomp2_web时,设置DB_HOST=mycomp2_db
这样Django容器就能直接通过容器名称访问到对应的PostgreSQL容器,无需手动获取IP或端口。
3. 用模板化Docker Compose简化租户创建
为了批量、标准化创建租户容器,可以写一个Docker Compose模板,通过环境变量替换租户标识:
docker-compose.template.yml
version: '3.8' services: web: image: your-django-image:latest environment: - DB_HOST=${TENANT}_db - DB_NAME=erp - DB_USER=erp_user - DB_PASSWORD=123 networks: - your-custom-bridge # 其他配置:端口映射、卷挂载等 db: image: postgres:15-alpine environment: - POSTGRES_DB=erp - POSTGRES_USER=erp_user - POSTGRES_PASSWORD=123 volumes: - ${TENANT}_db_data:/var/lib/postgresql/data networks: - your-custom-bridge # 无需暴露端口给宿主机,同网桥内直接访问 volumes: ${TENANT}_db_data: networks: your-custom-bridge: external: true # 使用你已创建的自定义网桥
创建租户时,只需设置TENANT环境变量即可一键启动:
# 创建mycomp租户的容器 TENANT=mycomp docker-compose -f docker-compose.template.yml up -d # 创建mycomp2租户的容器 TENANT=mycomp2 docker-compose -f docker-compose.template.yml up -d
关键注意事项
- 确保所有租户的web和db容器都加入同一个自定义网桥,这样容器名称解析才会生效。
- Docker Compose会自动处理容器启动依赖(
web服务会等待db服务启动),无需额外配置。 - 生产环境中不要硬编码数据库密码,建议使用Docker Secrets或加密的.env文件传递敏感信息。
内容的提问来源于stack exchange,提问作者Evren Bingøl
相关产品推荐
相关产品推荐

