tuto wip
This commit is contained in:
parent
7d680b35ef
commit
d900d3f5b8
6
tutorial/Makefile
Normal file
6
tutorial/Makefile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
all: tutorial.pdf
|
||||||
|
|
||||||
|
.md.pdf:
|
||||||
|
pandoc --latex-engine=xelatex --toc --normalize -o $@ $<
|
||||||
|
|
||||||
|
.SUFFIXES: .md .tex .pdf
|
247
tutorial/tutorial.md
Normal file
247
tutorial/tutorial.md
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
# 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
|
Loading…
Reference in New Issue
Block a user