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
[*] Include legacy /proc/<pid>/cpuset file
[*] 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 scheduling for SCHED_OTHER
[*] Group scheduling for SCHED_RR/FIFO
@ -39,7 +34,7 @@ General setup --->
Device Drivers --->
[*] Network device support --->
<M> MAC-VLAN support
<M> Virtual ethernet pair device
<*> Virtual ethernet pair device
Character devices --->
-*- Unix98 PTY support
[*] 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
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.
### Manuellement
@ -106,46 +102,44 @@ Votre distribution fournit sans doute un paquet `lxc`.
# Docker
Docker est un outil haut niveau permettant de faire fonctionner
facilement les conteneurs.
Docker est un outil haut niveau permettant de faire fonctionner facilement les
conteneurs.
## Composition de Docker
Docker est un daemon lancé au démarrage de votre machine, avec lequel
vous interagissez via un client qui se connecte au daemon au moyen
d'une socket (le client peut donc être sur une machine distincte du
daemon où sont exécutés les conteneurs).
Docker est un daemon lancé au démarrage de votre machine, avec lequel vous
interagissez via un client qui se connecte au daemon au moyen d'une socket (le
client peut donc être sur une machine distincte du daemon où sont exécutés les
conteneurs).
## Mon premier conteneur
Afin de tester la bonne marche de votre installation, exécutez la
commande :
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 :
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.
hub.docker.com. Ce site met à votre disposition un grand nombre d'images : 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` :
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` :
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
@ -159,58 +153,55 @@ 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`.
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 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
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 !
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 :
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).
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.
À 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
:
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 !
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 :
@ -218,11 +209,10 @@ 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.
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 :
@ -230,21 +220,22 @@ Installons maintenant un programme :
apt-get install nano
```
En attendant la fin de l'installation, jetez un œil à la commande dans
un autre terminal :
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.
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`.
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` :
Sauvegardez votre image modifiée avec la commande `commit` pour pouvoir
commencer directement de votre image avec `nano` :
```
docker commit CONTAINER my_nano
@ -258,18 +249,16 @@ 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` !
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 :
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
@ -278,17 +267,36 @@ 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.
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.
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, dans le
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
dedans, puis utilisez la commande `build` :
```
COPY db.sql /db.sql
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 .
@ -301,8 +309,8 @@ 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.
Consultez <https://docs.docker.com/reference/builder/> pour la liste complète
des instructions reconnues.
## Exposer des ports