Soyez prévenus que cet article n’est pas pour les puristes : j’y ferai de gros raccourcis en comparant des outils non pas sur leurs technologies -bien différentes- mais sur leur finalité.
On parle de plus en plus de virtualisation et de containers sur Linux. Si sur serveurs les Machines Virtuelles (VM) sont de plus en plus remplacées au profit de containers Docker, plus simples à installer/utiliser, sur les PC de bureau (et serveurs, clouds…) on trouve de plus en de Snaps, Flatpaks et Appimages. Contrairement à Docker, ces outils s’installent quasi partout.
Si les technologies sont bien différentes, merci des précisions de Mathieu en commentaire, la finalité est identique : installer une application de manière très simple, peu importe la distribution Linux, et l’isoler -au mieux- de l’OS principal dans une optique de sécurité. Sécurité au 1er degré mais aussi dans le sens “boulette” lors de l’installation ou la désinstallation de l’application.
Les distributions Linux ont leurs “appstores”, par exemple AUR pour Archlinux, Launchpad pour Ubuntu etc, et des packages adaptés pour telle ou telle distribution tels que .deb ou .rpm. On peut aussi utiliser des outils comme que debtap sur Archlinux pour convertir des paquets.deb en installateurs pour Arch. Tous ces packages permettent d’installer la dite application avec toutes les dépendances nécessaires à son bon fonctionnement. C’est bien pratique mais ça suppose que le gars qui fait le package pour Archlinux le tienne à jour, par exemple. Sans compter que, si on n’est pas à l’aise sur Linux, dans certains cas l’installation/compilation/désinstallation peut engendré quelques déconvenues (du genre librairies supprimées ou requises mais qui sont en BETA et donc pas dans les sources classiques de sa distribution).
C’est notamment l’un des intérêts de passer par ces solutions de containers : tout est pré-mâché (et testé), c’est à la limite du clic & run façon Windows. Ajoutez à ça que ces outils permettent aussi de ne créer qu’un seul container qui est compatible plusieurs distributions (au lieu de packages ciblés), vous obtenez un produit simple à utiliser, très tendance notamment auprès des néophytes dans le monde Linux.
Si dans ma conception “utiliser Linux” revient à dire “je sais compiler et installer une application” et “je sais installer un serveur et le sécuriser”, je suis aussi comme tout le monde -un peu fainéant ?- et apprécie parfois de gagner du temps en installant simplement divers outils.
- Snap
- Flatpak
- Appimage
- Exemple de Flatpak (Transmission sur desktop Archlinux)
- Exemple de Snap (Plex sur serveur Debian)
Snap, créé par (et sous licence) Canonical (Ubuntu) vient avec toutes les dépendances et l’application est sandboxée (isolée du kernel) via AppArmor. Une des utilités est de pouvoir installer plusieurs version d’une application “snapée”. A contrario ça suppose que l’auteur du Snap, comme pour Docker, tienne à jour toutes les librairies embarquées (point de vue sécurité). Snap présente l’avantage de tourner sur serveur comme desktop (enfin selon l’OS) tout comme sur OpenWRT & Solus. Petit plus, ils proposent un outil pour créer des snaps depuis un dépôt GitHub.
On trouve des snaps sur leur store.
Flatpak, 100% open source, fonctionne comme Snap mais avec 2 différences : l’application est sandboxée via BubbleWrap (merci Mathieu d’avoir corrigé mon erreur) et il s’appuie sur des éléments d’une session graphique pour fonctionner, il lui faut un environnement desktop et non serveur. Tout comme pour Snap il existe un outil de création de Flatpaks : Flathub.
Pour des packs : leur site ou encore Flathub voire via GitHub.
Un container Appimage embarque toutes les libraires nécessaires à son fonctionnement. Il n’est en revanche pas sandboxé comme les 2 premiers mais ça peut s’exécuter via FireJail. Compatible desktop et serveurs. Comme les autres ils ont leur outil d’aide à la création d’images : Openbuildservice.
Images répertoriées sur leur hub.
Alors oui, tout comme il existe une multitude de distributions Linux, de packages, de markets, il existe aussi plusieurs solutions de containérisation. J’utilise Flatpak vu le mauvais support d’Archlinux par Snap mais je pense que vu la simplicité d’utilisation de ces outils il faut simplement se focaliser sur “qui propose l’application dont j’ai besoin ?”.
Exemple d’utilisation de Flatpak
Usage:
flatpak [OPTION…] COMMAND
Builtin Commands:
Manage installed apps and runtimes
install Install an application or runtime
update Update an installed application or runtime
uninstall Uninstall an installed application or runtime
list List installed apps and/or runtimes
info Show info for installed app or runtime
Running applications
run Run an application
override Override permissions for an application
make-current Specify default version to run
enter Enter the namespace of a running application
Manage file access
document-export Grant an application access to a specific file
document-unexport Revoke access to a specific file
document-info Show information about a specific file
document-list List exported files
Manage remote repositories
remotes List all configured remotes
remote-add Add a new remote repository (by URL)
remote-modify Modify properties of a configured remote
remote-delete Delete a configured remote
remote-ls List contents of a configured remote
Build applications
build-init Initialize a directory for building
build Run a build command inside the build dir
build-finish Finish a build dir for export
build-export Export a build dir to a repository
build-bundle Create a bundle file from a build directory
build-import-bundle Import a bundle file
build-sign Sign an application or runtime
build-update-repo Update the summary file in a repository
build-commit-from Create new commit based on existing ref
repo Print information about a repo
Help Options:
-h, --help Show help options
Si vous êtes comme moi un utilisateur basique alors seules celles-ci sont utiles
Usage:
flatpak [OPTION…] COMMAND
Builtin Commands:
Manage installed apps and runtimes
install Install an application or runtime
update Update an installed application or runtime
uninstall Uninstall an installed application or runtime
list List installed apps and/or runtimes
info Show info for installed app or runtime
Running applications
run Run an application
override Override permissions for an application
make-current Specify default version to run
enter Enter the namespace of a running application
Il faut commencer par installer Flatpak sur votre OS. Puis trouvez ensuite le pack de l’application que vous cherchée, dans cet exemple le client BitTorrent Transmission. Je télécharge donc leur paquet Flatpak et le lance via :
[aerya@aerya Téléchargements]$ flatpak install com.transmissionbt.Transmission.flatpakref
A la manière de Docker, ce fichier .flatpakref, dont voici le contenu, n’est pas un installateur mais plus un fichier de configuration pour l’outil Flatpak dans lequel il va trouver quoi télécharger, où et une signature GPG pour vérifier que la source est officielle.
L’installation se déroule simplement :
[aerya@aerya Téléchargements]$ flatpak install com.transmissionbt.Transmission.flatpakref
Installing: com.transmissionbt.Transmission/x86_64/stable
Installing: com.transmissionbt.Transmission/x86_64/stable from flathub
[####################] 1 delta parts, 1 loose fetched; 1363 KiB transferred in 1
Installing: com.transmissionbt.Transmission.Locale/x86_64/stable from flathub
[####################] 1 delta parts, 1 loose fetched; 386 KiB transferred in 8
[aerya@aerya Téléchargements]$
Je le vois dans ma liste de Flatpaks installés
[aerya@aerya Téléchargements]$ flatpak list
Ref Options
com.transmissionbt.Transmission/x86_64/stable system,current
org.gnome.Polari/x86_64/stable system,current
org.gnome.Platform/x86_64/3.24 system,runtime
Et peux le lancer simplement (faire fie des éventuelles erreurs)
[aerya@aerya Téléchargements]$ flatpak run com.transmissionbt.Transmission/x86_64/stable
Usage:
snap [OPTIONS] <command>
Install, configure, refresh and remove snap packages. Snaps are
'universal' packages that work across many different Linux systems,
enabling secure distribution of the latest apps and utilities for
cloud, servers, desktops and the internet of things.
This is the CLI for snapd, a background service that takes care of
snaps on the system. Start with 'snap list' to see installed snaps.
Application Options:
--version Print the version and exit
Help Options:
-h, --help Show this help message
Available commands:
abort Abort a pending change
ack Adds an assertion to the system
alias Enables the given aliases
aliases Lists aliases in the system
buy Buys a snap
change List a change's tasks
changes List system changes
connect Connects a plug to a slot
disable Disables a snap in the system
disconnect Disconnects a plug from a slot
download Downloads the given snap
enable Enables a snap in the system
find Finds packages to install
get Prints configuration options
help Help
info show detailed information about a snap
install Installs a snap to the system
interfaces Lists interfaces in the system
known Shows known assertions of the provided type
list List installed snaps
login Authenticates on snapd and the store
logout Log out of the store
refresh Refreshes a snap in the system
remove Removes a snap from the system
revert Reverts the given snap to the previous state
run Run the given snap command
set Changes configuration options
try Tests a snap in the system
unalias Disables the given aliases
version Help
watch Watch a change in progress
Ici sur un serveur Debian pour y mettre Plex. Commencer par installer Snap
sudo apt install snapd
Puis on peut installer Plex (ce Snap), avec la commande –classic permettant d’accéder à des dossiers (donc des bibliothèques) en dehors du Snap
[aerya@TestSnap ~]$ sudo snap install menta-plexmediaserver --classic
menta-plexmediaserver 1.8.4.4249 from 'menta' installed
Nous pouvons ensuite voir ce Snap dans la liste des installés :
[aerya@SnapTest ~]$ snap list
Name Version Rev Developer Notes
core 16-2.27.5 2774 canonical -
menta-plexmediaserver 1.8.4.4249 6 menta -
Et un serveur Plex tourne localement sur IP:32401

> ces outils sont plus légers et s’appuient sur l’OS hôte
Non, en tout cas pas pour Flatpak. Une application flatpak ne dépend d’absolument rien sur l’hôte.
Une application snap **peut** dépendre de trucs sur l’hôte, mais uniquement si le snap a été construit comme cela. Sinon, le cas « normal » pour les snaps est aussi de ne dépendre de rien du tout sur l’hôte.
En revanche, AppImage fait dépendre les applications de trucs sur l’hôte, oui. 🙂
Flatpak et Snap (dans le mode d’opération normal pour le second) sont vraiment au même niveau que Docker au point de vue de l’isolation du système hôte.
> Flatpak fonctionne comme Snap, avec 2 différences : l’application est sandboxée via SELinux
Non. Flatpak ne fait absolument rien du tout avec SELinux. Le sandboxing de Flatpak est basé sur les « user namespaces », qui sont une fonctionnalité du kernel lui-même, pas d’un LSM (comme SELinux ou AppArmor).
Merci de tes précisions, que je vais ajouter à mon article en le corrigeant.
Concernant Flatpak il dépend tout de mêmes de runtimes partagées, non ?

Quant à SELinux navré de mon erreur, j’ai lu trop vite : ce serait mieux mais c’est pas le cas.
https://github.com/flatpak/flatpak/wiki/Sandbox
> Concernant Flatpak il dépend tout de mêmes de runtimes partagées, non ?
Oui, mais ces runtimes sont comme les applis : des bundles qui se retrouvent injectés dans la sandbox.
Les applications ne peuvent en aucun cas dépendre de bibliothèques installées sur le système hôte.
Et c’est pareil pour Snap : un snap d’application peut dépendre d’un autre snap (contenant des bibliothèques partagées), mais dans son mode de fonctionnement normal, un snap ne dépendra jamais de bibliothèques installées sur le système hôte.
Alors qu’avec AppImage, une app **va** avoir accès à une liste (restreinte, mais non nulle) de bibliothèques venant du système hôte.