You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django微服务应用Docker Compose配置咨询(含PostgreSQL/Redis/Nginx)

容器化改造完整配置方案

一、先修改现有配置的适配点

1. 所有Django服务的run.sh调整

原来的gunicorn绑定127.0.0.1只能容器内部访问,其他容器无法连通,需要改成绑定0.0.0.0,同时建议加数据库等待、迁移逻辑,示例:

#!/bin/bash
# 可选:等待数据库启动,需要先在Dockerfile里安装netcat:RUN apt update && apt install -y netcat
# while ! nc -z $POSTGRES_HOST 5432; do sleep 1; done

python manage.py migrate --settings=main_server.settings.development --noinput
python manage.py collectstatic --settings=main_server.settings.development --noinput
exec gunicorn --bind 0.0.0.0:5001 --workers 5 --threads 5 --timeout 15 main_server.wsgi

注意:每个微服务对应端口要和自身Dockerfile暴露的端口一致

2. Django配置调整

  • 数据库配置的HOST直接读取环境变量即可,后面docker-compose会传入对应服务名
  • Redis配置的host改为redis,和docker-compose里的Redis服务名保持一致:
SESSION_REDIS = {
    'host': 'redis',
    'port': 6379,
    'db': 1,
    'password': '41zipudu',
    'prefix': 'session',
    'socket_timeout': 1,
    'retry_on_timeout': True
}

3. Nginx配置调整

把本地的Nginx配置文件修改如下,保存为项目根目录下的nginx.conf:

server {
        listen 80;
        server_name 134.111.111.22;

        location = /favicon.ico { access_log off; log_not_found off;  }
        location /static/ {
                # 对应后面nginx容器挂载的静态文件路径
                root /usr/src/main_server;
        }

        location / {
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_connect_timeout   45;
                proxy_send_timeout      45;
                proxy_read_timeout      45;
                client_max_body_size    15m;
                # 用docker-compose里的主服务名作为地址
                proxy_pass http://main_server:5001;
        }
}

二、完整docker-compose.yml配置

version: "3.8"

# 全局卷,持久化数据库、Redis数据
volumes:
  user_db_data:
  app_db_data:
  redis_data:
  static_volume: # 共享主服务静态文件给Nginx

services:
  # 第一个PostgreSQL库:用户库
  user_db:
    image: postgres:14-alpine # 用alpine版本体积更小
    volumes:
      - user_db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=users # 和你Django里的数据库名一致
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=XXXXXX # 和你Django里的数据库密码一致
    restart: always
    # 不需要对外暴露端口,只有内部服务访问即可

  # 第二个PostgreSQL库:业务库
  app_db:
    image: postgres:14-alpine
    volumes:
      - app_db_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=app_db # 改成你实际的业务库名
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=XXXXXX # 改成你实际的业务库密码
    restart: always

  # Redis服务
  redis:
    image: redis:7-alpine
    command: redis-server --requirepass 41zipudu # 和你Redis配置的密码一致
    volumes:
      - redis_data:/data
    restart: always

  # 主服务
  main_server:
    build:
      context: .
      dockerfile: main_server/main_server/Dockerfile
    volumes:
      - static_volume:/usr/src/main_server/static # 把静态文件挂载到全局卷
    environment:
      - POSTGRES_HOST=user_db # 传入数据库服务名
    depends_on:
      - user_db
      - redis
    restart: always
    # 不需要对外暴露端口,由Nginx转发即可

  # 用户服务示例,其他微服务配置逻辑相同,根据自身依赖调整
  user_service:
    build:
      context: .
      dockerfile: user_service/user_service/Dockerfile
    environment:
      - POSTGRES_HOST=user_db # 对应该服务使用的数据库服务名
    depends_on:
      - user_db
      - redis
    restart: always

  session_service:
    build:
      context: .
      dockerfile: session_service/session_service/Dockerfile
    environment:
      - POSTGRES_HOST=app_db # 假设会话服务用业务库,根据实际调整
    depends_on:
      - app_db
      - redis
    restart: always

  apartment_service:
    build:
      context: .
      dockerfile: apartment_service/apartment_service/Dockerfile
    environment:
      - POSTGRES_HOST=app_db
    depends_on:
      - app_db
    restart: always

  bill_service:
    build:
      context: .
      dockerfile: utility_bill/utility_bill_service/Dockerfile
    environment:
      - POSTGRES_HOST=app_db
    depends_on:
      - app_db
    restart: always

  mail_service:
    build:
      context: .
      dockerfile: mail_service/mail_service/Dockerfile
    environment:
      - POSTGRES_HOST=app_db
    depends_on:
      - app_db
    restart: always

  # Nginx反向代理服务
  nginx:
    image: nginx:1.25-alpine
    ports:
      - 80:80 # 宿主机80端口映射到容器80端口
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf # 挂载本地配置文件
      - static_volume:/usr/src/main_server/static # 挂载主服务的静态文件卷
    depends_on:
      - main_server
    restart: always

三、启动命令

第一次启动可以加--build参数强制重新构建镜像:

docker-compose up -d --build

查看日志可以用:

docker-compose logs -f [服务名]

内容的提问来源于stack exchange,提问作者Slobjo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:51:01