index.html (18387B)
1 <!DOCTYPE html> 2 3 <html lang="fr"> 4 5 <head> 6 <meta charset="utf-8"> 7 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 8 9 <link rel="start" href="https://vincent.demeester.fr" /> 10 11 <title>Vincent Demeester</title> 12 <link rel="canonical" href="https://vincent.demeester.fr/posts/2014-10-27-docker-1.3-ecosystem/"> 13 <link href="https://vincent.demeester.fr/index.xml" rel="alternate" type="application/rss+xml" title="Vincent Demeester" /> 14 15 <link rel="openid.server" href="https://indieauth.com/openid" /> 16 <link rel="openid.delegate" href="http://vincent.demeester.fr/" /> 17 <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> 18 19 <link rel="stylesheet" href="/css/screen.css" type="text/css" /> 20 <link rel="stylesheet" href="/css/sbrain.css" type="text/css" /> 21 <link rel="stylesheet" href="/css/syntax.css" type="text/css" /> 22 23 </head> 24 25 <body lang="fr"/> 26 27 28 29 30 31 32 <div id="main-container"> 33 <div id="page"> 34 <article class="post"> 35 <header> 36 <h1 class="emphnext">Docker 1.3 et son écosystème</h1><a href='https://vincent.demeester.fr/posts/2014-10-27-docker-1.3-ecosystem/'></a> 37 <address class="signature"> 38 <span class="date">Mon, 27 October, 2014</span> 39 <span class="words">(1700 Words)</span> 40 </address> 41 <ul class="tag_box inline"> 42 43 <li class="category"><a href="/categories/#zenika">zenika</a></li> 44 45 46 47 48 49 <li class="tag tag-docker"><a href="/tags/#docker">docker<span>3</span></a></li> 50 51 52 <li class="tag tag-fig"><a href="/tags/#fig">fig<span>1</span></a></li> 53 54 55 <li class="tag tag-hub"><a href="/tags/#hub">hub<span>1</span></a></li> 56 57 58 <li class="tag tag-boot2docker"><a href="/tags/#boot2docker">boot2docker<span>1</span></a></li> 59 60 61 <li class="tag tag-container"><a href="/tags/#container">container<span>1</span></a></li> 62 63 <br/> 64 65 </ul> 66 </header> 67 68 69 70 71 <div class="notice">Cet article est disponible sur le <a href="http://blog.zenika.com/">Blog de Zenika</a> à l'adresse suivante : <a href="http://blog.zenika.com/index.php?post/2014/10/27/Docker-1-3-et-son-ecosysteme">http://blog.zenika.com/index.php?post/2014/10/27/Docker-1-3-et-son-ecosysteme</a>. Cet publication me sert de mirroir / sauvegarde.</div> 72 73 <p>Le <strong>16 octobre dernier</strong>, <ins>Docker est passé en version 1.3</ins>. C'est une 74 bonne occasion de faire un point sur ce qu'apportent les mises à jour 75 qui sont sorties depuis la 1.0. Nous allons également en profiter pour 76 regarder les news <strong>importantes</strong> de l'écosystème Docker.</p> 77 78 79 <p><img src="/public/Billet_0511/docker_container_engine_logo.png" alt="Docker" title="Docker" /></p> 80 81 82 <p>Rappel très rapide, <strong>Docker est une plate-forme ouverte à destination des développeurs et administrateurs systèmes visant à faciliter la construction et le déploiement d'applications distribuées</strong>. De manière 83 moins marketing, l'idée derrière Docker est d'<strong>automatiser</strong> le <strong>déploiement</strong> d'environnements sous forme de <strong>conteneurs légers</strong>, portables et auto-suffisants ; les conteneurs permettant d'isoler 84 l'exécution des applications dans des contextes d'exécution. Pour ce 85 faire, Docker, écris en <a href="http://golang.org/">Go</a>, reprend les bases de <strong>LXC</strong>, utilise les fonctionnalités 86 du <strong>noyau Linux</strong> (CGroups, Namespaces, …) et se base <em>initialement</em> sur un 87 système de fichier "en oignons" AUFS ; D'autres backend sont supportés 88 également comme BTRFS ou <em>devicemapper</em> (LVM).</p> 89 90 91 <p>Depuis le 9 juin 2014 et la release de la version 1.0 "production-read", l'équipe derrière Docker n'a pas chomé et 3 92 nouvelles mises à jour sont sorties depuis ; à savoir que les 93 <em>releases</em> de Docker se font à un rythme pré-défini, "à-la" Linux, 94 tout ce qui est prêt et testé est intégré à la release qui 95 suit. Voyons, de façon non-exhaustive, quelles sont les princiales 96 améliorations apportées par ces différentes versions.</p> 97 98 <h4>Hub : Images officielles et language stack</h4> 99 100 101 <p>Le <strong>Hub</strong>, tel qu'il a été nommé après la sortie de Docker 1.0 est <strong>un dépôt des images Docker</strong> de tout-un-chacun qui souhaite les partager.</p> 102 103 104 <p>Au début de l'été, Docker Inc. a annoncé l'apparition des <strong>dépots officiels</strong>. L'idée est d'estampiller des images Docker comme officielles, 105 c'est à dire vérifiées et garanties comme étant issues et supportées par 106 les mainteneurs des projets. De nombreuses images officielles existent 107 déjà pour les principaux projets open-source, comme Ubuntu, MongoDB, 108 etc. Toute communauté open-source ou même tout éditeur logiciel peut 109 entrer en contact avec l'équipe Docker pour voir son/ses images 110 estampillées "officielles", après validation. Cette étiquette vient se 111 rajouter à l'étiquette "<em>automated build repository</em>", précédement 112 appelée <em>verified</em> (ce qui prétait à confusion) qui donne la garantie 113 à l'utilisateur que l'image a été construite de manière automatique 114 par l'infrastructure de Docker Inc. Il est également à noter que la version 115 1.3.0 de Docker apporte la vérification de la provenance et de 116 l'intégrité des images officielles via signature électronique ; même si 117 pour l'instant c'est en <em>work-in-progress</em>.</p> 118 119 120 <p>Un autre ajout récent au Docker Hub, datant de fin septembre, vaut le 121 détour : les l<strong>anguage stack</strong>, des images de bases <em>pre-construites</em> avec tous les outils nécessaires pour faire tourner une application dans un langage donné. Un développeur souhaitant rapidement construire 122 un conteneur avec, par exemple, une application Clojure, n'a plus 123 besoin de <em>réinventer la roue</em> (i.e. partir d'une image de base, installer 124 le JDK, installer lein, etc.). Il lui suffit de partir d'une des 125 <em>language stack</em>, ici clojure.</p> 126 127 <pre class="bash code bash" style="font-family:inherit">FROM clojure 128 COPY . <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>app 129 WORKDIR <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>app 130 CMD <span style="color: #7a0874; font-weight: bold;">[</span><span style="color: #ff0000;">"lein"</span>, <span style="color: #ff0000;">"run"</span><span style="color: #7a0874; font-weight: bold;">]</span></pre> 131 132 133 <h4>Restart policies (1.2.0)</h4> 134 135 136 <p>Docker 1.2 a apporté une option en plus à la commande <code>run</code> : 137 <code>--restart</code>. Il permet de définir une <strong>politique de redémarrage</strong> dans 138 le cas où le conteneurs viendrait à mourrir, que ce soit de manière 139 normale (code de retour à 0) ou inattendue (<em>failure</em>, code de retour 140 différent de 0). Trois options sont disponibles pour l'instant :</p> 141 142 <ul> 143 <li><strong>no</strong> : pas de redémarrage, fonctionnement par défaut.</li> 144 <li><strong>on-failure</strong>: redémarrage automatique si le conteneur s'est terminé de façon anormale. Il est possible d'ajouter un nombre maximum de redémarrage ; avec <code>--restart=on-failure:3</code> docker essaiera de redémarrer 3 fois avant d'abandonner.</li> 145 <li><strong>always</strong> : redémarrage automatique, tout le temps, erreurs ou pas.</li> 146 </ul> 147 148 <h4>Injection de processus (1.3.0)</h4> 149 150 151 <p>La possibilité de voir ce qui se passe dans le container, et par 152 conséquent de s'en servir pour debugger, s'est averé longtemps 153 complexe. Dans les <em>premiers jours</em> de Docker, l'installation d'un 154 démon ssh était une solution commune. Cependant, celà complexifiait la 155 création d'un conteneur ; en effet, Docker est fait pour lancer et isoler 156 une seule commande, l'ajout d'un démon sshd imposait alors de mettre 157 en place une solution du type <em>init</em> comme supervisord, runit, ou 158 autres. Un article de Jérôme Petazonni, employé Docker Inc, 159 a mis les choses au point : 160 <strong><a href="http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/">If you run SSHD in your Docker containers, you're doing it wrong!</a></strong>, 161 littéralement "<em>Si vous faites tourner SSHD dans vos container Docker, vous vous trompez</em>". Jérôme avait créé à l'époque un outil, 162 <a href="https://github.com/jpetazzo/nsenter">nsenter</a>, qui était (et est toujours) installable en passant par un container, histoire de montrer 163 un peu de magie.</p> 164 165 166 <p>La version 1.3 de Docker intègre un nouvelle commande, <code>exec</code> qui 167 n'est autre que nsenter, en mieux, directement intégré à Docker, plus 168 besoin de passer par un outil externe. <strong>Il devient donc possible d'executer n'importe quelle process à l'intérieur donc container, qui est en cours d'exécution</strong>. Ainsi un simple <code>docker exec -it ubuntu_bash bash</code> et 169 nous voici dans une session bash à l'intérieur du conteneur. Bien 170 entendu, comme pour nsenter, cela ne change pas l'idée derrière Docker 171 qui est "une application par conteneur" ; la commande <code>exec</code> est 172 surtout présente pour répondre à des problématiques de <em>debug</em> et de 173 <em>developpement</em>.</p> 174 175 176 <h4>Cycle de vie d’un container (1.3.0)</h4> 177 178 179 <p>Une autre nouvelle commande arrive avec la version 1.3.0 de Docker, 180 c'est <code>create</code>. Beaucoup d'utilisateur ont demandé d'être capable 181 de séparer la création initiale de conteneur et son lancement ; 182 auparavant il n'existait que la commande <code>run</code> qui faisait les deux 183 d'un coup.</p> 184 185 <pre class="bash code bash" style="font-family:inherit">$ docker create <span style="color: #660033;">-t</span> <span style="color: #660033;">-i</span> fedora <span style="color: #c20cb9; font-weight: bold;">bash</span> 186 6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752 187 $ docker start <span style="color: #660033;">-a</span> <span style="color: #660033;">-i</span> 6d8af538ec5 188 bash-<span style="color: #000000;">4.2</span><span style="color: #666666; font-style: italic;">#</span></pre> 189 190 191 <h4>Options de sécurité (1.3.0)</h4> 192 193 194 <p>Les utilisateurs de SELinux ou AppArmor vont être content, la commande 195 <code>--security-opt</code>, arrivée avec la version 1.3.0, permet les <em>labels</em> 196 et <em>profiles</em> de ces derniers, ce qui donne quelque chose comme :</p> 197 198 <pre class="bash code bash" style="font-family:inherit">docker run <span style="color: #660033;">--security-opt</span> label:<span style="color: #7a0874; font-weight: bold;">type</span>:svirt_apache <span style="color: #660033;">-i</span> <span style="color: #660033;">-t</span> centos <span style="color: #c20cb9; font-weight: bold;">bash</span></pre> 199 200 201 <p>L'avantage principal de cette nouvelle commande, c'est, sur 202 les systèmes qui sont configurés avec SELinux ou AppArmor, de pouvoir 203 donner des privilèges de manière plus fine qu'avec l'option 204 <code>--privileged</code> (qui donne tout) et ainsi diminuer les risques 205 potentiels.</p> 206 207 208 <h4>Boot2docker</h4> 209 210 211 <p>Docker s'appuyant sur des fonctionnalitées de noyau Linux, son usage 212 est <em>limité</em> à un système hôte avec un noyau Linux. Le projet 213 boot2docker vise à enlever cette barrière en <strong>permettant d'avoir la commande docker sous Mac OS X et Windows</strong>. Il s'agit ni plus ni moins 214 d'une machine virtuelle VirtualBox légère, basée sur la distribution 215 Tiny Core Linux, pour avoir un <em>overhead</em> le plus faible possible. 216 L'utilisation de boot2docker n'est pas encore totalement transparente, 217 principalement pour la gestion des ports ou encore du montage des 218 volumes du Host (OS X ou Windows) dans le conteneur Docker. La version 219 1.3 de docker, et la version correspondante de boot2docker, permettent 220 maintenant aux utiliseurs de Mac OS X de monter leur dossier <em>hôtes</em> 221 dans le conteneur.</p> 222 223 224 <h4>Fig 1.0</h4> 225 226 227 <p><a href="http://www.fig.sh/">Fig</a> est un outil de développement basé sur Docker, écrit en Python. L'idée est de 228 définir son environnement via un fichier YAML, que ce soit pour le 229 code sur lequel nous travaillons mais également les services externes 230 desquels notre application dépend (Base de données, ''Message 231 queue'', etc.).</p> 232 233 234 <p>Nous avons donc, par exemple, un <code>Dockerfile</code> :</p> 235 236 <pre class="bash code bash" style="font-family:inherit">FROM clojure:lein-2.5.0 237 ADD . <span style="color: #000000; font-weight: bold;">/</span>code 238 WORKDIR <span style="color: #000000; font-weight: bold;">/</span>code 239 RUN lein run</pre> 240 241 242 243 <p>Et un <code>fig.yml</code> :</p> 244 245 <pre>[yaml] 246 web: 247 build: . 248 command: lein run 249 links: 250 - db 251 ports: 252 - "8000:8000" 253 db: 254 image: postgres 255 </pre> 256 257 258 <p>Enfin un petit <code>fig up</code> et c'est gagné, nous obtenons notre base de données 259 relationnelle qui tourne, notre appli qui a été construite et qui 260 tourne aussi, et qui est lié à notre conteneur db. Il existe bien d'autres 261 commandes (<code>start</code>, <code>stop</code>, <code>destroy</code>, etc.).</p> 262 263 264 <p>Fig était initialement développé par <a href="https://www.orchardup.com/">Orchard</a>, qui a été acquis cette 265 année par Docker Inc. Ce 17 octobre, l'équipe Docker a donc fait un release 1.0 de 266 Fig en ajoutant le support à docker 1.3 et à boot2docker. Un certain nombre de commandes et de 267 nouvelles fonctionnalitées ont étés ajoutées, notament :</p> 268 269 <ul> 270 <li><code>fig port</code>, qui liste les ports par service,</li> 271 <li><code>fig pull</code>, qui récupère la dernière version d'un service,</li> 272 <li><code>fig restart</code>, qui redémarre les conteneurs (<code>stop</code> et <code>start</code>)</li> 273 <li>le support de <code>.dockerignore</code></li> 274 <li>le support de connection en TLS au daemon Docker</li> 275 <li>et pas mal d'autres options.</li> 276 </ul> 277 278 <p>Mais l'annonce principale accompagnant cette version est que <strong>Fig ne recevra plus de mise à jour majeure à partir de cette version 1.0</strong> 279 puisque l'équipe Docker travaille pour <strong>intégrer les fonctionnalités</strong> 280 que Fig apporte, <strong>directement dans Docker</strong> ; ce qui est une 281 excellente nouvelle.</p> 282 283 284 <h4>Partenariat avec Microsoft</h4> 285 286 287 <p>Cela transpirait ces derniers mois, dans les différentes conférences 288 et meetups, Microsoft s'intéressait de très prêt à Docker. C'est 289 maintenant officiel, <strong>Docker Inc et Microsoft sont partenaires</strong>. Le 290 partenariat couvre pour l'instant les sujets suivants :</p> 291 292 <ul> 293 <li>Ajouter le support de windows comme hôte Docker.</li> 294 <li>Pour Microsoft, supporter les API <em>open-orchestration</em> de Docker.</li> 295 <li>Intégration de Docker dans Microsoft Azure.</li> 296 <li>Collaboration étroite sur les applications qui ont besoin de plusieurs conteneur (i.e. ce que Fig fait de mieux), et le support d'application qui sont composés de conteneurs Linux et Windows.</li> 297 </ul> 298 299 <p>Le but <em>ultime</em> de Docker quand il a été distribué de façon libre 300 était : "__Construire le 'bouton' qui permet à toutes applications 301 d'être construites et déployées sur n'importe quel serveur, n'importe 302 où.__" (C'est nettement plus classe en anglais : “''To build the ‘button’ 303 that enables any application to be built and deployed on any server, 304 anywhere.''”). Ce partenariat est donc une nouvelle marche en direction 305 de ce dernier.</p> 306 307 308 <h4>Conclusion</h4> 309 310 311 <p>Un an et demi après la première <em>release</em> publique de Docker et près 312 de 5 mois après la version 1.0, Docker et sa communauté avancent 313 toujours aussi vite. Comme Solomon Hykes (CTO et co-fondateur de dotCould) 314 avait dit lors de la dockerCon 14 : "<strong>la valeur réelle de docker n'est pas la technologie, mais le fait que les gens se mettent d'accord sur quelque chose</strong>" ; Docker Inc. pousse principalement dans le sens de la 315 standardisation. Le développement de 316 <a href="https://github.com/docker/libcontainer">libcontainer</a>, 317 <a href="https://github.com/docker/libchan">libchan</a> et 318 <a href="https://github.com/docker/libswarm">libswarm</a> sont des projets qui 319 vont dans ce sens. La communautée est toute aussi <em>bouillante</em> d'idées 320 et chaque jour voit de nouveau projet plus intéressant les uns que les 321 autres.</p> 322 323 324 <p>Enfin la <strong><a href="http://europe.dockercon.com/">dockerCon Europe</a>, les 4 et 5 décembre 2014</strong> viendra couronner une année très riche du côté de Docker et 325 de son écosystème. Rendez-vous mi-décembre pour faire un petit retour 326 sur la première conférence européenne Docker ;-).</> 327 328 329 330 </article> 331 <hr /> 332 <div class="prev-next"> 333 334 <a class="paging-link prev" href="/posts/2015-05-01-orgmode-et-jekyll/" title="Orgmode et Jekyll">← Previous post</a> 335 336 337 338 <a class="paging-link next" href="/posts/2014-03-24-redesign-et-r%C3%A9solutions/" title="Redesign Et Résolutions">Next post →</a> 339 340 </div> 341 342 </div> 343 </div> 344 345 <footer> 346 <nav> 347 348 <a href="/">home</a> 349 <span class="text-muted"> | </span> 350 351 <a href="/about">about</a> 352 <span class="text-muted"> | </span> 353 354 <a href="/archive">archive</a> 355 <span class="text-muted"> | </span> 356 357 <a href="/categories">categories</a> 358 <span class="text-muted"> | </span> 359 360 <a href="/tags">tags</a> 361 <span class="text-muted"> | </span> 362 363 <a href="https://twitter.com/vdemeest">twitter</a> 364 <span class="text-muted"> | </span> 365 366 <a href="https://github.com/vdemeester">github</a> 367 <span class="text-muted"> | </span> 368 369 <a href="https://vincent.demeester.fr/index.xml">rss</a> 370 </nav> 371 <br/> 372 <address> 373 <span class="copyright"> 374 Content and design by Vincent Demeester 375 (<a rel="licence" href="http://creativecommons.org/licenses/by-nc-sa/3.0/">Some rights reserved</a>) 376 </span><br /> 377 <span class="engine"> 378 Powered by <a href="https://gohugo.io/">Hugo</a> and <a href="https://github.com/kaushalmodi/ox-hugo/">ox-hugo</a> 379 </span> 380 </address> 381 </footer> 382 </body> 383