Erstellen Sie mit Docker eine Umgebung aus Nginx + uWSGI + Python (Django)

Dieser Artikel ist der 16. Tagesartikel von Web Crew Adventskalender 2019. Gestern war @ Hideto-Kiyoshima-wcs Scalas Option / Entweder / Super-Einführung versuchen.

Einführung

Mein Name ist @yagiyuuuu und es ist 2 Jahre her, seit ich als neuer Absolvent zu Web Crew Co., Ltd. kam. Derzeit entwickle ich eine Anwendungsumgebung von Nginx + uWSGI + Python (Django), indem ich sie mit Docker erstelle. Ich habe diesen Artikel in der Hoffnung geschrieben, dass er Menschen hilft, die Apps mit Django entwickeln.

Installieren Sie Docker für Windows

Öffnen Sie das Bedienfeld. Stellen Sie sicher, dass "Programme und Funktionen" -> "Windows-Funktionen ein- oder ausschalten" -> "Hyper-V" aktiviert ist. Wenn es nicht aktiviert ist, überprüfen Sie es und starten Sie den PC neu, um es zu aktivieren. Installieren Sie als Nächstes "Docker Desktop für Windows". Sie können es von hier aus installieren (https://docs.docker.com/docker-for-windows/install/).

Aufbau einer Umgebung für Django

Verzeichnisaufbau

Führen Sie unten die Django-App mit der Konfiguration aus. image.png

Schaffung einer Infrastruktur

Installieren Sie Python + uWSGI, Nginx auf Alpine.

Erstellen Sie docker-compose.yml

Erstellen Sie einen Container für Nginx und Python + uWSGI. Dieses Mal wird das Protokoll unter django-sample ausgegeben, aber bitte stellen Sie es so ein, dass es das Protokoll ausspuckt, wo immer Sie möchten.

django-sample/docker-compose.yml


version: '2'
services:
  nginx:
    build: "./Infrastructure/nginx/"
    volumes:
      - ./logs/nginx:/var/log/nginx
    ports:
      - "80:80"
    networks:
      django-sample-network:
        ipv4_address: 172.23.0.4
  python:
    build: "./Infrastructure/python/"
    volumes:
      - ./Application/django-sample:/home/work/django-sample
      - ./logs/django:/home/work/django
      - ./logs/uwsgi:/home/work/uwsgi
    ports:
      - "8000:8000"
    networks:
      django-sample-network:
        ipv4_address: 172.23.0.5
networks:
  django-sample-network:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.23.0.0/24

Erstellen Sie eine Docker-Datei

Nginx

django-sample/Infrastructure/nginx/Dockerfile


FROM nginx:1.13.1-alpine
COPY work/nginx.conf /etc/nginx
RUN apk --no-cache add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata
CMD ["nginx", "-g", "daemon off;"]

uWSGI

django-sample/Infrastructure/python/Dockerfile


FROM python:3.7
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

RUN mkdir /home/work
RUN mkdir /home/work/django
RUN mkdir /home/work/uwsgi
COPY work/ /home/work
WORKDIR /home/work
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

CMD ["uwsgi", "--ini", "/home/work/uwsgi.ini"]

Nginx-Einstellungen

django-sample/Infrastructure/nginx/work/nginx.conf


worker_processes auto;
error_log /var/log/nginx/error_app.log;
events {
    worker_connections 1024;
}
http {
    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_app.log  main;
    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   120;
    proxy_read_timeout  120;
    proxy_send_timeout  120;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    server {
        listen       80 default_server;
        server_name  _;

        fastcgi_read_timeout 60s;

        client_max_body_size 1m;

        location ~ ^/app/ {
            add_header Cache-Control no-cache;
            include uwsgi_params;
            uwsgi_pass 172.23.0.5:8000;
            uwsgi_read_timeout 60s;
        }
    }
}

uWSGI + Django-Einstellungen

django-sample/Infrastructure/python/work/uwsgi.ini


[uwsgi]
chdir=/home/work/django-sample
module=django-sample.wsgi
master=True
vacuum=True
max-requests=5000
socket=:8000
py-autoreload=1
logto=/home/work/uwsgi/django-app.log
buffer-size=10240
log-format=%(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size)`` "%(referer)" "%(uagent)"

django-sample/Infrastructure/python/work/requirements.txt


django==2.2
uwsgi==2.0.17.1

Beschreiben Sie das Modul, das Sie installieren möchten, in "require.txt".

Erstellen Sie eine .env-Datei

django-sample/.env


COMPOSE_FILE=docker-compose.yml

Anwendungserstellung

Da wir uns hier darauf konzentrieren, Apps zu erstellen, Weitere Informationen zur Django-App finden Sie auf der offiziellen Website. Schreiben Sie auch keinen Code in __init __. Py und __pycache__, sondern erstellen Sie sie. Wenn es nicht erstellt wird, funktioniert die App nicht.

Projekterstellung

django-sample/Application/django-sample/manage.py


#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django-sample.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

django-sample/Application/django-sample/django-sample/settings.py


"""
Django settings for django-sample project.
Generated by 'django-admin startproject' using Django 2.0.3.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""

import os
import json
import traceback

#Geben Sie den Handler an, der für die Protokollausgabe verwendet wird
LOG_HANDLER = ["app"]

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'ekf!&30u3&idt-qr3250(t+j#%@(vyxr02c-7fj!a81$!)#q=('

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

#Legen Sie die IP und die Domäne des Servers fest, der die Verbindung zulässt
#Lokaler Host, wenn nichts festgelegt ist(localhost)Nur möglich von zu verbinden
ALLOWED_HOSTS = ["localhost"]

# Application definition
#"App" hinzugefügt. Wenn Sie dies nicht hinzufügen, werden die in Vorlagen-Tags definierten benutzerdefinierten Tags nicht erkannt.
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
]

ROOT_URLCONF = 'django-sample.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'django-sample.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'

#TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/
STATIC_URL = ''

LOGGING = {
    'version': 1,
    'formatters': {
        'app': {
            'format': '%(asctime)s [%(levelname)s] %(pathname)s:%(lineno)d %(message)s'
        }
    },
    'handlers': {
        'app': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/home/work/django/app.log',
            'formatter': 'app',
            'when': 'D',        #Einheit D ist Tag
            'interval': 1,      #Geben Sie alle paar Tage an
            'backupCount': 30,  #Anzahl der Backup-Generationen
        }
    },
    'loggers': {
        'django': {
            'handlers': ['app'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.server': {
            'handlers': ['app'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'app': {
            'handlers': LOG_HANDLER,
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

#Einstellungen der Session Engine
#Verwenden Sie eine Sitzung mit Cookies
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

#Ablaufdatum des Anmeldestatus (Sekunden)
#Sie können angemeldet bleiben, bis das hier angegebene Ablaufdatum (Sekunden) überschritten wird.
#Das Ablaufdatum der Sitzung selbst ist SESSION_COOKIE_AGE
# 8h * 60m * 60s
LOGIN_LIMIT = 28800

#Sitzungslebensdauer(Sekunden)
#Wenn Sie die Gültigkeitsdauer der Sitzung für jeden Benutzer ändern möchten, fordern Sie an.session.set_expiry(value)Verwenden
SESSION_COOKIE_AGE = 1800

django-sample/Application/django-sample/django-sample/urls.py


"""django-sample URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.urls import path, include

urlpatterns = [
    path('app/', include("app.urls")),
]

django-sample/Application/django-sample/django-sample/wsgi.py



"""
WSGI config for django-sample project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django-sample.settings")

application = get_wsgi_application()

App-Erstellung

django sample Erstellen Sie eine App in Ihrem Projekt.

django-sample/Application/django-sample/app/urls.py



from django.urls import path

from app.views.login import view as login_view

urlpatterns = [
    path("", login_view.top, name="login_top")
]

django-sample/Application/django-sample/app/views/login/view.py


from django.http import HttpResponse
from django.http.request import HttpRequest
from django.template import loader


def top(request: HttpRequest):
    template = loader.get_template("login/index.html")
    return HttpResponse(template.render({}, request))

Erstellen einer Vorlage zur Anzeige auf dem Bildschirm

django-sample/Application/django-sample/templates/login/index.html


Hello Django!!

Starten Sie den Container

Geben Sie den folgenden Befehl in die Hierarchie ein, in der sich "docker-compose.yml" befindet

Erstellen und starten Sie den Container

$ docker-compose up --build -d

Kann im Hintergrund durch Hinzufügen von -d gestartet werden

Überprüfen Sie den Behälter

$ docker-compose ps

Löschen Sie den Container

$ docker-compose down

Greifen Sie auf die erstellte App zu

Gehen Sie nach dem Starten des Containers zu http: // localhost / app / "Hallo Django !!" wird angezeigt

Am Ende

Bitte erstellen Sie Ihre eigene Umgebung, wenn Sie Django-Apps erstellen! !!

Der Artikel von morgen ist @ yuko-tsutsui. Vielen Dank.

Recommended Posts

Erstellen Sie mit Docker eine Umgebung aus Nginx + uWSGI + Python (Django)
Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Bereiten Sie die Python3-Umgebung mit Docker vor
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Erstellen Sie mit Docker eine Django-Entwicklungsumgebung! (Docker-compose / Django / postgreSQL / nginx)
Erstellen Sie mit VSCode & Docker Desktop eine einfache Python-Entwicklungsumgebung
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Erstellen Sie mit Docker eine Jupyter Lab (Python) -Umgebung
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Aufbau des Python-Ausführungsservers (Python + uWSGI + Django + Nginx)
Starten Sie die Umgebung mit LineBot + Heroku + Docker + Python
Erstellen Sie mit Docker eine Umgebung aus NGINX + NGINX Unit + MySQL
Django 1.11 wurde mit Python3.6 gestartet
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Konvertieren der Django-Umgebung in Docker (Docker + Django + Gunicorn + Nginx) Teil 2
Nicht blockierend mit Python + uWSGI
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Hallo Welt mit Nginx + Uwsgi + Python auf EC2
Verwenden Sie Python mit Docker
Python-Umgebung mit Docker-Compose
Erstellen Sie eine Python-Umgebung
WebSocket mit Python + uWSGI
Erstellen Sie mit IntelliJ schnell eine Python Django-Umgebung
Erstellen Sie mit pyenv unter Ubuntu 12.04 schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Virtuelle Umgebung mit Python 3.6
[Docker] Erstellen Sie in 3 Minuten eine jupyterLab (Python) -Umgebung!
Konvertieren der Django-Umgebung in Docker (Docker + Django + Gunicorn + Nginx) Teil 3
Konstruktionsvorlage für die lokale Python-Entwicklungsumgebung [Flask / Django / Jupyter mit Docker + VS-Code]
Aufbau einer virtuellen Umgebung mit Docker + Flask (Python) + Jupyter-Notebook
Um Japanisch mit Python in der Docker-Umgebung verwenden zu können
Erstellen Sie eine Python-Entwicklungsumgebung mit Vagrant + Ansible + Fabric
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Stellen Sie eine vorhandene App mit Docker + Pyenv-Virtualenv + Uwsgi + Django bereit
Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Ein Memo zum Erstellen einer Django (Python) -Anwendung mit Docker
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
Mach Django mit CodeStar (Python3.6.8, Django2.2.9)
Erstellen Sie eine Umgebung mit virtualenv
Minimale Konfigurations-Website-Umgebung mit Django
Installieren Sie die Python-Umgebung mit Anaconda
Erstellen Sie eine API mit Django
Verwalten Sie die Python-Umgebung mit virtualenv
Erstellen Sie mit venv unter Ubuntu 14.04 LTS schnell eine Ausführungsumgebung für Python3.4 + Nginx + uWSGI + Flask-Webanwendungen
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Erstellen Sie ein 3D-GIF mit Python3
API mit Flask + uWSGI + Nginx
Python3 + Django ~ Mac ~ mit Apache
ToDo-Listenerstellung [Python Django]
Erste Schritte mit Python Django (1)
Erstellen Sie eine Homepage mit Django
Erste Schritte mit Python Django (4)