# Installation # Docker Docker est un outil haut niveau permettant de faire fonctionner facilement les conteneurs. ## Composition de Docker Docker est un deamon lancé au démarrage de votre machine, avec lequel vous interagissez via un client qui se connecte au deamon au moyen d'une socket (le client peut donc être sur une machine distincte du deamon où sont exécutés les conteneurs). ## Mon premier conteneur Afin de tester la bonne marche de votre installation, exécutez la commande : ``` docker run hello-world ``` Cette commande va automatiquement exécuter une série de commandes pour vous, comme indiqué dans le message affiché en retour : D'abord, le démon va rechercher s'il possède localement l'image *hello-world*. Si ce n'est pas le cas, il va aller la récupérer sur hub.docker.com. Ce site met à votre disposition un grand nombre d'images prêt à l'emploi : des systèmes de base comme Ubuntu, Debian, Centos, etc. jusqu'à des conteneurs prêts à l'emploi : le serveur web nginx, la base de données MySQL, un serveur node.js, etc. Vous pouvez directement utiliser le client pour rechercher une image sur le hub, en utilisant la commande `search` : ``` docker search mariadb ``` Vous pouvez mettre à jour vos images locales ou simplement pré-télécharger des images depuis le hub en utilisant la commande `pull` : ``` docker pull ubuntu ``` Pour consulter la liste des images dont vous disposez localement (soit parce que vous les avez téléchargées, soit parce que vous les avez créées vous-même), utilisez la commande `images` : ``` docker images ``` Vous devez constater la présence de deux images « Ubuntu », ayant un *TAG* différent. Souvent, il existe plusieurs versions d'une même image. Pour Ubuntu par exemple, vous avez la possibilité de lancer la version `vivid`, `trusty` ou `precise`. Chaque image est identifiable par son *Image ID* unique, les noms d'images ainsi que leurs tags sont, comme les tags Git, une manière humainement plus simple de faire référence aux identifiants. Chaque nom d'image possède au moins un tag associé: *latest*, c'est le tag qui est automatiquement recherché lorsque vous ne le précisez pas en lançant l'image ## Exécuter un programme dans un conteneur Maintenant que nous avons à notre disposition l'image d'un conteneur Ubuntu, lançons-la ! La commande `run` de Docker prend comme derniers arguments le programme à lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher un Hello World : ``` docker run ubuntu /bin/echo "Hello World" ``` Dans notre exemple, c'est bien le `/bin/echo` présent dans le conteneur qui est appelé (et non pas le programme `/bin/echo` de la machine hôte qui est transféré dans le conteneur). ## Modifier un conteneur À chaque fois que vous lancez un `run`, un nouveau conteneur est créé à partir de l'image que vous précisez (via un mécanisme de Copy-On-Write, c'est donc très rapide et ne consomme pas beaucoup d'espace disque). Cela signifie que lorsque vous exécutez une commande modifiant le contenu d'un conteneur, cela ne modifie pas l'image de base, mais crée une nouvelle image. Que vous pouvez ensuite utiliser comme image de base. Commençons par entrer dans un nouveau conteneur pour modifier l'image : ``` docker run -it ubuntu /bin/bash ``` Vous voilà maintenant dans le conteneur ! Il est assez épuré, il n'y a rien de superflu : vous n'avez pas d'éditeur de texte : ni vim, ni emacs, même pas vi ! La première chose à faire est de mettre à jour la liste des paquets : ``` apt-get update ``` Il peut arriver que des paquets présents dans l'image officielle ne soient pas à jour. Afin de garder un environnement cohérent, il est recommandé de ne pas utiliser le gestionnaire de paquets pour mettre à jour les paquets, mais plutôt de contacter le mainteneur de l'image pour qu'il la mette à jour. Installons maintenant un programme : ``` apt-get install nano ``` En attendant la fin de l'installation, jetez un œil à la commande dans un autre terminal : ``` docker ps ``` Cette commande liste les conteneurs actifs. Notez le *Container ID* ainsi que le *NAMES* du conteneur du conteneur actuellement en cours d'installation de nano. Lorsque l'installation de `nano` est terminée, quittez l'image en tapant `exit`. Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir commencer directement de votre image avec `nano` : ``` docker commit CONTAINER my_nano ``` En remplaçant `CONTAINER` par le nom ou l'identifiant de votre container. `my_nano` est le nom que vous voudrez utiliser à la place d'`ubuntu` : ``` docker run -it my_nano /bin/bash ``` Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne pouvez toujours pas le faire dans un conteneur issue d'une image `ubuntu` ! ## Dockerfile Pour construire une image, vous n'êtes pas obligé de passer par une série de commits. Docker dispose d'un mécanisme permettant d'automatiser la construction de nouvelles images. Vous pouvez arriver au même résultat que ce que l'on a réussi à faire précédemment en utilisant le Docker file suivant : ``` FROM ubuntu:latest RUN apt-get update RUN apt-get install -y nano ``` La syntaxe d'un `Dockerfile` est simple, le premier mot de chaque ligne est l'intitulé d'une instruction (que l'on écrit généralement en majuscule), elle est suivie de ses arguments. Dans notre exemple, nous utilisons `FROM` qui indique une image de départ à utiliser ; `RUN` est une commande qui sera exécutée dans le conteneur. Pour lancer la construction de la nouvelle image, créer un nouveau dossier ne contenant que votre fichier `Dockerfile`, placez-vous dedans, puis utilisez la commande `build` : ``` docker build -name=my_editor . ``` Une fois la construction de l'image terminée, vous pouvez la lancer et constater l'existence de notre éditeur favori : ``` docker run -it my_editor /bin/bash ``` Consultez https://docs.docker.com/reference/builder/ pour la liste complète des instructions reconnues. ## Exposer des ports Construisons maintenant un conteneur avec un serveur web : ``` FROM my_editor RUN apt-get update RUN apt-get install -y nginx EXPOSE 80 ``` L'instruction `EXPOSE` sera traité plus tard par le client Docker. Il s'agit de préciser les ports sur lesquels votre image écoute. En utilisant l'option `-P` du `run`, vous allez pouvoir assigner une redirection de port aléatoire sur la machine hôte vers votre conteneur : ``` docker build -name=my_webserver . docker run -it -P my_webserver /bin/bash service nginx start ``` À vous de jouer : utilisez l'instruction `COPY` pour afficher votre propre `index.html` remplaçant celui installé de base par nginx. ## Lancement de commande automatique Vous pouvez placer dans un `Dockerfile` une instruction `CMD` CMD nginx -g "daemon off;" ## Lier les conteneurs ## Data only container ## Ambasador # LXC