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

By [kk](https://paragraph.com/@kk-24) · 2023-03-29

---

前言
--

部署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](http://xn--start-bi1hp52h0uau17bc55ba6514h.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`关闭这些服务。

---

*Originally published on [kk](https://paragraph.com/@kk-24/docker-compose-django-postgresql-redis-uwsgi-nginx)*
