[PYTHON] Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).

Einführung

Dies ist der erste Beitrag von Qiita. Wenn Sie etwas falsch finden, würde ich es begrüßen, wenn Sie ~ kommentieren könnten Teilweise geändert am 18.12.2019

Ich benutze Pycharm.

Verzeichnis

Das Verzeichnis sieht so aus

.
├── db
│   ├── data
│   └── sql
│       └── init.sql
├── docker-compose.yml
├── nginx
│   ├── conf
│   │   └── app_nginx.conf
│   ├── log
│   └── uwsgi_params
├── python
│   ├── Dockerfile
│   └── requirements.txt
├── src
│   └── project
│       ├── app
│       ├── project
│       └── manage.py
│       └── uwsgi.ini
└── static

Datenbank

Verwenden Sie MariaDB. Erstellen Sie einen Datenordner und die Datei init.sql für die Initialisierung im Datenbankverzeichnis.

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

FLUSH PRIVILEGES;

Wenn Sie auf github hochladen, geben Sie es in .gitigonre ein, damit das Passwort usw. nicht angezeigt wird.
Erstellen Sie keine Docker-Datei, sondern schreiben Sie sie in die Datei docker-compose.yml.

Nginx

Überspringen Sie statische Dateien wie Bilder zu nginx, einem Reverse-Proxy-Server.

app_nginx.conf

upstream django {
    ip_hash;
    server python: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
    }
}

Wenn Zugriff besteht, wird er zunächst an Port 8000 von nginx empfangen. Wenn Zugriff auf die statische statische Datei vorhanden ist, wird er an statische Datei von nginx übersprungen, bei der es sich um einen Reverse-Proxy-Server handelt, und die anderen werden an den Anwendungsserver (uWSGI) von Port 8001 übersprungen.

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;

params ist in Ordnung mit Kopie

python

Dockerfile/python


# The first instruction is what image we want to base our container on
# We Use an official Python runtime as a parent image
FROM python:3.8-alpine
# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONUNBUFFERED 1
ENV PYTHONIOENCODING utf-8
ENV APP_PATH  code
# Set the working directory to /code
WORKDIR /$APP_PATH
COPY ./requirements.txt /$APP_PATH
# Install any needed packages specified in requirements.txt
RUN apk add --no-cache --virtual .build-deps bash gcc musl-dev libffi-dev \
 g++ libgcc libstdc++ libxml2-dev libxslt-dev openssl-dev curl \
 && apk add --no-cache --virtual --update-cache\
 jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
 mariadb-dev mariadb-connector-c-dev \
 && pip install cython && pip install -U pip && pip install -r requirements.txt
 # Make alpine lighter
RUN rm -rf /var/cache/apk/* && \
    rm -rf /tmp/*

Häufige Installationsfehler abhängig von Zeilenumbrüchen und Trennzeichen, wenn apk add ausgeführt wird Da es funktioniert hat, ist die aktuelle Situation in Ordnung, also ...

Django==3.0
flake8==3.7.9
ipython==7.10.1
mysqlclient==1.4.6
Pillow==6.2.1
uWSGI==2.0.18

Ich werde auch flake8 einschließen, das den Code überprüft, und ipython, das einen leistungsstarken Interpreter für Python hat. Es gibt viele Treiber für die Datenbankverbindung, aber wir verwenden den offiziell empfohlenen mysqlclient. https://docs.djangoproject.com/ja/3.0/ref/databases/#mysql-db-api-drivers

docker-compose.yml


version: '3.4'
services:
  nginx:
    image: nginx:1.13
    container_name: app_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:
      - python
  db:  # the same name as 'host' in DATABASES setting, otherwise Django won't find the database
    image: mariadb:10.1
    container_name: app_mariadb
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: app
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: root
      TZ: 'Asia/Tokyo'
    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/sql:/docker-entrypoint-initdb.d
  python:
    build: ./python
    image: python_blog
    container_name: app_python
    command: uwsgi --ini /code/project/uwsgi.ini
    volumes:
      - ./src:/code
      - ./static:/static
    expose:
      - "8001"
    depends_on:
      - db 

Ordnen Sie die Datenbank des Dienstnamens der Datenbank des Hosts in den Datenbankeinstellungen von django settings.py zu.


Wenn du so weit gehst Wo docker-compose.yml ist

$ docker-compose up -d --build

Lassen Sie uns den Container starten. Nginx- und Python-Container werden nicht gestartet.


command: uwsgi --ini /code/project/uwsgi.ini

Da uwsgi.ini noch nicht existiert, erstellen Sie ein Django-Projekt und platzieren Sie es.

$ docker-compose run --rm python django-admin.py startproject project

Erstellen Sie ein Django-Projekt. Der Python-Teil ist der Dienstname von docker-compose.yml Wenn Sie --rm nicht hinzufügen, werden viele Python-Container erstellt. Löschen Sie sie daher bei jeder Ausführung.

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

Platzieren Sie uwsgi.ini

$ docker-compose down
$ docker-compose up -d
$ docker ps -a

Alle Container scheinen oben zu sein

$ docker exec -it app_python /bin/bash
$ cd ./project/
$ python manage.py startapp app

Die Python-Umgebung wird unter alpinem Linux erstellt, und Bash ist in alpine nicht enthalten, also / bin / sh oder / bin / ash. Diesmal habe ich Bash so Bash gesetzt Erstelle eine App für Django

Einstellungen in Django

settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app.apps.AppConfig',  #hinzufügen


#Veränderung
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'app',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'db',
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    }

#Ändern Sie nach Ihren Wünschen
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'


STATIC_ROOT = './../../../static/'  #Omoto für den Vertrieb für die Produktionsumgebung
STATIC_URL = '/static/'  #URL in der Produktionsumgebung verwendet

# Custom Useer
AUTH_USER_MODEL = 'app.User'

Laut dem Beamten habe ich vor der Migration vorerst einen benutzerdefinierten Benutzer erstellt. Erstellen Sie einen benutzerdefinierten Benutzer https://docs.djangoproject.com/ja/3.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project

models.py

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
	pass

admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .models import User

admin.site.register(User, UserAdmin)

Im Docker-Container

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser

http://localhost:8000/ Django sollte auf sein Wenn auf dem Server ein Fehler auftritt, versuchen Sie es erneut mit Docker-Compose

Erstellen Sie nach der Migration einen Benutzer für den Django-Administrator Greifen Sie auf http: // localhost: 8000 / admin / djangoadmin zu Da ich uwsgi benutze, funktioniert CSS nicht


$ python manage.py collectstatic

CSS funktioniert auch für Django Admin

Sie sollten sich jetzt entwickeln können. .. ..

Referenz

Python3.6 + NGINX + MariaDB10 + uWSGI Django Environment Greedy Set mit Docker-Compose

Recommended Posts

Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).
Erstellen Sie mit Docker eine Umgebung aus Nginx + uWSGI + Python (Django)
Aufbau einer Django-Entwicklungsumgebung mit Docker-Compose + Nginx + uWSGI + MariaDB (macOS Edition)
Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)
Erstellen Sie mit Docker eine Python + uWSGI + Nginx-Umgebung
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie mit Django einen Datei-Uploader
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen Sie mit Docker-Compose eine schnelle API-Umgebung
Ich habe eine Entwicklungsumgebung für Django 3.0 mit Docker, Docker-Compose und Poetry erstellt
[DynamoDB] [Docker] Erstellen Sie mit Docker-Compose eine Entwicklungsumgebung für DynamoDB und Django
Erstellen Sie mit pyenv unter Ubuntu 12.04 schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Erstellen Sie eine virtuelle Umgebung mit conda in Python
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Erstellen Sie mit IntelliJ schnell eine Python Django-Umgebung
Erstellen Sie einen Django-Zeitplan
Python-Umgebung mit Docker-Compose
Erstellen Sie eine Python-Umgebung
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Erstellen Sie mit venv unter Ubuntu 14.04 LTS schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Erstellen Sie eine virtuelle Umgebung mit Anaconda, die über Pyenv installiert ist
Erstellen Sie eine Python-Entwicklungsumgebung mit Vagrant + Ansible + Fabric
Code-Server-Online-Umgebung (2) Erstellen Sie mit Boto3 ein virtuelles Netzwerk
Starten Sie Django auf einem Docker-Container mit Docker-Compose Up
Erstellen Sie eine japanische OCR-Umgebung mit Anaconda (Tesseract + Pyocr).
Debuggen Sie die mit Docker-Compose mit VS-Code erstellte Django-Umgebung aus der Ferne
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
Erstellen einer Django-Umgebung für Win10 (mit virtuellem Speicherplatz)
Erstellen Sie mit Winsows 10 eine maschinelle Lernumgebung von Grund auf neu
Erstellen Sie eine Umgebung mit virtualenv
Minimale Konfigurations-Website-Umgebung mit Django
Erstellen Sie eine API mit Django
API mit Flask + uWSGI + Nginx
Erstellen Sie ein Verzeichnis mit Python
Versuchen Sie, Python in der mit pipenv erstellten Django-Umgebung auszuführen
[Memo] Erstellen Sie mit Docker eine Entwicklungsumgebung für Django + Nuxt.js
[Django] Erstellen Sie mit PyCharm schnell eine Entwicklungsumgebung für Django-Container (Docker)
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Stellen Sie die Django-Anwendung auf EC2 mit Nginx + Gunicorn + Supervisor bereit
Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Erstellen einer Kubernetes-Umgebung mit ansible 2
Erstellen Sie FastAPI + uvicorn + nginx mit Docker-Compose
Erstellen Sie eine Windows Python-Ausführungsumgebung mit VScode + Remote WSL
Schritte zum Erstellen eines Django-Projekts