TP1 update

This commit is contained in:
nemunaire 2019-10-01 11:03:15 +02:00
parent f9ced0f1b5
commit c2693c0c19
12 changed files with 92 additions and 47 deletions

View file

@ -1,6 +1,6 @@
include ../pandoc-opts.mk
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md rendu.md
SOURCES = tutorial.md installation.md what.md first.md cleaning.md ex-flask.md volumes.md linking.md secrets.md rendu.md
all: tutorial.pdf

View file

@ -17,7 +17,7 @@ l'option `--rm`.
## Conteneurs
Nous pouvons afficher l'ensemble des conteneurs, quelque soit leur état (en
cours d'exécution, arrêtés, ...) avec la commande suivante :
cours d'exécution, arrêtés,\ ...) avec la commande suivante :
<div lang="en-US">
```
@ -57,7 +57,13 @@ de la même manière que les conteneurs, avec les sous-commandes `docker image`.
## `prune`
Dans la plupart des menus permettant de gérer les objets Docker, vous trouverez
une commande `prune` qui supprimera les objets inutilisés.
une commande `prune` qui supprimera les objets inutilisés :
<div lang="en-US">
```bash
docker container prune
```
</div>
## `docker-gc`

View file

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Before After
Before After

View file

@ -55,10 +55,10 @@ Si vous n'êtes pas particulièrement inspiré, vous pouvez ajouter ces images :
<div lang="en-US">
```bash
wget -O- https://you.p0m.fr/images/lynx4 | base64 | curl --data @- http://localhost:8080/api/images/lynx
wget -O- https://you.p0m.fr/images/otters | base64 | curl --data @- http://localhost:8080/api/images/otters
wget -O- https://you.p0m.fr/images/DNcrZ6u | base64 | curl --data @- http://localhost:8080/api/images/DNcrZ6u
wget -O- https://you.p0m.fr/images/raccoons | base64 | curl --data @- http://localhost:8080/api/images/raccoons
for IMG in lynx4 otters DNcrZ6u raccoons; do
wget -O- https://you.p0m.fr/images/$IMG | base64 | \
curl --data @- http://localhost:8080/api/images/$IMG
done
```
</div>
@ -96,7 +96,7 @@ absolument un clone de <https://food.p0m.fr/> !
Il s'agit du même service, mais ce n'est pas les mêmes images.
On ne peut pas utiliser le même port sur la machine hôte, mais pour le reste,
il s'agit des mêmes options :
il s'agit des mêmes options\ :
<div lang="en-US">
```bash
@ -107,8 +107,8 @@ docker container run -d -p 8080:8081 nemunaire/youp0m
Voyons le résultat : <http://localhost:8081>
Nous avons réussi à lancer deux conteneurs à partir de la même image, et on
voit bien que ceux-ci ne partagent pas leur système de fichiers. Notre nouvelle
instance est encore immaculée.
voit bien que ceux-ci ne partagent pas leur système de fichiers : notre
nouvelle instance est encore immaculée.
## Arrêt des conteneurs et persistance des données

View file

@ -12,18 +12,18 @@ docker container run hello-world
```
</div>
Cette commande va automatiquement exécuter une série de commandes pour nous,
Cette commande va automatiquement exécuter une série d'actions pour nous,
comme indiqué dans le message affiché en retour :
D'abord, le daemon 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
`store.docker.com`. Ce site met à 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.
*hello-world*. Si ce n'est pas le cas, il va aller récupérer les différentes
couches de l'image sur le registre par défaut (celui de Docker). Il assemble
ensuite les images en ajoutant une couche en lecture/écriture, propre au
conteneur. Enfin, il lance la commande par défaut, telle que définie dans les
métadonnées de l'image.
Nous pouvons directement utiliser le client pour rechercher une image sur le
*Store*, en utilisant la commande `search` :
registre, en utilisant la commande `search` :
<div lang="en-US">
```bash
@ -31,8 +31,8 @@ docker search mariadb
```
</div>
Il est possible de mettre à jour les images locales ou simplement
pré-télécharger des images depuis le Store en utilisant la commande `pull` :
Il est possible de mettre à jour les images locales, ou télécharger les couches
d'images qui nous intéressent, en utilisant la commande `pull` :
<div lang="en-US">
```bash
@ -40,6 +40,9 @@ docker image pull ubuntu
```
</div>
### Arguments de la ligne de commande
Remarquez comment on interagit avec chaque *objet Docker* : dans la ligne de
commande, le premier mot clef est le type d'objet (`container`, `image`,
`service`, `network`, `volume`, ...) ; ensuite, vient l'action que l'on
@ -64,6 +67,9 @@ docker image ls
```
</div>
### Tag
Vous devriez constater la présence de plusieurs images « Ubuntu », mais chacune
a un *TAG* différent. En effet, souvent, il existe plusieurs versions d'une même
image. Pour Ubuntu par exemple, nous avons la possibilité de lancer la version
@ -81,7 +87,7 @@ 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 !
nous allons pouvoir jouer avec !
La commande `run` de Docker prend comme derniers arguments le programme à
lancer dans le conteneur ainsi que ses éventuels arguments. Essayons d'afficher
@ -118,8 +124,8 @@ très rapide et ne consomme pas beaucoup d'espace disque.
Étant donné que chaque conteneur est créé à partir d'un modèle, cela signifie
que lorsque nous exécutons une commande modifiant les fichiers d'un conteneur,
cela ne modifie pas l'image de base, mais crée une nouvelle image. Que nous
pouvons ensuite utiliser comme image de base.
cela ne modifie pas l'image de base. La modification reste contenue dans la
couche propre au conteneur dans l'UnionFS.
![Images vs. conteneurs](img-vs-cntr.png "Images vs. conteneurs"){ width=85% }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 292 KiB

Before After
Before After

View file

@ -26,7 +26,7 @@ Assurez-vous également d'avoir un noyau récent, avec la commande `uname -r` :
<div lang="en-US">
```
4.18.11-gentoo
5.2.14-gentoo
```
</div>
@ -41,7 +41,7 @@ a été nommé [`docker.io`](https://packages.debian.org/sid/docker.io).
Si dans un environnement de production, on préférera sans doute utiliser une
version déjà bien éprouvée, pour ce cours, nous allons avoir besoin de la
dernière version disponible. Référez-vous à la documentation officielle
**dernière version disponible**. Référez-vous à la documentation officielle
correspondant à votre distribution :
<https://docs.docker.com/install/linux/docker-ce/debian/>
@ -58,7 +58,7 @@ Debian *Jessie or newer*.
Bien que les fonctionnalités de contenerisation de Docker que nous utiliserons
ne soient disponibles que sous Linux, il est possible d'utiliser Docker de
manière déportée : le daemon Docker tournera dans une VM Linux, mais vous
pourriez interagir avec lui via votre ligne de commande habituelle.
pourrez interagir avec lui via votre ligne de commande habituelle.
Téléchargez la version correspondante à votre système d'exploitation :
@ -92,21 +92,21 @@ Une sortie similaire au bloc suivant devrait apparaître sur votre écran :
<div lang="en-US">
```
Client:
Version: 18.06.1-ce
API version: 1.38
Go version: go1.10.3
Git commit: e68fc7a
Built: Sun Sep 9 10:14:56 2018
Version: 19.03.2
API version: 1.40
Go version: go1.12.9
Git commit: 6a30dfc
Built: Mon Sep 16 15:56:27 2019
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 18.06.1-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: e68fc7a
Built: Sun Sep 9 10:13:21 2018
Version: 19.03.2
API version: 1.40 (minimum version 1.12)
Go version: go1.12.9
Git commit: 6a30dfc
Built: Mon Sep 16 15:55:09 2019
OS/Arch: linux/amd64
Experimental: true
```
@ -119,8 +119,9 @@ Historiquement, Docker est un projet open-source. Depuis quelques années, le
business-model de la société a évolué et ils proposent désormais deux
éditions : *Community Edition* et *Enterprise Edition*. La seconde est payante
et possède un certain nombre d'atouts pour faciliter son adoption en entreprise
(notamment pas mal d'interfaces graphiques, etc.). Le cœur de la technologie
est quant à lui entièrement présent dans l'édition communautaire.
(notamment pas mal d'interfaces graphiques, etc.). Le cœur de la technologie,
qui nous intéresse princialement dans ce cours, est entièrement présent dans
l'édition communautaire, sans limitation.
Depuis mars 2017, les numéros de version de Docker sont tirés de l'année et
du mois de parution (comme on a l'habitude avec Ubuntu 16.04 par exemple). Le

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View file

@ -98,6 +98,29 @@ mutuellement se découvrir grâce à un système de résolution de nom basé sur
nom de conteneur.
## Entrer dans un conteneur en cours d'exécution
Dans certaines circonstances, les journaux ne sont pas suffisant pour
déboguer correctement l'exécution d'un conteneur.
<div lang="en-US">
```bash
docker container run mysql
```
</div>
...
<div lang="en-US">
```bash
docker container exec -it /bin/bash
ip ...
```
</div>
Notez qu'il n'est pas possible d'`exec` dans un conteneur éteint, et que si la commande initiale du conteneur se termine, tous les `exec` seront également tués.
## Exercice {-}
À vous maintenant de connecter une instance de `nemunaire/fic-admin` à sa base

View file

@ -0,0 +1,6 @@
\newpage
Garder des secrets
==================
TODO

View file

@ -3,14 +3,14 @@ title: Virtualisation légère -- TP n^o^ 1
subtitle: Les bases de Docker
author: Pierre-Olivier *nemunaire* [Mercier]{.smallcaps}
institute: EPITA
date: Jeudi 4 octobre 2018
date: Mercredi 2 octobre 2019
abstract: |
Durant ce premier TP, nous allons apprendre à utiliser Docker !
\vspace{1em}
Le TP se termine par un petit projet à rendre à <virli@nemunai.re>
au plus tard le jeudi 18 octobre 2018 à 8 h 42, des questions de
au plus tard le mercredi 16 octobre 2018 à 13 h 42, des questions de
cours sont également à compléter avant cette date sur
Epitaf. Consultez la dernière partie de ce TP pour les modalités.

View file

@ -8,13 +8,14 @@ Docker est un écosystème d'outils de haut niveau, permettant d'utiliser des
Docker est composé d'un daemon lancé au démarrage de votre machine, avec lequel
vous interagissez via un client (le programme `docker`). La communication entre
le daemon et le client s'effectuant sur une API REST au travers d'une
socket. D'ailleurs, le client peut ne pas être sur la même machine qui
exécutera effectivement les conteneurs.
le daemon et le client s'effectuant sur une API REST généralement au travers
d'une socket.
C'est ce qu'il se passe lorsqu'on utilise *Docker4Windows* ou *Docker4Mac* :
une machine virtuelle Linux est lancée parallèlement au système de base et
chaque commande `docker` tapée est passée au deamon dans la machine virtuelle.[^dockermachine]
Le client peut d'ailleurs ne pas être sur la même machine qui exécutera
effectivement les conteneurs. C'est ce qu'il se passe lorsqu'on utilise
*Docker4Windows* ou *Docker4Mac* : une machine virtuelle Linux est lancée
parallèlement au système de base et chaque commande `docker` tapée est passée
au deamon dans la machine virtuelle.[^dockermachine]
[^dockermachine]: Il suffit de modifier la variable d'environnement
`DOCKER_HOST` ou de passer le paramètre `-H` suivi de l'URL de la socket à
@ -33,8 +34,8 @@ Une image peut, par exemple, contenir :
* un serveur web et votre application web, prêts à l'emploi,
* ...
Les images sont utilisées comme modèle qui sera dupliqué lorsque l'on
démarre un nouveau conteneur.
Les images sont utilisées comme **modèle** qui sera ensuite dupliqué à chaque
fois que l'on démarrera un nouveau conteneur.
Il y a deux méthodes pour obtenir des images Docker : soit les construire avec
les outils fournis, soit les récupérer depuis un registre.
@ -48,6 +49,8 @@ chaque fois que vous lancez un conteneur, une couche lecture/écriture est
ajoutée au dessus de l'image. Cette couche est propre au conteneur et
temporaire : l'image n'est pas modifiée par l'exécution d'un conteneur.
![Couches d'un conteneur](layers-multi-container.png "Couches d'un conteneur"){ width=70% }
Chaque conteneur s'exécute dans un environnement restreint et distinct de
l'environnement principal (où vous avez votre bureau). Par exemple, dans cet
environnement, vous ne pouvez pas voir les processus qui sont situés en dehors,