Update tuto

This commit is contained in:
nemunaire 2015-01-15 15:54:21 +01:00
parent 2fba9f3db6
commit 16c5f38a76

View File

@ -17,11 +17,6 @@ General setup --->
[*] Cpuset support [*] Cpuset support
[*] Include legacy /proc/<pid>/cpuset file [*] Include legacy /proc/<pid>/cpuset file
[*] Simple CPU accounting cgroup subsystem [*] Simple CPU accounting cgroup subsystem
[*] Resource counters
[*] Memory Resource Controller for Control Groups
[*] Memory Resource Controller Swap Extension
[*] Memory Resource Controller Swap Extension enabled by default
[*] Enable perf_event per-cpu per-container group (cgroup) monitoring
[*] Group CPU scheduler ---> [*] Group CPU scheduler --->
[*] Group scheduling for SCHED_OTHER [*] Group scheduling for SCHED_OTHER
[*] Group scheduling for SCHED_RR/FIFO [*] Group scheduling for SCHED_RR/FIFO
@ -39,7 +34,7 @@ General setup --->
Device Drivers ---> Device Drivers --->
[*] Network device support ---> [*] Network device support --->
<M> MAC-VLAN support <M> MAC-VLAN support
<M> Virtual ethernet pair device <*> Virtual ethernet pair device
Character devices ---> Character devices --->
-*- Unix98 PTY support -*- Unix98 PTY support
[*] Support multiple instances of devpts [*] Support multiple instances of devpts
@ -54,9 +49,10 @@ la configuration de votre noyau en utilisant la commande `lxc-checkconfig`.
### Par le gestionnaire de paquets ### Par le gestionnaire de paquets
Sous Debian et ses dérivés (Ubuntu, Mint, ...) le paquet et la commande ont été Sous Debian et ses dérivés (Ubuntu, Mint, ...) le paquet et la commande ont été
nommés `docker.io`. Vous pouvez vous créer un alias `alias docker=docker.io`. nommés `docker.io`. Vous pouvez vous créer un alias `alias docker=docker.io` si
celui-ci n'a pas déjà été défini.
Sous les autres distribution, `docker` correspond a priori bien à la solution Sous les autres distributions, `docker` correspond a priori bien à la solution
de virtualisation légère que l'on va utiliser. de virtualisation légère que l'on va utiliser.
### Manuellement ### Manuellement
@ -106,46 +102,44 @@ Votre distribution fournit sans doute un paquet `lxc`.
# Docker # Docker
Docker est un outil haut niveau permettant de faire fonctionner Docker est un outil haut niveau permettant de faire fonctionner facilement les
facilement les conteneurs. conteneurs.
## Composition de Docker ## Composition de Docker
Docker est un daemon lancé au démarrage de votre machine, avec lequel Docker est un daemon lancé au démarrage de votre machine, avec lequel vous
vous interagissez via un client qui se connecte au daemon au moyen interagissez via un client qui se connecte au daemon au moyen d'une socket (le
d'une socket (le client peut donc être sur une machine distincte du client peut donc être sur une machine distincte du daemon où sont exécutés les
daemon où sont exécutés les conteneurs). conteneurs).
## Mon premier conteneur ## Mon premier conteneur
Afin de tester la bonne marche de votre installation, exécutez la Afin de tester la bonne marche de votre installation, exécutez la commande :
commande :
``` ```
docker run hello-world docker run hello-world
``` ```
Cette commande va automatiquement exécuter une série de commandes pour Cette commande va automatiquement exécuter une série de commandes pour vous,
vous, comme indiqué dans le message affiché en retour : comme indiqué dans le message affiché en retour :
D'abord, le démon va rechercher s'il possède localement l'image 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 *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 hub.docker.com. Ce site met à votre disposition un grand nombre d'images : des
d'images prêt à l'emploi : des systèmes de base comme Ubuntu, Debian, systèmes de base comme Ubuntu, Debian, Centos, etc. jusqu'à des conteneurs
Centos, etc. jusqu'à des conteneurs prêts à l'emploi : le serveur web prêts à l'emploi : le serveur web nginx, la base de données MySQL, un serveur
nginx, la base de données MySQL, un serveur node.js, etc. node.js, etc.
Vous pouvez directement utiliser le client pour rechercher une image Vous pouvez directement utiliser le client pour rechercher une image sur le
sur le hub, en utilisant la commande `search` : hub, en utilisant la commande `search` :
``` ```
docker search mariadb docker search mariadb
``` ```
Vous pouvez mettre à jour vos images locales ou simplement Vous pouvez mettre à jour vos images locales ou simplement pré-télécharger des
pré-télécharger des images depuis le hub en utilisant la commande images depuis le hub en utilisant la commande `pull` :
`pull` :
``` ```
docker pull ubuntu docker pull ubuntu
@ -159,58 +153,55 @@ créées vous-même), utilisez la commande `images` :
docker images docker images
``` ```
Vous devez constater la présence de deux images « Ubuntu », ayant un Vous devez constater la présence de deux images « Ubuntu », ayant un *TAG*
*TAG* différent. Souvent, il existe plusieurs versions d'une même différent. Souvent, il existe plusieurs versions d'une même image. Pour Ubuntu
image. Pour Ubuntu par exemple, vous avez la possibilité de lancer la par exemple, vous avez la possibilité de lancer la version `vivid`, `trusty` ou
version `vivid`, `trusty` ou `precise`. `precise`.
Chaque image est identifiable par son *Image ID* unique, les noms Chaque image est identifiable par son *Image ID* unique, les noms d'images
d'images ainsi que leurs tags sont, comme les tags Git, une manière ainsi que leurs tags sont, comme les tags Git, une manière humainement plus
humainement plus simple de faire référence aux identifiants. simple de faire référence aux identifiants.
Chaque nom d'image possède au moins un tag associé: *latest*, c'est le Chaque nom d'image possède au moins un tag associé : *latest*, c'est le tag qui
tag qui est automatiquement recherché lorsque vous ne le précisez pas est automatiquement recherché lorsque vous ne le précisez pas en lançant
en lançant l'image l'image.
## Exécuter un programme dans un conteneur ## Exécuter un programme dans un conteneur
Maintenant que nous avons à notre disposition l'image d'un conteneur Maintenant que nous avons à notre disposition l'image d'un conteneur Ubuntu,
Ubuntu, lançons-la ! lançons-la !
La commande `run` de Docker prend comme derniers arguments le La commande `run` de Docker prend comme derniers arguments le programme à
programme à lancer dans le conteneur ainsi que ses éventuels lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher
arguments. Essayons d'afficher un Hello World : un Hello World :
``` ```
docker run ubuntu /bin/echo "Hello World" docker run ubuntu /bin/echo "Hello World"
``` ```
Dans notre exemple, c'est bien le `/bin/echo` présent dans le Dans notre exemple, c'est bien le `/bin/echo` présent dans le conteneur qui est
conteneur qui est appelé (et non pas le programme `/bin/echo` de la appelé (et non pas le programme `/bin/echo` de la machine hôte qui est
machine hôte qui est transféré dans le conteneur). transféré dans le conteneur).
## Modifier un conteneur ## Modifier un conteneur
À chaque fois que vous lancez un `run`, un nouveau conteneur est créé À chaque fois que vous lancez un `run`, un nouveau conteneur est créé à partir
à partir de l'image que vous précisez (via un mécanisme de de l'image que vous précisez (via un mécanisme de Copy-On-Write, c'est donc
Copy-On-Write, c'est donc très rapide et ne consomme pas beaucoup très rapide et ne consomme pas beaucoup d'espace disque). Cela signifie que
d'espace disque). Cela signifie que lorsque vous exécutez une commande lorsque vous exécutez une commande modifiant le contenu d'un conteneur, cela ne
modifiant le contenu d'un conteneur, cela ne modifie pas l'image de modifie pas l'image de base, mais crée une nouvelle image. Que vous pouvez
base, mais crée une nouvelle image. Que vous pouvez ensuite utiliser ensuite utiliser comme image de base.
comme image de base.
Commençons par entrer dans un nouveau conteneur pour modifier l'image Commençons par entrer dans un nouveau conteneur pour modifier l'image :
:
``` ```
docker run -it ubuntu /bin/bash docker run -it ubuntu /bin/bash
``` ```
Vous voilà maintenant dans le conteneur ! Il est assez épuré, il n'y a Vous voilà maintenant dans le conteneur ! Il est assez épuré, il n'y a rien de
rien de superflu : vous n'avez pas d'éditeur de texte : ni vim, ni superflu : vous n'avez pas d'éditeur de texte : ni vim, ni emacs, même pas vi !
emacs, même pas vi !
La première chose à faire est de mettre à jour la liste des paquets : La première chose à faire est de mettre à jour la liste des paquets :
@ -218,11 +209,10 @@ La première chose à faire est de mettre à jour la liste des paquets :
apt-get update apt-get update
``` ```
Il peut arriver que des paquets présents dans l'image officielle ne Il peut arriver que des paquets présents dans l'image officielle ne soient pas
soient pas à jour. Afin de garder un environnement cohérent, il est à jour. Afin de garder un environnement cohérent, il est recommandé de ne pas
recommandé de ne pas utiliser le gestionnaire de paquets pour mettre à utiliser le gestionnaire de paquets pour mettre à jour les paquets, mais plutôt
jour les paquets, mais plutôt de contacter le mainteneur de l'image de contacter le mainteneur de l'image pour qu'il la mette à jour.
pour qu'il la mette à jour.
Installons maintenant un programme : Installons maintenant un programme :
@ -230,21 +220,22 @@ Installons maintenant un programme :
apt-get install nano apt-get install nano
``` ```
En attendant la fin de l'installation, jetez un œil à la commande dans En attendant la fin de l'installation, jetez un œil à la commande dans un autre
un autre terminal : terminal :
``` ```
docker ps docker ps
``` ```
Cette commande liste les conteneurs actifs. Notez le *Container ID* Cette commande liste les conteneurs actifs. Notez le *Container ID* ainsi que
ainsi que le *NAMES* du conteneur du conteneur actuellement en cours le *NAMES* du conteneur du conteneur actuellement en cours d'installation de
d'installation de nano. nano.
Lorsque l'installation de `nano` est terminée, quittez l'image en tapant `exit`. Lorsque l'installation de `nano` est terminée, quittez l'image en tapant
`exit`.
Sauvegardez votre image modifiée avec la commande `commit` pour Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir
pouvoir commencer directement de votre image avec `nano` : commencer directement de votre image avec `nano` :
``` ```
docker commit CONTAINER my_nano docker commit CONTAINER my_nano
@ -258,18 +249,16 @@ d'`ubuntu` :
docker run -it my_nano /bin/bash docker run -it my_nano /bin/bash
``` ```
Vous constatez cette fois que vous pouvez lancer `nano`, alors que Vous constatez cette fois que vous pouvez lancer `nano`, alors que vous ne
vous ne pouvez toujours pas le faire dans un conteneur issue d'une pouvez toujours pas le faire dans un conteneur issue d'une image `ubuntu` !
image `ubuntu` !
## Dockerfile ## Dockerfile
Pour construire une image, vous n'êtes pas obligé de passer par une Pour construire une image, vous n'êtes pas obligé de passer par une série de
série de commits. Docker dispose d'un mécanisme permettant commits. Docker dispose d'un mécanisme permettant d'automatiser la construction
d'automatiser la construction de nouvelles images. Vous pouvez arriver de nouvelles images. Vous pouvez arriver au même résultat que ce que l'on a
au même résultat que ce que l'on a réussi à faire précédemment en réussi à faire précédemment en utilisant le Docker file suivant :
utilisant le Docker file suivant :
``` ```
FROM ubuntu:latest FROM ubuntu:latest
@ -278,17 +267,36 @@ RUN apt-get update
RUN apt-get install -y nano RUN apt-get install -y nano
``` ```
La syntaxe d'un `Dockerfile` est simple, le premier mot de chaque La syntaxe d'un `Dockerfile` est simple, le premier mot de chaque ligne est
ligne est l'intitulé d'une instruction (que l'on écrit généralement en l'intitulé d'une instruction (que l'on écrit généralement en majuscule), elle
majuscule), elle est suivie de ses arguments. est suivie de ses arguments.
Dans notre exemple, nous utilisons `FROM` qui indique une image de Dans notre exemple, nous utilisons `FROM` qui indique une image de départ à
départ à utiliser ; `RUN` est une commande qui sera exécutée dans le utiliser ; `RUN` est une commande qui sera exécutée dans le conteneur, dans le
conteneur. but de le construire. Chaque ligne est exécutée indépendamment des autres ;
cela signifie que l'exemple suivant ne fonctionne pas :
Pour lancer la construction de la nouvelle image, créer un nouveau ```
dossier ne contenant que votre fichier `Dockerfile`, placez-vous COPY db.sql /db.sql
dedans, puis utilisez la commande `build` : RUN service mysqld start
RUN mysql -u root -p toor virli < /db.sql
```
Cet exemple ne fonctionne pas car le serveur MySQL est lancé dans le premier
RUN, n'est plus lancé au moment du deuxième RUN. Pour avoir le résultat
escompté, il faut exécuter les commandes ensemble :
```
COPY db.sql /db.sql
RUN service mysqld start && mysql -u root -p toor virli < /db.sql
```
Après le `RUN`, MySQL sera de nouveau arrêté, si on veut l'utiliser dans le
conteneur, il ne faudra pas oublier lancer le processus.
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 --tag=my_editor . docker build --tag=my_editor .
@ -301,8 +309,8 @@ constater l'existence de notre éditeur favori :
docker run -it my_editor /bin/bash docker run -it my_editor /bin/bash
``` ```
Consultez <https://docs.docker.com/reference/builder/> pour la liste Consultez <https://docs.docker.com/reference/builder/> pour la liste complète
complète des instructions reconnues. des instructions reconnues.
## Exposer des ports ## Exposer des ports