Docker搭建Django+uWSGI+nginx
整体框架
使用docker-compose
,将Django
、MySQL
与Nginx
分别使用不同的container
,当做Docker
学习的练习。
Django
pure_django_test
├── Dockerfile
├── fun
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── middlewares.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
├── pure_django_test
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── requirements.txt
├── start.sh
├── templates
│ └── hello.html
└── uwsgi.ini
首先是Dockerfile
的编写,放置于根目录下:
FROM python:3.6
WORKDIR /pure_django_test
COPY . /pure_django_test
RUN pip3 install -r requirements.txt
EXPOSE 8001
接着编写uwsgi.ini
:
[uwsgi]
http = :8001
chdir = %d
wsgi-file = %dpure_django_test/wsgi.py
py-autoreload = 1
可以使用
%d
表示当前目录,py-autoreload
可以使得当代码发生变化之后重启uWSGI
。
需要启动或者重启时进行数据库迁移以及启动uWSGI
,所以还需要一个start.sh
:
python manage.py makemigrations&&
python manage.py migrate&&
uwsgi --ini uwsgi.ini
Nginx
目录包括:
nginx
├── Dockerfile
└── nginx_app.conf
首先仍然是Dockerfile
的编写:
FROM nginx
EXPOSE 80 8001
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx_app.conf /etc/nginx/conf.d/
RUN mkdir -p /usr/share/nginx/html/static
接下来是nginx_app.conf
,替换掉默认的配置:
upstream django {
server web:8001;
}
server {
listen 80;
server_name localhost;
location /static {
alias /usr/share/nginx/html/static;
}
location / {
proxy_pass http://django;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在
upstream
中使用web
而不是localhost
,否则会出现502
错误。
docker-compose.yml
因为数据库直接由镜像构建而来,因此不需要写Dockerfile
,只需要在yaml
中指定一下:
version: "3"
services:
db:
image: mysql:5.7
environment:
- MYSQL_HOST=localhost
- MYSQL_DATABASE=pure_django
- MYSQL_USER=root
- MYSQL_PASSWORD=littlemay
- MYSQL_ROOT_PASSWORD=littlemay
volumes:
- ./data:/var/lib/mysql
restart: always
web:
build: ./pure_django_test
volumes:
- ./pure_django_test:/pure_django_test
command: bash start.sh
links:
- db
depends_on:
- db
restart: always
nginx:
build: ./nginx
ports:
- "80:80"
volumes:
- ./blog/static:/usr/share/nginx/html/static
links:
- web
depends_on:
- web
restart: always
此时还需要修改Django
中的settings.py
:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pure_django',
'USER': 'root',
'PASSWORD': 'littlemay',
'HOST': 'db',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
要记得在
db
中先创建数据库。
将文件挂载到本地,使用docker-compose up
之后,可以边修改边查看效果。