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
相关产品推荐
相关产品推荐

