Il y a un certain temps j'avançais l'idée qu'une JVM était, en tant que conteneur de code, un concurrent naturel de Docker :
<<
[GraalVM] donne encore quelques longueurs d'avance à la JVM d'Oracle, alors que des alternatives commençaient à montrer le bout du nez, comme PNaCl puis Wasm. Ce qui est complètement fou c'est que la JVM, qui est sur le papier le truc le plus approprié pour confiner du code, se soit fait sortir par d'autres trucs moins pertinents comme la VM de JavaScript (dans les navigateurs) ou [Docker].
[...]
Le rapport entre Docker et la JVM ?
--- Docker est un outil pour confiner un environnement d'exécution avec ses dépendances. Si les dépendances à l'exécution n'avaient pas débouché sur un bordel colossal, on se passerait probablement de Docker. Docker c'est la meta-distro Linux qui trivialise la notion de distro.
--- La JVM enferme toutes les dépendances dans un seul processus. Tu mets tout ce que tu veux dans ton classpath et tu as la paix. La JVM se débrouille avec le système sous-jacent.
Donc cette histoire de dépendances constitue un point commun assez frappant.
>>
Depuis le début il est clair que Docker fournit un niveau d'indirection assez redondant si on fait tourner dedans juste une JVM, qui a ses propres fonctionnalités d'isolation. La grande nouvelle c'était la capacité de GraalVM d'exécuter du code LLVM, sachant que LLVM est le standard multiarchitecture et multilangage du code exécutable. Ce qui donnait à GraalVM le potentiel pour trivialiser Docker. Il s'en est suivi une passionnante discussion abordant diverses facettes du déploiement et de la compilation anticipée (AOT).
Le sujet vient de rebondir avec l'annonce de WASI (WebAssembly System Interface) par Mozilla. Je recommande la lecture de l'article [Mozilla tries to do Java as it should have been -- with a WASI spec for all devices, computers, operating systems-_]
En bref, avec WASI tu ton code Java ou LLVM est compilé en Wasm, qui accède aux primitives de WASI. Tu obtiens alors du code exécutable prêt à être déployé dans le nuage, sur une machine de bureau, dans un navigateur Web ou un bidule embarqué. Les grandes différences avec du C standard, c'est que le code autorise un niveau de vérification et de confinement correct, ainsi que de l'instrumentation.
L'article de The Registe cite un [tweet hallucinant]
de Solomon Hykes, co-fondateur de Docker :
<<
If `Wasm+WASI` existed in 2008, we wouldn't have needed to created Docker. That's how important it is. WebAssembly on the server is the future of computing. A standardized system interface was the missing link. Let's hope WASI is up to the task!
>>
Du code multiarchitecture et multiplateforme comme concurrent de Docker : c'est pas que moi, c'est un des inventeurs de Docker qui le dit ! Et sérieux, la différence entre `Wasm+WASI` et GraalVM, elle est assez mince.
En arrière-plan il est clair que chez Mozilla ils ont bien pris note des difficultés de Rust à s'imposer comme langage généraliste multiplateforme (notamment face à Kotlin), de la menace que pourrait faire peser GraalVM, du succès des conteneurs légers côté serveur, et de l'étonnant succès de NodeJS (étonnant parce que techniquement inepte à de nombreux égards). Ils n'ont pas pu ignorer OSv, qui fusionne la JVM, le conteneur de microservice et l'unikernel.
À ce jour, `Wasm+WASI` constitue la synthèse la plus brillante de toutes ces idées. Elle retient les points suivants :
- Compilation anticipée, produisant un exécutable avec :
- Un temps de démarrage très court.
- Une faible empreinte mémoire à l'exécution.
- Multilangage, multiarchitecture avec LLVM comme code intermédiaire.
- Code vérifiable avant l'exécution, façon PNaCl ou JVM.
- Fusion de la notion de conteneur léger et de la JVM (qu'on peut décidément appeler conteneur méconnu).
- Donc fusion les étapes de compilation et de conteneurisation, avec des larmes de bonheur dans les yeux des devops.
- Différentes modalités d'exécution (y compris du JIT et de l'interprété).
- Interface programmatique standardisée pour accéder aux ressources système.
Dans cette liste il n'y a que le dernier point qui soit spécifique à WASI, le reste est déjà fourni par Wasm. Mais c'est bien la standardisation de ces interfaces qui concrétise la promesse du multiplateforme.
Après la grande question c'est la gueule qu'elles auront. D'après l'annonce officielle [Standardizing WASI: A system interface to run WebAssembly outside the web]
on sera très près de POSIX. Genre tu retrouves un bon vieux [``sbrk``]
pour l'allocation mémoire. (Hé hé, les auteurs de WebAssembly ont compris : le ramasse-miettes obligatoire il y a des cas où ça ne passe pas !) Si WASI est un POSIX allégé il n'y aura rien à inventer, c'est mieux. Bien sûr on s'attend à voir un jour des Sockets, de l'OpenGL et du DOM W3C.
C'est marrant, Sun et Oracle n'ont jamais brillé par leur capacité à imposer Java côté client (il a fallu attendre que Google s'y mette avec Android). Cette grosse bouse de JavaScript a presque eu plus de succès en "remontant" du client vers le serveur avec NodeJS. Mozilla, qu'on a toujours tendance à enterrer un peu vite, est bien parti pour refaire le même coup avec `Wasm+WASI`. Deux ans après l'annonce, c'est assez clair qu'Oracle n'a pas vu, ou n'a pas envie d'exploiter, le potentiel de GraalVM comme concurrent de Docker.
On prend les paris ? Dans 2 ans jour pour jour :
- Oracle continue de présenter la JVM dans Docker comme une saine pratique de déploiement.
- Amazon et Google hébergent du code WASI qui s'exécute directement dans leur infrastructure nuage.
- En plus du format natif, une version de NGINX est livrée compilée pour WASI.
- Docker annonce la sortie d'un conteneur WASI pour dans pas longtemps.
Pour une fois personne ne meurt. Si, le JavaScript, mais ça va prendre du temps.
Vu le manque de moyens de Mozilla pour pousser les bons produits (Rust est demeuré assez confidentiel) tout ça peut sembler très optimiste. D'un autre côté le couple `Wasm+WASI` résoud tellement de problèmes qu'on peut compter sur un puissant relai de la part d'autres acteurs.