使用Docker-compose + Django + MySQL + Nginx + uwsgi进行环境的初始设置

总结

    • 表題を利用した環境を作る必要があったので、メモします。

 

    合わせて日本語化など

环境

    • Docker + Docker-compose が利用できること。

 

    • Python3.6

 

    Django3.1(最新)

步骤

目录结构

    下記構成でディレクトリとファイルを作成します。
./WORKDIR
    |--- docker-compose.yml   # Docker-compose本体
    |---.gitignore            # git対象外用(今回は作るだ、gitを使うときに利用する)
    |---nginx
         |---nginx.conf       # nginxの設定ファイル
         |---uwsgi_params     # uwsgi用パラメータ
    |---django
         |---Dockerfile       # Dockerfile
         |---requirements.txt # pipでインストールするリスト
         |---.env             # django用の環境変数
    |---mysql
         |---.env             # mysql用の環境変数
    |---sql
         |---init.sql         # DB起動時(初回のみ)に流すスクリプト

创建和编辑文件

    docker-compose.yml
version: '3'

services:
  nginx:
    image: nginx:1.13
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
      - ./static:/static
    depends_on:
      - django

  mysql:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - "3306:3306"
    env_file:
      - ./mysql/.env
    volumes:
      - ./mysql:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d

  django:
    build: ./django
    command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logto /tmp/mylog.log
    volumes:
      - ./src:/code
      - ./static:/static
    expose:
      - "8001"
    env_file:
      - ./django/.env
    depends_on:
      - mysql
    .gitignore
django/.env
mysql/*
src/app/__pycache__/*
static/*
    django/Dockerfile
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code/
    django/requirements.txt
Django
uwsgi
PyMySQL
    django/.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=db
MYSQL_USER=db-user
MYSQL_PASSWORD=password
    nginx/nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    upstream django_8001 {
        ip_hash;
        server django:8001;
    }

    server {
        listen      8000;
        server_name 127.0.0.1;
        charset     utf-8;

        location /static {
            alias /static;
        }

        location / {
            uwsgi_pass  django_8001;
            include     /etc/nginx/uwsgi_params;
        }
    }
    server_tokens off;
}
    nginx/uwsgi_params
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;
    mysql/.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=db
MYSQL_USER=db-user
MYSQL_PASSWORD=password
TZ='Asia/Tokyo'
    sql/init.sql
GRANT ALL PRIVILEGES ON db.* TO 'user'@'%';

FLUSH PRIVILEGES;

创建项目

    下記コマンドを実行する。
$ docker-compose run django django-admin startproject app .
    下記が作成される。
./WORKDIR
    |--- docker-compose.yml
    |---.gitignore
    |---nginx
         |---nginx.conf
         |---uwsgi_params
    |---django
         |---Dockerfile
         |---requirements.txt
         |---.env
    |---src
         |---app
              |---__init.py__  # pythonであることの意味(編集しない)
              |---asgi.py      # 利用しない
              |---settings.py  # django本体の設定ファイル
              |---urls.py      # URL処理をする
              |---wsgi.py      # wsgiファイル
              |---manage.py    # 管理用コマンド
    |---mysql
         |---.env
         |--- ~~              # 複数作成されるが編集しないため割愛
    |---sql
         |---init.sql
    |---static
         |--- ~~              # 画像ファイルなどはこちらに配置

编辑配置文件

src/app/settings.pyを編集する

#### 追加
import os
import pymysql
STATIC_ROOT = '/static'
pymysql.install_as_MySQLdb()

#### 修正
ALLOWED_HOSTS = ['*']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('MYSQL_DATABASE'),
        'USER': os.environ.get('MYSQL_USER'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
        'HOST': 'mysql',
        'PORT': '3306',
    }
}
TEMPLATES = [
    {
    ....
        'DIRS': [os.path.join(BASE_DIR, 'templates')],          ## ここを修正
    ....
]
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

启动容器

    下記コマンドを実行する。
$ docker-compose up -d

其他工作

    DBのマイグレーション
$ docker-compose exec django ./manage.py makemigrations
$ docker-compose exec django ./manage.py migrate

* 管理者アカウントの作成
    * 入力を求められるのでメッセージ従い入力

使用docker-compose执行django的命令”./manage.py createsuperuser”。


* CSSを反映する

$ docker-compose 的执行命令可以是 docker-compose exec django ./manage.py collectstatic。

确认

    • 下記へアクセスできる。

http://:8000
http://:8000/admin

请你参考一下。

Django+Nginx+MySQLの開発環境をDockerで構築する

自分用に修正しただけでほぼお世話になってます。

bannerAds