[PYTHON] Comment exécuter une application Django sur un conteneur Docker (environnement de développement et de production)

Résumé de l'article

Il existe plusieurs manières d'exécuter une application WEB créée avec ** Django ** dans un ** environnement de développement / production **. Récemment, ** Kubernetes ** est devenu populaire et il existe de nombreuses occasions où les applications sont conteneurisées.

Cet article décrit comment créer un ** conteneur Docker ** avec une ** application Django ** dans un ** environnement de développement / production **.

Prérequis / Environnement

L'environnement utilisé dans cet article est ** CentOS7 **, ** Docker **, ** Django2 series **.

Tant que ** Docker ** fonctionne, ** Docker container ** fonctionne, il n'y a donc pas de problème même si le système d'exploitation est Windows.

Créer un conteneur Docker pour l'environnement de développement

Fichier Docker à utiliser

Le fichier Docker utilisé pour l'environnement de développement est le suivant.

Ce fichier Docker est basé sur ** debian: 10 ** et a ** Python ** installé à partir du code source. Il existe également une image Docker ** officielle Python **, donc vous pouvez l'utiliser, mais elle est configurée comme ceci à des fins d'étude.

FROM debian:10

# Install Python3.7.7

WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
RUN apt-get update && apt-get install -y \
    gcc \
    libbz2-dev \
    libssl-dev \
    libffi-dev \
    libsqlite3-dev \
    make \
    tk-dev \
    zlib1g-dev \
    apache2-dev \
    python3-dev \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
RUN ./configure --enable-shared && \
    make && \
    make install && \
    make distclean && \
    ./configure && \
    make && \
    make altbininstall

# Install with pip

COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt

# Deploy App

WORKDIR /
ADD ./deployfiles.tar.xz .
WORKDIR /myapp

CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]

Description du fichier Docker

FROM debian:10

Tout d'abord, lors de l'écriture d'un fichier ** Docker **, spécifiez ce qu'il faut utiliser comme ** base **. Ici, ** debian: 10 ** est spécifié.

FROM

# Install Python3.7.7

WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7

Vient ensuite l'installation de ** Python **.

** [WORKDIR] 7 ** est une syntaxe qui déplace le répertoire courant du système d'exploitation. Si ** WORKDIR / work ** est spécifié, un répertoire appelé ** work ** sera créé directement sous le ** répertoire racine (/) ** (** il sera créé s'il n'y a pas de répertoire spécifié **), et c'est le répertoire courant. Ce sera un répertoire.

** ADD ** peut être ** copié / développé ** dans le chemin du conteneur Docker en définissant ** ADD sur le système d'exploitation hôte sur le chemin du conteneur Docker **. Je peux le faire. ** Contrairement à [ADD is COPY] 5 **, vous pouvez ** décompresser un fichier compressé **. Par conséquent, les fichiers tels que ** tar ** et ** xz ** doivent être copiés dans le ** conteneur Docker ** à l'aide de ** ADD **.

RUN apt-get update && apt-get install -y \
    gcc \
    libbz2-dev \
    libssl-dev \
    libffi-dev \
    libsqlite3-dev \
    make \
    tk-dev \
    zlib1g-dev \
    apache2-dev \
    python3-dev \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

** [RUN] 3 ** peut exécuter des commandes sur le conteneur Docker. J'utilise apt-get pour installer les packages dépendants nécessaires pour installer ** Python **.

** apt-get clean **, ** rm -rf / var / lib / apt / lists / \ *** sont en cours d'exécution pour supprimer les caches et fichiers inutiles. En supprimant cela, vous pouvez conserver la ** capacité de l'image Docker ** créée ** petite **.

RUN ./configure --enable-shared && \
    make && \
    make install && \
    make distclean && \
    ./configure && \
    make && \
    make altbininstall

Les autres sont **. / Configure **, ** make **, ** make install **. Il y a environ 4 lignes supplémentaires, mais celles-ci sont ajoutées pour gérer les erreurs.

*** Je pense que c'est un problème de combinaison **, mais quand je l'ai lancé, j'ai dû le faire. C'est peut-être inutile.

# Install with pip

COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt

Après avoir installé ** Python **, installez le package ** Python **. Ici, utilisez la commande ** pip ** pour installer les packages répertoriés dans ** requirements.txt **.

** [COPY est similaire à ADD] 5 **, ** COPY Path on host OS Path on Docker container ** Copy files on host OS to path on Docker container Je peux le faire. Ceci est littéralement juste une copie.

Après cela, mettez à niveau ** pip ** avec ** [RUN] 3 ** et installez le package ** Python ** basé sur ** requirements.txt **.

# Deploy App

WORKDIR /
ADD ./deployfiles.tar.xz .
WORKDIR /myapp

CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]

Enfin, ajoutez votre application ** au conteneur Docker **.

** deployfiles.tar.xz ** est un répertoire compressé appelé ** myapp **, avec ** manage.py ** directement sous ** myapp **.

** [CMD] 4 ** est la syntaxe pour définir la commande à exécuter lorsque le ** conteneur Docker ** démarre. Cela peut être décrit comme un format de liste de ** Python **, et chaque élément est joint avec un espace demi-largeur. En d'autres termes, la commande est la suivante.

CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]
↓
python3 manage.py runserver 0.0.0.0:80

Créer une image Docker

Pour créer l'image ** Docker **, exécutez la commande suivante.

docker build -t test/myapp .

L'option ** -t ** est utilisée pour baliser ** l'image Docker **. Le balisage facilite la gestion.

À la fin de la commande, mettez le chemin du ** fichier Docker **. Ici, ** répertoire courant (.) ** est spécifié.

Par défaut, le fichier nommé ** Dockerfile ** est recherché à partir du chemin spécifié, le nom de fichier créé ci-dessus doit donc être ** Dockerfile **.

docker build

Pour vérifier l'image créée, exécutez la commande suivante.

docker image ls

Démarrer le conteneur Docker

Pour démarrer le ** conteneur Docker ** à partir de ** l'image Docker **, exécutez la commande suivante.

docker run --name myapp -d -p 80:80 -v /work/db.sqlite3:/myapp/db.sqlite3 test/myapp:latest

L'option ** --name ** nomme le ** conteneur Docker **. Ceci est utile ultérieurement si vous souhaitez arrêter, démarrer ou supprimer ce ** conteneur Docker **. Le nom sera unique, donc si vous lui donnez un nom, vous pouvez l'arrêter, le démarrer ou le supprimer simplement en spécifiant le nom. S'il n'y a pas de nom, spécifiez l'ID du conteneur.

L'option ** -d ** exécute le conteneur en ** arrière-plan **. Si ce n'est pas attaché, la sortie standard du ** conteneur Docker ** sera affichée sur la console. Vous pouvez quitter avec ** Ctrl + c **. Je pense qu'il fonctionnera en arrière-plan dans la plupart des cas, alors je vais l'ajouter.

L'option ** - p ** associe le ** port du système d'exploitation hôte ** au ** port du conteneur Docker **. ** Port OS hôte: port du conteneur Docker **. Cette fois, puisque le processus ** Django ** est publié à l'aide du ** port 80 ** du conteneur Docker, spécifiez 80.

L'option ** -v ** associe le ** volume du système d'exploitation hôte (volume Docker ou chemin de fichier sur le système d'exploitation hôte) ** au ** chemin du fichier du conteneur Docker **. Le conteneur ne contient aucune donnée à sa sortie. Par conséquent, les données que vous souhaitez conserver doivent être stockées en externe. ** Le volume Docker est recommandé **, mais en raison de l'environnement de développement ** Enregistrez les données dans le chemin du fichier du système d'exploitation ** sur l'hôte. Ici, ** db.sqlite3 ** est lié de ** OS hôte ** au ** conteneur Docker **.

** test / myapp ** est la spécification de ** l'image Docker ** sous-jacente. ** latest ** est le nom de la version et sera ** latest ** si vous ne spécifiez rien lors de la création de ** l'image Docker **. Vous pouvez le vérifier en vous référant à la colonne ** TAG ** sortie par ** docker image ls **.

docker run

Pour vérifier s'il a démarré normalement, exécutez la commande suivante.

docker ps

Si la colonne ** STATUS ** est ** UP **, elle a démarré normalement.

Si rien n'est sorti, ajoutez ** -a ** pour vérifier le processus arrêté. Si vous souhaitez vérifier le journal du ** conteneur Docker **, exécutez la commande suivante.

docker logs [Nom du conteneur ou ID du conteneur]

Vérifiez l'erreur et prenez des mesures correctives.

Connectez-vous à l'application Django

Accédez au numéro de port public de l'adresse IP sur le ** OS hôte ** exécutant ** Docker **.

Création d'un conteneur Docker pour l'environnement de production

Fichier Docker à utiliser

Le ** fichier Docker ** utilisé pour l'environnement de production est le suivant.

Contrairement à l'environnement de développement, vous ne pouvez pas démarrer un processus avec ** python3 manage.py runserver **. Il est plus stable de fonctionner sur ** Apache ** etc.

Ici, nous utilisons ** httpd: 2.4 ** comme base. [** Image Docker officielle ** d'Apache Web Server **] 1.

Pour exécuter ** Django ** sur ** Apache **, vous devez inclure un module appelé ** [mod_wsgi] 2 ** dans ** Apache **. Par conséquent, ** Python ** et ** [mod_wsgi] 2 ** sont installés.

FROM httpd:2.4

# Install Python3.7.7

WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
RUN apt-get update && apt-get install -y \
    gcc \
    libbz2-dev \
    libssl-dev \
    libffi-dev \
    libsqlite3-dev \
    make \
    tk-dev \
    zlib1g-dev \
    apache2-dev \
    python3-dev \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
RUN ./configure --enable-shared && \
    make && \
    make install && \
    make distclean && \
    ./configure && \
    make && \
    make altbininstall

# Install with pip

COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt

# install ModWsgi

WORKDIR /work
ADD ./mod_wsgi-4.7.1.tar.gz .
WORKDIR mod_wsgi-4.7.1
RUN ./configure \
    --with-apxs=/usr/local/apache2/bin/apxs \
    --with-python=/usr/local/bin/python3.7 && \
    make && \
    make install 

# Set Apache

WORKDIR /usr/local/apache2/conf
COPY ./httpd.conf .
COPY ./server.crt .
COPY ./server.key .
COPY ./wsgi.conf ./extra
COPY ./httpd-ssl.conf ./extra

Description du fichier Docker

FROM httpd:2.4

** [httpd: 2.4] 1 ** est spécifié comme base.

# Install Python3.7.7

WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
RUN apt-get update && apt-get install -y \
    gcc \
    libbz2-dev \
    libssl-dev \
    libffi-dev \
    libsqlite3-dev \
    make \
    tk-dev \
    zlib1g-dev \
    apache2-dev \
    python3-dev \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
RUN ./configure --enable-shared && \
    make && \
    make install && \
    make distclean && \
    ./configure && \
    make && \
    make altbininstall

Installez ** Python ** comme vous le feriez dans l'environnement de développement.

# Install with pip

COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt

Installez le package ** Python ** basé sur ** requirements.txt ** avec ** pip ** comme dans l'environnement de développement.

# install ModWsgi

WORKDIR /work
ADD ./mod_wsgi-4.7.1.tar.gz .
WORKDIR mod_wsgi-4.7.1
RUN ./configure \
    --with-apxs=/usr/local/apache2/bin/apxs \
    --with-python=/usr/local/bin/python3.7 && \
    make && \
    make install 

Installez ** [mod_wsgi] 2 ** pour que ** Django ** fonctionne sur ** Apache **.

# Set Apache

WORKDIR /usr/local/apache2/conf
COPY ./httpd.conf .
COPY ./server.crt .
COPY ./server.key .
COPY ./wsgi.conf ./extra
COPY ./httpd-ssl.conf ./extra

Enfin, copiez les ** fichiers Apache ** divers ** config ** et ** les fichiers associés au certificat **.

Créer une image Docker

Similaire à l'environnement de développement.

Créer un volume Docker

Exécutez la commande suivante pour créer ** [Docker Volume] 10 **.

docker volume create --name volume-name

** [Docker Volume] 10 ** est créé avec le nom spécifié par ** - name **. Ce volume est associé au ** conteneur Docker **.

** [Docker Volume] 10 ** a une durée de vie différente de ** Docker Container **. Même si le ** conteneur Docker ** disparaît, ** [volume Docker] 10 ** continuera d'exister, de sorte que les données peuvent être conservées.

Démarrer le conteneur Docker

Pour démarrer le ** conteneur Docker ** à partir de ** l'image Docker **, exécutez la commande suivante.

docker run --name myapp -d -p 443:443 -v volume-name:/myapp test/myapp

Seule l'option ** -v ** est différente de l'environnement de développement. Ici, ** [volume Docker] 10 ** est spécifié au lieu de ** chemin de fichier ** sur le système d'exploitation hôte. Un ** [volume Docker] 10 ** nommé ** nom-volume ** est associé à ** / myapp ** sur le ** conteneur Docker **. Cela enregistrera les données sur ** / myapp ** dans ** [Docker Volume] 10 **.

Connectez-vous à l'application Django

Similaire à l'environnement de développement.

Fichier source utilisé

Python

mod wsgi

Recommended Posts

Comment exécuter une application Django sur un conteneur Docker (environnement de développement et de production)
Comment utiliser Docker pour conteneuriser votre application et comment utiliser Docker Compose pour exécuter votre application dans un environnement de développement
Comment créer un environnement Django (python) sur Docker
Comment déployer une application Django dans le cloud Alibaba
Comment exécuter Django sur IIS sur un serveur Windows
Flutter dans Docker - Comment créer et utiliser un environnement de développement Flutter dans un conteneur Docker
Exécutez Matplotlib sur un conteneur Docker
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) à l'aide de VS Code + Remote Containers
Exécutez matplotlib sur un conteneur Windows Docker
Apprenez à utiliser Docker en créant un environnement pour Django + MySQL
[DynamoDB] [Docker] Créer un environnement de développement pour DynamoDB et Django avec docker-compose
Comment rendre le nom du conteneur accessible dans Docker en tant que sous-domaine
[Python] Créer un environnement de développement Django avec Docker
[Note] Comment créer un environnement de développement Ruby
[Note] Comment créer un environnement de développement Mac
Créer un environnement de développement Django à l'aide de pyenv-virtualenv sur Mac
Lancer Django sur un conteneur Docker à l'aide de docker-compose up
Créez un environnement de développement avec Poetry Django Docker Pycharm
Comment créer un environnement Python sur Amazon Linux 2
Comment créer un bel environnement Python sur un nouveau Mac et installer Jupter Notebook
Comment mettre Pyenv sur Amazon Linux et Ubuntu pour créer un environnement Python 3.6.0
Une note sur la façon de préparer facilement un environnement de pratique Linux
Comment exécuter un modèle de transformateur entraîné localement sur CloudTPU
Créez un environnement de développement Django avec Docker! (Docker-compose / Django / postgreSQL / nginx)
Comment créer un nouvel environnement virtuel Python sur Ubuntu
[Memo] Construire un environnement de développement pour Django + Nuxt.js avec Docker
Ne perdez pas contre Ruby! Comment exécuter Python (Django) sur Heroku
Créer un environnement de développement VS Code + Docker avec une machine virtuelle Linux
Remarques sur la façon de charger un environnement virtuel avec PyCharm
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Mettez Jupyter et Docker Compose dans votre Chromebook et utilisez-le comme un environnement de développement léger!
Déployer l'application Django avec Docker
Comment exécuter matplotlib sur heroku
Remarques sur la création d'un environnement LAMP à l'aide de Vagrant et VirtulBox
Comment exécuter Jupyter et Spark sur Mac avec des paramètres minimaux
Comment créer un environnement Python à l'aide de Virtualenv sur Ubuntu 18.04 LTS
Comment déployer une application Django sur heroku en seulement 5 minutes
Comment déployer une application Web sur Alibaba Cloud en tant que pigiste
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
Lancement d'une application Web sur AWS avec django et modification des tâches
Création d'un environnement pour exécuter ChainerMN sur une instance de GPU AWS
Apprentissage de l'historique pour participer au développement d'applications d'équipe avec Python ~ Créer un environnement Docker / Django / Nginx / MariaDB ~
Comment diviser et enregistrer un DataFrame
Comment déboguer un programme Python en se connectant à distance à un conteneur Docker dans un environnement WSL2 avec VS Code
Développement Django à l'aide des procédures virtualenv de la construction de l'environnement virtuel à la création d'un nouveau projet / nouvelle application et à la configuration initiale
Exécutez des fichiers Python dans un conteneur Docker sur un Raspbian distant via PyCharm
Comment créer un environnement NVIDIA Docker
Comment faire exécuter un thread de processus uniquement sur un cœur de processeur spécifique
Créez une application Django sur Docker et déployez-la sur AWS Fargate
Comment utiliser Tensorflow dans un environnement Docker
Exécutez une application Web Python avec Docker
Comment tester sur une page authentifiée par Django
Notes sur la façon d'exécuter Cython sur OSX
Construisez Linux sur un environnement Windows. Étapes pour installer Laradock et migrer
Comment exécuter des scripts Maya Python
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Créer un projet et une application Django dans un environnement virtuel Python et démarrer le serveur
Comment installer Fast.ai sur le GPU Alibaba Cloud et l'exécuter sur un ordinateur portable Jupyter