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 **.
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.
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"]
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é.
# 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
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 **.
Pour vérifier l'image créée, exécutez la commande suivante.
docker image ls
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 **.
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.
Accédez au numéro de port public de l'adresse IP sur le ** OS hôte ** exécutant ** Docker **.
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
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 **.
Similaire à l'environnement de développement.
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.
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 **.
Similaire à l'environnement de développement.
Recommended Posts