我想要一个包含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)