[PYTHON] (Fall) Django (DRF) + uWSGI + Nginx + MySQL docker-compose.yml Beispiel

Annahme

Haupt Dateien

version: '3.7'
services:
  app:
    container_name: sample-app
    image: sample-app
    build:
      context: ..
      dockerfile: ./docker/python/Dockerfile
    environment:
      DB_HOST: sample-db
      DB_PORT: 3306
    volumes:
      - sock:/var/run/uwsgi
      - static:/var/www/app/sample/static
      - ./log/python:/var/log/python
    depends_on:
      - db
    networks: 
      - sample
  server:
    container_name: sample-server
    image: nginx:1.17.3-alpine
    ports:
      - 8000:80
    volumes:
      - sock:/var/run/uwsgi
      - static:/var/www/app/sample/static
      - ./log/nginx:/var/log/nginx
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d:/etc/nginx/conf-sample.d
    networks:
      - sample
  db:
    container_name: sample-db
    image: mysql:8.0.17
    ports:
      - 3316:3306
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=sample
      - TZ=Asia/Tokyo
    volumes:
      - data:/var/lib/mysql
      - ./mysql/conf.d/custom.cnf:/etc/mysql/conf.d/custom.cnf
    networks:
      - sample
volumes:
  data:
    driver: local
  sock:
    driver: local
  static:
    driver: local
networks:
  sample:

FROM python:3.7.4-alpine3.9

RUN apk add --update --no-cache \
      build-base \
      linux-headers \
      pcre pcre-dev \
      libffi-dev \
      openssl-dev \
      mariadb-connector-c-dev \
      mysql-client

RUN pip install --upgrade pip

RUN pip install \
      certifi==2019.9.11 \
      chardet==3.0.4 \
      Click==7.0 \
      Django==2.2.4 \
      django-nested-admin==3.2.4 \
      djangorestframework==3.10.2 \
      idna==2.8 \
      module==0.0.2 \      
      mysqlclient==1.4.4 \
      python-monkey-business==1.0.0 \
      pytz==2019.2 \
      PyYaml==5.1 \
      requests==2.22.0 \
      six==1.12.0 \
      sqlparse==0.3.0 \
      urllib3==1.25.3 \
      uwsgi

RUN apk add --update --no-cache tzdata \
 && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
 && apk del tzdata

ENV APP_NAME=sample \
    ROOT_DIR=/var/www/app \
    SOCK_DIR=/var/run/uwsgi \
    CONF_DIR=docker/python \
    LOGS_DIR=/var/log/python \
    UWSGI_CONF_DIR=/etc/uwsgi/vassals

RUN mkdir -p ${ROOT_DIR}/${APP_NAME} ${SOCK_DIR} ${LOGS_DIR}

WORKDIR ${ROOT_DIR}
COPY ./web ${APP_NAME}
COPY ./${CONF_DIR}/uwsgi/api.ini ${UWSGI_CONF_DIR}/api.ini
COPY ./${CONF_DIR}/startup.sh ./

VOLUME ["${ROOT_DIR}", "${SOCK_DIR}"]
CMD ["/bin/sh", "/var/www/app/startup.sh"]

#!/bin/sh

APP_DIR=/var/www/app/sample

${APP_DIR}/manage.py migrate
${APP_DIR}/manage.py loaddata user.yaml

uwsgi --ini /etc/uwsgi/vassals/api.ini
upstream api {
  server unix:/var/run/uwsgi/uwsgi.sock;
}
 
server {
  listen      80;
  server_name localhost;
  charset     utf-8;
  client_max_body_size 200M;

  access_log /var/log/nginx/access.log main if=$log_ext if=$log_ua;
  error_log  /var/log/nginx/error.log;

  add_header Access-Control-Allow-Methods "OPTIONS, GET, POST, PUT, PATCH, DELETE";

  proxy_set_header 'Access-Control-Allow-Origin'  '*';
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_read_timeout 180;

  location / {
    try_files $uri @uwsgi;
  }

  # static 
  location /static/ {
    root /var/www/app/sample;
  }

  location @uwsgi {
    include    uwsgi_params;
    uwsgi_pass api;
  }
}
user  root;
worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
  server_tokens off;
  include       /etc/nginx/mime.types;
  include       /etc/nginx/conf-sample.d/*.conf;
  default_type  application/octet-stream;

  access_log  /var/log/nginx/access.log  main if=$log_ua;

  sendfile        on;
  #tcp_nopush     on;

  #keepalive_timeout  0;
  keepalive_timeout  120;

  #gzip  on;

  index   index.html index.htm;

}
.
├── README.md
├── batch
├── deploy
├── docker
│   ├── docker-compose.yml
│   ├── log
│   │   ├── nginx
│   │   │   ├── access.log
│   │   │   └── error.log
│   │   └── python
│   │       ├── error.log
│   │       └── request.log
│   ├── mysql
│   │   └── conf.d
│   │       └── custom.cnf
│   ├── nginx
│   │   ├── conf.d
│   │   │   ├── 00-log.conf
│   │   │   └── api.conf
│   │   └── nginx.conf
│   └── python
│       ├── Dockerfile
│       ├── startup.sh
│       └── uwsgi
│           └── api.ini
├── pip.list
├── venv
└── web
    ├── README.md
    ├── apps
    │   ├── __init__.py
    │   ├── api
    │   │   ├── __init__.py
    │   │   ├── apps.py
    │   │   ├── urls.py
    │   │   └── versioned
    │   │       ├── __init__.py
    │   │       └── v1
    │   │           ├── __init__.py
    │   │           ├── permissions
    │   │           ├── serializers
    │   │           ├── urls.py
    │   │           ├── views
    │   │           └── viewsets
    │   ├── base
    │   │   ├── __init__.py
    │   │   ├── apps.py
    │   │   ├── fixtures
    │   │   ├── migrations
    │   │   └── models
    │   └── console
    │       ├── __init__.py
    │       ├── admin
    │       └── apps.py
    ├── config
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── locale
    ├── manage.py
    └── static

Ergänzung

Tatsächlich wird die Konfiguration auf der Django-Seite auch auf verschiedene Arten angepasst. (API-Versionsverwaltung usw.) Ich dachte daran, verschiedene Dinge gleichzeitig zu schreiben, aber ich bin faul und schreibe überhaupt nicht Vorerst habe ich einen Artikel über Docker geschrieben. .. ..

Wenn eine Stimme sagt "Ich möchte die Beschreibung (Einstellung) hier sehen", kann ich sie gerne ausschreiben

Recommended Posts

(Fall) Django (DRF) + uWSGI + Nginx + MySQL docker-compose.yml Beispiel
Bereitstellen von Django (Ubuntu 14.04 LTS + Nginx + uWSGI + Supervisor)
Aufbau des Python-Ausführungsservers (Python + uWSGI + Django + Nginx)
Betrachten Sie die Beschreibung von docker-compose.yml (Django + MySQL ③)
Erstellen Sie mit Docker eine Umgebung aus Nginx + uWSGI + Python (Django)
Django + MySQL-Einstellungen
Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).