Docker搭建Django+uWSGI+nginx

整体框架

使用docker-compose,将DjangoMySQLNginx分别使用不同的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之后,可以边修改边查看效果。

posted @ 2020-10-25 16:07  yuyinzi  阅读(285)  评论(0编辑  收藏  举报