我想要一个包含Python3.6+NGINX+MariaDB10+uWSGI的Django环境的完美设置,使用Docker-Compose

可以在Docker-compose中使用的Django环境

我在环境建设过程中仔细观察了周围的情况,但由于文章过时等原因,花了数小时的时间。

    • nginx

 

    • mariadb10

 

    • python3.6

 

    uWSGI

uWSGI可以很好地支持自动重新加载。
事实上,这就是我想要做的,花了一些时间。

解释较少

参考页面有很多。

让我们创建一个Dockerfile吧。

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install mysqlclient
RUN pip install -r requirements.txt
ADD . /code/

Python3从这里开始引入。容器内的应用程序目录是/code。

创建一个必需品清单

Django
uwsgi
PyMySQL

虽然没有指定版本,但我真的认为最好还是指定一个。

我们来创建一个docker-compose.yml文件。

version: '3.4'

volumes:
  django.db.volume:
    name: django.db.volume

services:
  nginx:
    image: nginx:1.13
    container_name: django.nginx
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
      - ./static:/static
      - ./nginx/log:/var/log/nginx
    depends_on:
      - web

  db:
    image: mariadb:10
    container_name: django.db
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
    volumes:
      - django.db.volume:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d

  web:
    build: ./web
    container_name: django.web
    command: uwsgi --ini /code/sugoi_site/django.ini
    volumes:
      - ./src:/code
      - ./static:/static
    expose:
      - "8001"
    depends_on:
      - db

我只需要一种选择,以下是对原文的汉语同义表达:

创建配置文件以完成NGINX和MariaDB的初始设置。
请确保NGINX还支持日志输出。

我会创建NGINX的配置文件。

# the upstream component nginx needs to connect to
upstream django {
    ip_hash;
    server web:8001;
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8000;
    # the domain name it will serve for
    server_name 127.0.0.1; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    location /static {    
        alias /static; 
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
    }
}

仅需要一个选项,请将以下内容以中文进行再表述:
关于uWSGI的配置。

我要创建一个用于uWSGI和NGINX的协作配置文件。

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

这就是俗称的那个所谓的咒语。
脑死复制粘贴。

我要创建SQL的初始设置文件。

CREATE DATABASE IF NOT EXISTS sugoi_site CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'sugoi_site'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON sugoi_site.* TO 'sugoi_site'@'%';

FLUSH PRIVILEGES;

建立数据库并创建用户的那个东西。
因为它是用于本地开发环境,所以它相对不稳定,知道吧?

我会先创建必要的目录。

可以使用mkdir命令来创建,也可以右键点击新建文件夹进行创建。

./src文件夹中存放了Django项目。

./static文件夹中存放了静态文件。

创建Django 项目

docker-compose run web django-admin.py startproject sugoi_site .

完成项目后,为uWSGI创建配置文件。

将uWSGI的ini文件放置在Django项目目录中。

[uwsgi]
socket = :8001
module = sugoi_site.wsgi
wsgi-file = /code/sugoi_site/wsgi.py
logto = /code/sugoi_site/uwsgi.log
py-autoreload = 1

在logto中添加日志输出功能。

如果是在开发环境中的话,可以使用py-autoreload的自动重载功能。当有请求经过1秒后,它会自动重新加载。可以随时更改秒数。

docker-compose.yml文件中,web的command字段对应如下:
command: uwsgi –ini /code/sugoi_site/django.ini

Django的设置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sugoi_site',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    }
}

我虽然是以root的身份访问,但并不在意,因为创建用户太麻烦了。

STATIC_ROOT = '/static'
STATIC_URL = '/static/'

当添加此设置后,静态文件将被加载。

迁徙

docker-compose run web ./manage.py makemigrations
docker-compose run web ./manage.py migrate

成功後,可以完美地访问数据库!

为了使uWSGI读取配置文件,再次启动。

docker-compose down
docker-compose up -d 

先下线然后再上线

docker-compose ps

如果数据库、网络和nginx均处于运行状态,则一切正常。

访问127.0.0.1:8000

如果出现了Django安装完成的画面,那就表示成功了。
让我们看一下uWSGI的日志。

Python auto-reloader enabled
[pid: 6|app: 0|req: 1/1] 172.19.0.1 () {44 vars in 859 bytes} [Sat Sep  1 13:46:52 2018] GET / => generated 12 bytes in 34 msecs (HTTP/1.1 200) 3 headers in 108 bytes (1 switches on core 0)

只要在浏览器中按下F5几次,如果出现类似这样的行,就表示自动重新加载了。

只要将源代码全文复制粘贴使用,应该能够在当前版本中正常运行(2018/09/01)。

请参考

使用Docker创建Django的开发环境(快速入门:Compose和Django的MySQL版本)
使用Docker-Compose创建Django开发环境(Django + MySQL + uWSGI + Nginx)

广告
将在 10 秒后关闭
bannerAds