Exécutez une application Web Python avec Docker

Dernière fois: Utilisation d'Emby avec Docker C'est la trajectoire de mes essais et erreurs que je souhaite pouvoir utiliser prochainement Docker.

Application Web Python avec Docker

La dernière fois, nous avons migré le service de streaming multimédia Emby vers un conteneur. Untitled(11).png

Cette fois, j'ai créé une image Docker capable de déployer des applications Web Python. Migrez les applications Web Socket et Django vers Docker. Ensuite, déplacez le contenu statique vers le conteneur et fermez le serveur VM. Untitled(12).png

Contenu statique

J'ai déplacé ce qui se trouvait sur le serveur VM vers l'hôte Docker et je l'ai lié au répertoire de distribution lorsque le conteneur a démarré.

docker-compose.yml


    deploy:
        image: nginx
        restart: always
        ports:
            - 80:80
            - 443:443
        volumes:
            - /home/fclef/docker/server/deploy/nginx/conf:/etc/nginx/conf.d
+           - /home/fclef/docker/server/deploy/content/html:/usr/share/nginx/html

Fonctionnement Docker de l'application Python

Puisque l'application utilisant Web Socket est également faite par Python (bouteille), nous visons à créer un conteneur qui peut facilement déployer des applications Python.

Conception de conteneurs

J'écris souvent des applications Web en Python. Donc, plutôt que de consolider l'ensemble de l'application dans une image Imaginez la fondation qui peut être exécutée sur n'importe quelle application Python L'application spécifique elle-même transmet les informations git lorsque le conteneur est démarré, et les clone et les développe dans le conteneur. Untitled(9) (1).png

Dockerfile Chaque fois que j'écris quelque chose en Python, j'utilise Pipenv. De plus, dans le cas d'une application Web, elle sera connectée et livrée par nginx, donc Installez Pipenv et nginx au moment de l'image.

Dockerfile


FROM python:3.8-slim-buster

#Installation de packages dépendants
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y git make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libs
qlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev nginx

#Installez Pyenv
RUN git clone https://github.com/yyuu/pyenv.git /.pyenv
ENV PYENV_ROOT /.pyenv
ENV PATH $PYENV_ROOT/bin:$PATH
RUN pyenv init - | bash
#Installation de Pipenv
RUN pip install pipenv
ENV PIPENV_VENV_IN_PROJECT 1
ENV PIPENV_YES true

RUN mkdir /app #Répertoire de déploiement d'applications
RUN mkdir /script #Divers répertoires de placement de scripts

COPY up.sh /script #Script de démarrage

#Déplacez le projet git vers l'application dans le script de démarrage
WORKDIR /app
#La livraison d'applications Web est un proxy inverse via le serveur Web principal, ne laissez donc que 80 ports ouverts.
EXPOSE 80
RUN chmod +x /script/up.sh
ENTRYPOINT [ "/script/up.sh" ] #Lorsque le conteneur démarre, le script de démarrage est activé.courir sh

Script de démarrage du conteneur

Les informations git de l'application sont transmises en tant que variable d'environnement au démarrage du conteneur. Pour une raison quelconque, git ne peut pas être cloné avec ssh dans mon environnement, c'est donc une condition préalable au clonage avec https. Une fois cloné, analysez le Pipfile dans le répertoire racine du projet pour déterminer la version Python requise. Certaines bibliothèques Python doivent avoir des programmes dépendants installés, donc Le script (dependencies.sh) pour les installer est lié au moment du démarrage du conteneur et appelé ici. Puisque gunicorn est utilisé pour insérer des applications Web Python, gunicorn est également installé.

up.sh


#!/bin/bash

#Obtenir des informations git à partir des variables d'environnement
gitCloneUrl=${GIT_CLONE_URL}
gitUserName=${GIT_USER_NAME}
gitPassword=${GIT_PASSWORD}
gitCloneTarget=`echo ${gitCloneUrl} | sed -r "s#^(https?://)(.*)#\1${gitUserName}:${gitPassword}@\2#g
"`

#Obtenez le nom du projet
projectName=`echo ${gitCloneUrl} | sed -r "s#.*/(\w+)\.git#\1#g"`
echo "■ ■ ■ PROJECT NAME <${projectName}> ■ ■ ■"

git clone ${gitCloneTarget}

#Obtenez la version python de Pipfile
cd ${projectName}
pythonVersion=`grep python_version Pipfile | sed -r 's/python_version = "(.+)"/\1/g'`
echo "■ ■ ■ PYTHON VERSION <${pythonVersion}> ■ ■ ■"

#Si certaines des bibliothèques Python à installer dépendent d'autres programmes, installez-les ici.
if [ -f /script/dependencies.sh ]; then
    source /script/dependencies.sh
fi

pipenv --python ${pythonVersion}
pipenv install
pipenv install gunicorn

curPath=`pwd`
export APP_ROOT=${curPath}

chmod +x /script/run.sh
service nginx start
/script/run.sh #Script de lancement d'application
while true; do sleep 1000; done

Démarrer le conteneur

A titre d'exemple, je vais vous montrer la configuration pour lancer l'application Django.

docker-compose.extrait yml


django:
    image: pipenv-gunicorn
    restart: always
    environment:
        GIT_CLONE_URL: https://xxxxxxxx/user/project.git
        GIT_USER_NAME: user
        GIT_PASSWORD: password
    volumes:
        - /home/fclef/docker/server/app/dependencies.sh:/script/dependencies.sh
        - /home/fclef/docker/server/app/run.sh:/script/run.sh
        - /home/fclef/docker/server/app/app.conf:/etc/nginx/conf.d/nginx_gunicorn.co
nf
    depends_on:
        - deploy
        - gitlab

dependencies.sh


apt-get -y --no-install-recommends install libpq-dev

run.sh


cd /app/project

source .venv/bin/activate

python manage.py collectstatic --noinput
python manage.py makemigrations
python manage.py migrate

deactivate

/app/project/.venv/bin/gunicorn \
          --access-logfile /var/log/socket_success.log \
          --error-logfile /var/log/socket_error.log \
          --workers 1 \
          --bind unix:/run/socket.sock \
          config.wsgi:application

app.conf


server {
    listen       80;
    listen [::]:80;
    server_name xxxx.xxx.xxx;

    root /app;

    location /static {
        alias /app/project/static;
    }

    location / {
        include /etc/nginx/proxy_params;
        proxy_pass http://unix:/run/socket.sock;
    }

    location ~ ^/apple-touch-icon(.*)\.png$ {
        root /app/project/;
        rewrite ^/apple-touch-icon(.+)\.png$ /static/img/apple-touch-icon.png break;
    }
}

L'application elle-même est clonée depuis git au démarrage du conteneur, Puisque les données sont stockées dans PostgreSQL dans un conteneur séparé, Quel que soit le nombre de recréations de ce conteneur, vous pouvez déployer le service dans l'état de fonctionnement normalement.

Fondamentalement, la plupart des applications Python peuvent être exécutées avec l'image ci-dessus et la méthode de démarrage. Puisque la procédure du clonage git au déploiement est simple, j'ai pu créer une image facile à réutiliser en sortant de l'application. Pour les applications avec une construction d'environnement compliquée, il peut être plus facile à maintenir en créant une image pour chaque application.

Il s'agit de la série de migration de serveurs VM vers des conteneurs.

Recommended Posts

Exécutez une application Web Python avec Docker
Lancer une application Web Python sur Nginx + Gunicorn avec Docker
Démarrez un serveur Web Python simple avec Docker
Application Web avec Python + Flask ② ③
Application Web avec Python + Flask ④
Un mémo sur la création d'une application Django (Python) avec Docker
Déployer l'application Django avec Docker
Créer une application Web avec Django
Développement d'applications avec Docker + Python + Flask
Mettez Docker dans Windows Home et exécutez un serveur Web simple avec Python
Démonisez une application Web Python avec Supervisor
Créez un framework Web avec Python! (1)
Créer un service Web avec Docker + Flask
Créez un framework Web avec Python! (2)
J'ai fait une application WEB avec Django
Exécutez Python avec VBA
Exécutez prepDE.py avec python3
Utiliser python avec docker
Exécutez iperf avec python
J'ai créé une application graphique avec Python + PyQt5
[Python] Créer un environnement de développement Django avec Docker
Étapes pour développer une application Web en Python
Lancer un serveur Web avec Python et Flask
Facile à créer une application console Python avec Click
Extraire des données d'une page Web avec Python
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
[Streamlit] Je déteste JavaScript, donc je crée une application Web uniquement avec Python
Implémentez une application simple avec Python full scratch sans utiliser de framework web.
Web scraping avec python + JupyterLab
Exécutez python avec PyCharm (Windows)
Exécutez un pipeline de machine learning avec Cloud Dataflow (Python)
Exécutez Python avec CloudFlash (arm926ej-s)
(Python) Essayez de développer une application Web en utilisant Django
Développement d'applications Web avec Flask
Analyser et visualiser JSON (application Web ⑤ avec Python + Flask)
Créer une application Web avec Django
Préparer l'environnement python3 avec Docker
API Web avec Python + Falcon
Application Web réalisée avec Python3.4 + Django (Construction de l'environnement Part.1)
Créer un environnement de développement d'applications d'apprentissage automatique avec Python
Faites une loterie avec Python
Exécuter Label avec tkinter [Python]
Créer une couche pour AWS Lambda Python dans Docker
Exécuter un fichier Python avec une importation relative dans PyCharm
Web scraping débutant avec python
Créer un répertoire avec python
Rationalisez la recherche Web avec Python
Je veux faire fonctionner un ordinateur quantique avec Python
Créer une application Rails avec Docker
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Comment convertir un tableau en dictionnaire avec Python [Application]
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
Créez un environnement de développement Python simple avec VSCode et Docker Desktop
Application Web avec Python3.3.1 + Bottle (1) - Changer le moteur de modèle en jinja2
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Faites fonctionner l'imprimante de reçus avec python