[proxmox] Déployer une application Flask dans un container LXC

Difference entre VM, LXC et Container comme Docker

Une VM émule un serveur physique via un hyperviseur[1] (Proxmox, KVM, etc.). Ainsi, chaque VM tourne avec son propre système d’exploitation.

LXC est un container Linux qui ressemble à une VM, mais sans noyau dédié : il partage celui de l’hôte. Cela en fait une VM beaucoup plus légère qu’une VM classique.

Par contre, les conteneurs Docker ou Podman, eux, ne visent pas à reproduire un système complet. Ils sont utilisé pour exécuter une seule application de façon isolée. De ce fait, en taille de déployement, ils sont encore plus légers que LXC et s’appuient sur des images prédéfinies pour déployer rapidement des services (comme une app Flask, etc.).

Utilisation de LXC avec Proxmox

Avant de déployer votre application, commencez par récupérer une template. Ici, j’utilise Ubuntu 24.04.

Ensuite, cliquez sur « Create CT » et sélectionnez votre template.

Une fois le container créé, la première chose que je fais est de créer un nouvel utilisateur à l’intérieur du container, puis d’activer SSH afin de pouvoir le gérer à distance. Voir l’article ici.

$ sudo adduser nom_utilisateur
$ sudo usermod -aG sudo nom_utilisateur

Puis désactiver le compte root du conteneur.

$ sudo passwd -dl root

Vérifier que le serveur SSH dans LXC est actif.

$ systemctl status ssh

Installation de Python et Flask dans le conteneur LXC

1. Mettre à jour le système et installer Python

Commencez par mettre à jour la liste des paquets, puis installer Python 3 et pip.

$ sudo apt update
$ sudo apt install python3 python3-pip

Vérifier que l’installation s’est bien déroulée :

$ python3 --version
$ pip3 --version

2. Créer un environnement virtuel (recommandé)

Je vous recommande très fortement de créer un environnement virtuel pour gérer les dépendances spécifiques au projet, afin d’isoler les dépendances de notre projet par rapport à ceux de l’hôte du système. Par la suite, celà vous permettra de jouer avec les différentes versions des paquets sans avoir à modifier ceux de l’hôte.

Installez le module venv s’il n’est pas présent :

$ sudo apt install python3-venv 

Créez un environnement virtuel dans le répertoire de votre projet, ici je l’ai nommé venv :

$ python3 -m venv venv 

Activez l’environnement virtuel :

$ source venv/bin/activate 

Une fois activé, vous verrez (venv) apparaître en début de ligne dans le terminal.

3. Installation de Flask et de ces dépendances

Si votre projet contient un fichier requirements.txt (liste des dépendances), installez le en une seule commande :

(venv)$ pip install -r requirements.txt 

ou :

(venv)$ pip install Flask

Exemple minimal (juste Flask) du contenu de requirements.txt :

Flask==3.0.3

Vous pouvez vérifier que Flask est bien installé avec :

(venv)$ python3 -m flask --version 

Si aucune erreur n’apparaît et que la version s’affiche, c’est bon signe !

4. Démarrer votre application Flask

Assurez-vous d’être dans le répertoire contenant votre fichier applicatif (par exemple app.py[1]),

$ cat app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

Puis lancez l’application :

$ flask run --host=0.0.0.0 --port=5000 

L’option --host=0.0.0.0 est essentielle dans un conteneur : elle permet d’accepter les connexions depuis l’extérieur (et pas seulement depuis localhost).

Votre application Flask est maintenant accessible à l’adresse http://<IP-du-conteneur&gt;:5000.

5. Que faire en cas de problème avec l’environnement virtuel ?

Si vous rencontrez des erreurs liées aux dépendances ou à l’environnement virtuel, la solution la plus propre est de le recréer depuis zéro :

  1. Désactivez l’environnement virtuel actuel :
    $ deactivate
  2. Supprimez le répertoire de l’environnement virtuel actuel :
    $ rm -rf venv
  3. Créez un nouvel environnement virtuel (reprendre les etapes ci dessus)
    $ python3 -m venv venv
    $ source venv/bin/activate
  4. Réinstaller les dépendances
    $ pip install -r requirements.txt # ou pip install Flask

Conclusion

Vous savez maintenant installer Python, créer un environnement virtuel, et déployer une application Flask dans un conteneur LXC sous Proxmox.

sources:

How to Create Python Virtual Environments on Ubuntu 18.04
Installing Flask on Ubuntu 22.04 or 20.04 LTS Linux
Flask: A Minimal Application

Conteneur Logiciel – Docker CE

Sommaire | Chap 2 >>>

Chap 1. Conteneur Logiciel – Docker CE

Vous devrez vous attendre  à ce que je parle de docker à un moment ou un autre dans ce blog. Dans l’un de mes derniers articles, j’ai fait référence à « cockpit podman », qui est le docker fait maison par RedHat. Je n’en ai pas beaucoup parlé puisque podman n’est pas tout à fait prêt dans debian ni sur les systèmes d’exploitation autre que RedHat et ces dérivés.

Une des différence entre docker et podman est que, ce dernier peut non seulement créer et administrer des conteneurs comme docker, mais aussi podman peut gérer des pods qui peuvent contenir un ou plusieurs conteneurs.
Pour en savoir un peu plus sur les pods, je vais vous demander de patienter jusqu’à mon prochain article sur kubernetes.

Maintenant que l’introduction à docker est faite, passons à l’installation de docker sur un serveur Ubuntu.

I. Prérequis

Préparer une machine avec les caractéristiques suivantes.

OS: Ubuntu 20.04 LTS Server (Focal Fossa)
RAM: 4 Go
CPU: 2
HDD: 20 Go

Sinon, pour une version minimale, voici les prérequis en fonction de ce que votre distribution vous permet:

RAM: 2 Go
CPU: 1
HDD: 3 Go

Pour l’installation du serveur Ubuntu, j’ai garder les options par défaut sauf à l’installation des paquets où j’ai choisi d’installer le serveur openSSH afin de pouvoir accéder à la machine à distance, une fois l’installation terminée. Noter que je n’ai pas coché l’option d’installation de docker, qui y est aussi proposé, puisque je vais le faire manuellement un peu plus bas dans cet article.

Une fois Ubuntu installé,

  • Activer la coloration du prompt
    $ vim .bashrc
  • Supprimer l’option de commentaire # au niveau de la ligne « force_color_prompt=yes »
    Avant:
    #force_color_prompt=yesAprès:
    force_color_prompt=yes
  • Relancer la configuration de bashrc
    $ . .bashrc

II. Installation de docker

  • Metter à jour le système
    $ sudo apt update && sudo apt -y upgrade
  • Installer dockerSachez que docker se décline en deux versions:
    • docker EE, « Enterprise Edition » pour la version commerciale
    • docker CE, « Community Edition » pour la version gratuite et open source

La version CE de docker devrait être disponible sur toutes les distributions linux.

Noter qu’avec Debian et ces dérivés dont Ubuntu, il n’est pas possible de gérer directement les dépots en HTTPS. Pour celà, installer tous les paquets:

$ sudo apt install apt-transport-https gnupg-agent

Ensuite, importer la clé publique GPG du dépot de docker,

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Ajouter le dépot de docker dans le fichier sources.list d’Ubuntu, et resynchroniser le système cache des paquets.

$ sudo add-apt-repository \
"deb [arch=amd64] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) \
stable"
$ sudo apt update

Voilà, nous sommes finalement prêt pour l’installation de docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io
  • Vérification
    $ sudo docker run hello-world

III. Premiers pas avec docker

Docker ne se lance par défaut qu’avec un utilisateur qui a les mêmes privilèges que root. Mieux vaut ajouter l’utilisateur courant dans le groupe « docker » afin d’éviter de taper sudo à chaque fois qu’il faut lancer une commande docker. D’ailleurs, c’est ce qui est recommendé sur la page de docker.

$ sudo usermod -aG docker $USER

Vérification avec « docker –version » et « docker info ».

Si vous avez une erreur de type: « ERROR: Got permission denied while trying to connect to the Docker daemon socket », il suffit de déconnecter votre session ou redémarrer la machine.

Créer votre premier container hello-world.

$ docker run hello-world

Puis vérifier que l’image a bien été ajoutée localement sur votre machine.

$ docker images
REPOSITORY   TAG     IMAGE ID            CREATED             SIZE
hello-world     latest   bf756fb1ae65     8 months ago     13.3kB

Si vous comptez utiliser kubernetes, n’oubliez pas d’arrêter toutes les instances de conteneurs qui tournent avec Docker.

$ for c in $(docker ps -q);
do docker stop $c;
done
$ docker system prune

Source

Install Docker Engine on Ubuntu