Docker + VS Code

Un combo gagnant qui apporte un sacré confort !

Le problème

Qui n’a jamais galéré à jongler entre différentes versions d’un logiciel ou d’un langage, comme Apache, Postgresql, Python, Node ? « Ah mince, ce projet utilise Node 8 alors il faut que je change ma configuration parce que là j’ai Node 12 dans mon $PATH. » Il y a bien quelques outils, comme les environnements virtuels pour Python, mais ce n’est pas universel.

Gérer différentes versions peut rendre fou.
Gérer différentes versions peut rendre fou.

Puis il y a eu Docker. Maintenant, son succès est avéré et il est inutile de présenter ce projet tellement utile aux ops. Mais se pourrait-il qu’il soit utile aux devs ? Eh bien oui. Vous voulez un environnement de développement propre, avec seulement GCC 9 et les dernières versions de Valgrind, GDB et Boost ? Il vous suffit d'installer un conteneur et de développer dedans. Mais c’est pas toujours très pratique. En effet, depuis votre éditeur, il n’y avait, par exemple, pas d’autocomplétion si l’on n’installait pas d’outils localement.

La solution

Mais récemment, une mise à jour de Visual Studio Code vient changer la donne. En effet, Microsoft a annoncé l’intégration officielle d’une extension permettant de se connecter directement dans un conteneur, entres autres. Il ne suffit que d’un simple fichier de configuration et vous voilà prêt à développer. Et vous bénéficiez désormais d’un vrai environnement, avec autocomplétion, débogueur et tout le reste, parce que Visual Studio se croit désormais à l’intérieur de votre conteneur et a donc tous les outils à sa disposition.

Un exemple d'autocomplétion, alors que mon poste en local ne dispose d'aucun outil C++.
Un exemple d'autocomplétion, alors que mon poste en local ne dispose d'aucun outil C++.

Pour arriver au résultat ci-dessus, je n’ai eu qu’à créer un fichier .devcontainer.json, avec les quelques lignes suivantes, pour indiquer à Visual Studio Code comment builder et lancer mon conteneur.

{
  "name": "Test C++",
  "image": "gcc:9",
  "extensions": [
      "ms-vscode.cpptools"
  ]
}

Ensuite, je n’ai eu qu’à lui dire que je souhaitais ouvrir mon dossier dans un conteneur. En se basant sur le fichier de configuration, Visual Studio Code m’a téléchargé l’image Docker correspondante, m’a installé l’extension demandée puis a lancé le conteneur avec mon dossier monté dedans, prêt à travailler.

Dans le cadre du projet sur lequel je travaille au boulot, cela permettra d’avoir des conteneurs pour le développement Java, sans rien installer sur mon poste en local. Ainsi, aucun risque de mélanger les versions ni de pourrir son poste de développement. Je cite Java, mais il y a également NodeJS, Angular et C#, entres autres.

WSL 2 — Un vrai noyau Linux dans Windows

Alors que WSL est une traduction à la volée des appels systèmes Linux vers des appels systèmes Windows, la version 2 de ce projet sera un noyau Linux plus à jour et intégralement utilisable. En effet, il s’agira d’une micro machine virtuelle, optimisée spécialement pour ce projet.

Cela signifie que des applications autrefois utilisables seulement avec du bricolage le seront totalement, sans plus d’effort. C’est le cas de Docker. Sous peu, il sera donc possible, avec Windows 10, d’installer WSL 2, de profiter d’un Docker Linux entièrement fonctionnel et de développer dedans, en utilisant Visual Studio Code. Windows va enfin devenir une plateforme de développement agréable. :)



17 commentaires

À une époque, Docker sous Windows était une galère sans nom à installer, à base d’hyper-v et donc de version professionnelle de Windows. C’est toujours le cas ?

SpaceFox

Docker for Windows oui, c’est toujours le cas. C’est pour cette raison que beaucoup attendent la version 2 de WSL, qui permettra enfin d’installer Docker for Linux, sans considération d’Hyper-V ou autre.

@informaticienzero: Donc pour l’instant, tu utilises Docker for Linux depuis Windows grâce à du bidouillage dans WSL et VS code se débrouille sans problème ?

Sinon, l’image me rappel mcarton. Un ancien contributeur C et C++ du feu SdZ.

+0 -0

Mais du coup si tu étais sous Linux, ça existe un Docker for Windows mais pour Linux ?? :o

EDIT: D’ailleurs, quitte à utiliser ton Windows avec les outils en Linux, autant passer à Linux non ? Ou peut-être que c’est plus simple dès que tu dois test sur Windows plutôt qu’un dual-boot ?

+0 -0

Mais du coup si tu étais sous Linux, ça existe un Docker for Windows mais pour Linux ?? :o

Vanadiae

Ça je ne crois pas.

EDIT: D’ailleurs, quitte à utiliser ton Windows avec les outils en Linux, autant passer à Linux non ? Ou peut-être que c’est plus simple dès que tu dois test sur Windows plutôt qu’un dual-boot ?

Vanadiae

Oui et non. Déjà j’utilise des programmes et jeux spécifiques Windows, puis il reste le côté interface graphique, où je n’arrive pas à retrouver sous GNU/Linux une interface simple et fluide comme celle de Windows 10 (avis totalement subjectif).

Après ça ne m’empêche pas de faire pareil sous Linux. WSL 2 c’est sûr que c’est cool, mais sinon le combo Docker + VS Code Remote ça marche aussi sur le manchot. :)

« simple et fluide »

Ça c’est un avis purement personnel. Chacun à sa propre expérience utilisateur ;) (tout comme j’ai le mien sur Python :lol: )


Sinon pour rebondir là dessus, ce que j’avais fait pour un projet, ou je jongler entre plusieurs compilateurs GNAT, c’est que dans mon passe j’avais un répertoire « spécial ». ce répertoir était un volume monter dans le /opt/gnat du conteneur avec la version que je voulais dedans.

Du coup l’unique changement à faire pour passer d’une version à l’autre est d’éteindre un conteneur pour en démarrer un autre.

Merci pour le tuyau !

Une phrase qui m’a fait réagir :

il est inutile de présenter ce projet tellement utile aux ops. Mais se pourrait-il qu’il soit utile aux devs ?

J’ai l’impression (mais je peux me tromper) que c’est plutôt arrivé dans l’autre sens. Docker a plutôt été adopté par des devs d’abord, parce que ça permettait de reproduire un environnement (la BDD de prod avec un dump anonymisé, l’éco-système front-back-whatever, un service tiers "bouchonné") facilement, et à l’aide du système d’images, de pouvoir se le partager facilement entre devs.

Puis effectivement, on s’est dit "mais ça fonctionne pas si mal, et si on arrive à reproduire la prod en local, pourquoi on pourrait pas reproduire la prod en… …prod".

Et là ça a commencé à coincer (cf. le nombre de prez, articles de blog à une époque sur "Docker in production? Good idea?"). Vraiment, les ops se posaient beaucoup de questions, notamment à juste titre sur la sécu (lol@alpine btw).

En tout cas quand je forme des devs à Docker souvent je repasse par ce cheminement qui me semble être le cheminement historique.

Rien de bien méchant pour l’article évidemment, mais je me demandais si je n’avais pas un biais de perception ou autre, et qu’effectivement, un peu partout dans le monde, ça avait plus été adopté par des dev d’abord, et les ops ensuite, comme tu as le mentionnes :)

@SpaceFox : WSL2 vient tout juste de sortir en early access j’ai l’impression. Du coup ça devrait sensiblement s’améliorer (et tant mieux pour les gens sous Windows, Docker est une vraie galère pour eux…). Etant donné l’évolution de Microsoft et de Windows (intégration d’un noyau Linux dans les nouvelles versions, etc.) j’imagine que ça devrait être de mieux en mieux supporté.

+0 -0

Ce qui me fait peur avec Docker, c’est que j’ai l’impression que ça se javascriptise de plus en plus. Je m’explique : comme JS, Docker est de plus en plus utilisé malgré sa complexité et ses limites intrinsèques (notamment la sécurité). Et les versions évolues. Donc, comme JS, on a de plus en plus :

  • D’outils pour réussir à utiliser Docker sans le gérer directement,
  • D’outils pour gérer les outils qui gèrent Docker (etc),
  • De versions obsolètes de documentations / tutos,
  • De gens qui partagent leurs trucs et astuces qui ont fonctionné sur une version bien précise un jour, sauf qu’ils ne savent pas pourquoi ça a fonctionné.

Pire : le produit est fragile. Un simple sudo apt update puis sudo apt upgrade avec uniquement des mises à jour de sécurité sur le serveur qui fait tourner Docker peut conduire au crash complet de containers (alors qu’ils avaient été arrêtés avant) !

Et donc on se retrouve avec un écosystème qui a les mêmes défauts que l’écosystème JS : tout le monde l’utilise indirectement, tout le monde utilise des tas d’outils qui font un gros tas de magie, et plus personne ne sait comment utiliser un outil qui à la base n’est ni vraiment fiable, ni vraiment robuste, et qui change souvent.

Utiliser Docker en dev, ça peut être pratique.

Utiliser Docker en run, ça peut être pratique.

Vous ne voulez probablement pas administrer un docker en run.

C’est joli les deux trolls en un le vendredi. Je ne fais pas de JS, donc je vais pas répondre là-dessus, mais j’utilise Docker au quotidien (en développement mais surtout en production) et je suis ravi que cette technologie existe.

ses limites intrinsèques (notamment la sécurité)

La sécurité n’est pas un sujet pour nous parce qu’on maîtrise tous les conteneurs qu’on lance sur notre cluster. Par contre, l’isolation en est un et on est ravis de pouvoir donner des limites de CPU/mémoire à nos conteneurs.

D’outils pour réussir à utiliser Docker sans le gérer directement, D’outils pour gérer les outils qui gèrent Docker (etc),

Tu parles de choses comme Kubernetes et Docker Compose ? C’est très complémentaire de ce que fait Docker. On utilise Kubernetes depuis bientôt 4 ans (quand la 1.0 est sortie sur Google Cloud Platform) et même si au début c’était overkill aujourd’hui c’est bien pratique pour passer certains conteneurs à l’échelle, ajuster la taille de notre cluster suivant la charge, et garder nos conteneurs disponibles pendant les déploiements.

De versions obsolètes de documentations / tutos, De gens qui partagent leurs trucs et astuces qui ont fonctionné sur une version bien précise un jour, sauf qu’ils ne savent pas pourquoi ça a fonctionné.

Comme n’importe quelle technologie, donc ?

Qu’est-ce que ça veut dire utiliser Docker indirectement ? On maintient nos Dockerfile à la main et ça fonctionne bien. Kubernetes fait probablement de la magie, mais propose des abstractions faciles à utiliser qui nous servent au quotidien.

Et en vrai Docker ça change de moins en moins.

La plupart de nos conteneurs tournent dans Google Cloud Platform sur un Kubernetes managé, mais on n’a pas de soucis sur les quelques autres Docker qu’on a chez un autre fournisseur qui sont gérés par chef (mais c’est plus manuel que Kubernetes, forcément).

Si c’est pas du troll, c’est surement un manque de connaissance dans le DevOps et l’etat de l’art en terme de pratiques…

Ce qui me fait peur avec Docker, c’est que j’ai l’impression que ça se javascriptise de plus en plus. Je m’explique : comme JS, Docker est de plus en plus utilisé malgré sa complexité et ses limites intrinsèques (notamment la sécurité). Et les versions évolues. Donc, comme JS, on a de plus en plus :

Quelles sont les limites de securite de docker? Pour la securite, essaye Openshift. C’est tellement paranoique que la plupart des demandes d’aide concernent la suppression ou le contournement des politiques de securite par default.

Par contre il y a effectivement de vraies limites en terme de d’architecture network, docker etant pense pour etre utilise sur une seule machine avec une IP pas directement accessible depuis l’exterieur du container (d’ou notamment les Pods avec Kubernetes, et une vraie architecture reseau avec Openshift).

D’outils pour réussir à utiliser Docker sans le gérer directement,

Openshift

D’outils pour gérer les outils qui gèrent Docker (etc),

Openshift

De versions obsolètes de documentations / tutos,

Openshift a une doc a jour, toutes les versions en ligne, c’est RedHat pas le pleu pleu du coin. Seul soucis majeur, pas de retrocompatibilite entre les versions majeures donc migration difficile.

De gens qui partagent leurs trucs et astuces qui ont fonctionné sur une version bien précise un jour, sauf qu’ils ne savent pas pourquoi ça a fonctionné. Pire : le produit est fragile. Un simple sudo apt update puis sudo apt upgrade avec uniquement des mises à jour de sécurité sur le serveur qui fait tourner Docker peut conduire au crash complet de containers (alors qu’ils avaient été arrêtés avant) !

Openshift. Mais de toute maniere, c’est le cas avec toute machine qui utilise un service cruciale. Si tu updates comme un porc tu feras peut-etre crasher des trucs de facon inopinee…

Utiliser Docker en dev, ça peut être pratique. Utiliser Docker en run, ça peut être pratique.

Meme en dev, il y a aucune raison de ne pas utiliser Openshift.

Vous ne voulez probablement pas administrer un docker en run.

Personne ne fait ca. Tout le monde (devrait) utiliser un orchestrateur que ce soit Kubernetes ou un truc un peu plus evolue (ais-je deja mentionne Openshift?)

Au passage, Openshift 4.0 s’abstrait de Docker et Kubernetes (notamment par que les dev de Docker sont des connards d’apres ce qu’on m’a rapporte) de sorte que l’integralite de tes remarques sur docker, dont certains sont en partie fondee (Docker a une architecture obsolete et pas aligne sur ses usages courants), ne s’applique plus a Openshift.

J’ai l’impression (mais je peux me tromper) que c’est plutôt arrivé dans l’autre sens. Docker a plutôt été adopté par des devs d’abord, parce que ça permettait de reproduire un environnement (la BDD de prod avec un dump anonymisé, l’éco-système front-back-whatever, un service tiers "bouchonné") facilement, et à l’aide du système d’images, de pouvoir se le partager facilement entre devs.

Les deux en meme temps mon capitaine. Pour les sys admin, c’est tout gagnant parce que le code des devs ne pas tourner uniquement que sur leur machine et donc finis les "Oh faut installer cette dependance" qui evidemment fait planter le reste des trucs en prod. Pour les dev, finis les machines de tests ou en fait on passe 90% du temps a la configurer et 10% a reellement faire le test.

L’idee d’Openshift par exemple, c’est de faire du NoOps, cad ne meme pas avoir besoin de DevOps, juste de sys admin classique, et de dev. Le sys admin, administre l’infrastructure, le dev, bah developpe, et Openshift supprime toute friction entre les deux.

+1 -0

Mais par

D’outils pour réussir à utiliser Docker sans le gérer directement

Tu sous-entendais vraiment "orchestrateurs" @SpaceFox ? (je le dis parce que ça fait 2 personnes qui semblent l’avoir compris comme ça)

Si c’est le cas, effectivement, c’est pas vraiment "des outils pour le gérer" mais bien "pour gérer un cluster de démons docker" (grosso modo) ça fait une différence majeure quand même (l’enfer des architectures distribuées, etc.).

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte