Docker-compose部署Django+PostgreSQL+Redis+uWSGI+Nginx

前言

部署Python Web项目时,通常会使用uWSGI+Nginx或者Gunicorn+Nginx,需要开发者同时安装这些软件,做一系列的配置,费时费力,而容器技术如今已经非常火热,开发者可以使用Docker容器来部署Web应用,达到和本地开发一样的环境。

准备工作

1.准备一个Django项目,通过python manage.py runserver 0.0.0.0:8000可以运行起来 2.项目设置中配置PostgreSQL数据库信息 代码如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres', # 数据库名称 使用docker默认的
        'USER': 'postgres', # 使用docker默认的用户名
        'HOST': 'db',
        'PORT': 5432
    }
}

3.设置配置Redis的信息。 代码如下:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://redis:6379',  # redis(容器的地址)
        'OPTIONS': {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            'SOCKET_TIMEOUT': 10,
        },
    },
}

准备DockerFile

在项目目录下新建DockerFile

FROM python:3.7
MAINTAINER liyuankun 705555262@qq.com
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir /learntime
WORKDIR /learntime

ADD . /learntime/
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi

配置docker-compose

version: '3'
services:
  redis:
    image: redis
    command: redis-server
    volumes:
    - ./deployment/redis:/data
    ports:
    - 6379:6379
    restart: always

  web:
    build: .
    expose:
      - 8000
    volumes:
      - .:/learntime
      - /tmp/logs:/tmp
    command: bash start.sh
    links:
      - redis
    depends_on:
      - redis
    restart: always

  nginx:
    build: deployment/nginx
    ports:
    - 80:80
    expose:
      - 8000
    volumes:
    - ./staticfiles:/usr/share/nginx/html/static
    - ./learntime/media:/usr/share/nginx/html/media
    - ./deployment/nginx/ssl:/usr/share/nginx/ssl
    links:
      - web
    depends_on:
      - web
    restart: always

配置启动命令

项目目录下新建start.sh

#!/bin/bash
python manage.py collectstatic --noinput&& #收集静态文件
python manage.py makemigrations&& # 迁移数据库文件
python manage.py migrate&& # 迁移数据库
python manage.py createsuperuser&& # 生成超级用户
uwsgi -i ./uwsgi.ini # 启动uWSGI

配置Nginx

在项目目录下新建deployment文件夹 mkdir -p /deployment/nginx 在该目录下新建DockerFile和nginx.conf文件

DockerFile文件如下:

FROM nginx

# 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/nginx/conf.d/default.conf \
&& mkdir -p /usr/share/nginx/html/static \
&& mkdir -p /usr/share/nginx/html/media \
&& mkdir -p /usr/share/nginx/ssl

# 添加配置文件
ADD ./nginx.conf /etc/nginx/conf.d/

nginx.conf文件如下:

# 仅用于本地docker环境测试(80端口代理http请求)
server {
    listen 80; # 监听80端口
    server_name  127.0.0.1;  # 生产环境请换成域名
    charset utf-8;
    access_log /var/log/nginx/nginx-uwsgi.log;
    error_log /var/log/nginx/nginx-error.log;
    location / {
        proxy_pass http://web:8000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        alias /usr/share/nginx/html/static/; #静态资源路径
    }
    location /media/ {
        alias /usr/share/nginx/html/media/; #上传文件路径
    }
}

部署

将所有项目文件上传到服务器中,来到项目目录下 执行docker-compose up --build 若没有错误则部署成功,成功后可以执行docker-compose up -d来后台运行这些容器,执行docker-compose down关闭这些服务。