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.
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
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
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. .. ..
Python3.6 + NGINX + MariaDB10 + uWSGI Django Environment Greedy Set mit Docker-Compose
Recommended Posts