TP1: Corrections and rephrasing
This commit is contained in:
parent
9587e183c8
commit
651283b526
@ -6,6 +6,8 @@ SOURCES = tutorial.md \
|
|||||||
../docker-basis/volumes.md \
|
../docker-basis/volumes.md \
|
||||||
../docker-basis/ex-flask-volume.md \
|
../docker-basis/ex-flask-volume.md \
|
||||||
../docker-basis/linking.md \
|
../docker-basis/linking.md \
|
||||||
|
../docker-basis/ex-flask-s3.md \
|
||||||
|
../docker-basis/debug.md \
|
||||||
|
|
||||||
SOURCES_COURSE = tutorial.md \
|
SOURCES_COURSE = tutorial.md \
|
||||||
../containers/overview.md \
|
../containers/overview.md \
|
||||||
|
@ -44,13 +44,21 @@ docker container rm cranky_jones dreamy_gates
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### Images
|
### Images et autres objets
|
||||||
|
|
||||||
Les vieilles images qui n'ont plus de références sur elle (ni tag, ni conteneur
|
De la même manière que pour les conteneurs, nous pouvons lister tous les autres
|
||||||
lié) sont automatiquement supprimées. Vous n'avez généralement pas à vous
|
objets avec la sous-commande `ls` :
|
||||||
occuper de faire du nettoyage dans les images. Néanmoins, vous pouvez les gérer
|
|
||||||
de la même manière que les conteneurs, avec les sous-commandes `docker image`.
|
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```bash
|
||||||
|
docker image ls
|
||||||
|
docker volume ls
|
||||||
|
docker [object] ls
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Et les supprimer avec la sous-commande `rm` suivie du nom ou de l'identifiant
|
||||||
|
de l'objet (pour les images, il faut aussi préciser le tag en plus du nom).
|
||||||
|
|
||||||
### `prune`
|
### `prune`
|
||||||
|
|
||||||
|
81
tutorial/docker-basis/debug.md
Normal file
81
tutorial/docker-basis/debug.md
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
\newpage
|
||||||
|
|
||||||
|
Intervenir durant l'exécution
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Lorsque nous lançons un conteneur, il arrive que son comportement nous
|
||||||
|
échappe : une imprécision dans la documentation, un cas particulier, une erreur
|
||||||
|
de configuration, ... Lorsque le conteneur est en cours d'exécution, il y a
|
||||||
|
plusieurs manières de contrôler ce qu'il se passe.
|
||||||
|
|
||||||
|
|
||||||
|
docker logs
|
||||||
|
-----------
|
||||||
|
|
||||||
|
La première étape consiste bien souvent à regarder ce que le conteneur affiche
|
||||||
|
sur ses sorties standard et d'erreur. Lorsqu'il est lancé en monde *daemon*, il
|
||||||
|
convient d'utiliser la commande :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```bash
|
||||||
|
docker container logs 0a1b2c3d4e
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Cela affichera l'intégralité des journaux depuis la création du conteneur.
|
||||||
|
|
||||||
|
En ajoutant l'option `--follow` lorsque le conteneur est actif, cela laissera
|
||||||
|
la commande active `logs` pour afficher en direct les nouvelles lignes
|
||||||
|
inscrites sur les sorties du conteneur.
|
||||||
|
|
||||||
|
|
||||||
|
Entrer dans un conteneur en cours d'exécution
|
||||||
|
---------------------------------------------
|
||||||
|
|
||||||
|
Dans certaines circonstances, les journaux ne sont pas suffisants pour déboguer
|
||||||
|
correctement l'exécution d'un conteneur.
|
||||||
|
|
||||||
|
En réalisant les exercices, vous serez sans doute confronté à des comportements
|
||||||
|
étranges, que vous ne pourriez comprendre qu'en ayant la main sur le conteneur,
|
||||||
|
à travers un shell.
|
||||||
|
|
||||||
|
Lorsqu'un conteneur est actif, vous pouvez y lancer un nouveau processus,
|
||||||
|
notamment un shell par exemple :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```bash
|
||||||
|
docker container exec -it mycloud /bin/bash
|
||||||
|
(inctnr)# hostname
|
||||||
|
0a1b2c3d4e5f
|
||||||
|
(inctnr)# ping mysql_cntr_name
|
||||||
|
...
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
On peut aussi imaginer lancer régulièrement une commande par ce biais : pour
|
||||||
|
déclencher une sauvegarde d'un conteneur serveur de base de données ou pour
|
||||||
|
exécuter une tâche périodique.
|
||||||
|
|
||||||
|
::::: {.question}
|
||||||
|
|
||||||
|
Il n'est pas possible d'`exec` dans un conteneur éteint. Aussi, si la commande
|
||||||
|
initiale du conteneur se termine, tous les `exec` seront instantanément tués.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
|
||||||
|
docker top
|
||||||
|
----------
|
||||||
|
|
||||||
|
Si plusieurs processus doivent s'exécuter dans un conteneur, un bon moyen de
|
||||||
|
savoir s'ils sont tous actifs est d'utiliser :
|
||||||
|
|
||||||
|
<div lang="en-US">
|
||||||
|
```bash
|
||||||
|
docker container top cntr_name
|
||||||
|
```
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Cela liste tous les processus rattaché au conteneur nommé : à la fois les
|
||||||
|
processus démarrés par le `run`, mais également les éventuels processus
|
||||||
|
rattachés par `exec`.
|
@ -77,16 +77,22 @@ docker container run -d -p 8080:8080 registry.nemunai.re/youp0m
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
::::: {.question}
|
||||||
|
|
||||||
|
#### Où est la sortie standard ? {-}
|
||||||
|
|
||||||
À partir de l'identifiant renvoyé par cette commande (que l'on peut également
|
À partir de l'identifiant renvoyé par cette commande (que l'on peut également
|
||||||
obtenir avec un `docker container ls`), nous pouvons consulter les logs du
|
obtenir avec un `docker container ls`), nous pouvons consulter les logs du
|
||||||
service (en fait, les sorties standard et d'erreur) :
|
service (en fait, les sorties standard et d'erreur) :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```bash
|
```bash
|
||||||
docker container logs 0123456789abcdef
|
docker container logs 0a1b2c3d4e
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
|
||||||
### Une autre instance ?
|
### Une autre instance ?
|
||||||
|
|
||||||
|
@ -217,6 +217,8 @@ docker image ls
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Nous utiliserons plus tard les autres objets dont Docker dispose.
|
||||||
|
|
||||||
|
|
||||||
### *Image ID*, nom, tag
|
### *Image ID*, nom, tag
|
||||||
|
|
||||||
@ -282,8 +284,8 @@ transféré dans le conteneur.
|
|||||||
|
|
||||||
Pour nous en convaincre, nous pouvons tenter d'exécuter un programme qui n'est
|
Pour nous en convaincre, nous pouvons tenter d'exécuter un programme qui n'est
|
||||||
pas présent sur notre machine, mais bien uniquement dans le conteneur. Si vous
|
pas présent sur notre machine, mais bien uniquement dans le conteneur. Si vous
|
||||||
n'utilisez pas [Alpine Linux](https://www.alpinelinux.org), vous pourriez
|
n'utilisez pas [Alpine Linux](https://www.alpinelinux.org) comme distribution
|
||||||
tenter d'utiliser son gestionnaire de paquet `apk`, via :
|
hôte, vous pourriez tenter d'utiliser son gestionnaire de paquet `apk`, via :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```bash
|
```bash
|
||||||
@ -291,6 +293,9 @@ docker container run alpine /sbin/apk stats
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Vous n'avez a priori pas le binaire `/sbin/apk` sur votre système. C'est bien
|
||||||
|
celui du conteneur qui a été exécuté.
|
||||||
|
|
||||||
|
|
||||||
### Programme par défaut
|
### Programme par défaut
|
||||||
|
|
||||||
@ -422,11 +427,27 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
::::: {.question}
|
||||||
|
|
||||||
|
#### Avez-vous remarqué que le `CONTAINER ID` correspond au nom d'hôte du conteneur ? {-}
|
||||||
|
|
||||||
|
À la création du conteneur, Docker génère un identifiant unique qu'il attribue
|
||||||
|
au conteneur. Au passage, les premiers chiffres sont utilisés pour définir le
|
||||||
|
nom d'hôte du conteneur.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
|
Chaque ligne représente un conteneur en cours d'exécution. Pour toutes les
|
||||||
|
commandes qui permettent d'interagir avec un conteneur, il est possible
|
||||||
|
d'utiliser indifféremment l'identifiant du conteneur (long ou court) ou bien le
|
||||||
|
nom qu'il lui a été attribué (soit automatiquement par Docker, dans ce cas le
|
||||||
|
nom ressemblera à un adjectif suivi du nom d'une personnalité de l'informatique
|
||||||
|
connue, soit par vous, via l'option `--name` du `run`).
|
||||||
|
|
||||||
### Sortir d'un conteneur
|
### Sortir d'un conteneur
|
||||||
|
|
||||||
Pour mettre fin à l'exécution d'un conteneur, il convient de terminer le
|
Pour mettre fin à l'exécution d'un conteneur, il convient de terminer le
|
||||||
premier processus lancé dans celui-ci.
|
premier processus lancé dans celui-ci (le processus au PID 1).
|
||||||
|
|
||||||
Si vous faites face à une invite de commande, le classique `exit` ou `^D`
|
Si vous faites face à une invite de commande, le classique `exit` ou `^D`
|
||||||
mettra fin au *shell*, qui était le premier processus lancé de notre conteneur,
|
mettra fin au *shell*, qui était le premier processus lancé de notre conteneur,
|
||||||
|
@ -3,29 +3,25 @@
|
|||||||
Stockage de données applicatives
|
Stockage de données applicatives
|
||||||
================================
|
================================
|
||||||
|
|
||||||
Le concept principal de Docker est de concevoir des conteneurs applicatifs : on
|
Il est généralement toujours possible d'écrire dans le système de fichier de
|
||||||
va préférer assigner un unique rôle à un conteneur (donc généralement on ne va
|
notre conteneur. (Cela n'affecte pas l'image, chaque conteneur est démarré à
|
||||||
lancer qu'une seule application par conteneur) et concevoir un service complet
|
partir de l'image originale.) Cependant, il n'est pas recommandé de chercher à
|
||||||
en créant un groupe de conteneurs, partageant des données entre eux par des
|
stocker des données ainsi. En effet, il n'est pas aisé de récupérer ces données
|
||||||
volumes.
|
une fois l'exécution du conteneur terminée ; les données peuvent même être
|
||||||
|
détruite si on a lancé le conteneur avec l'option `--rm`.
|
||||||
|
|
||||||
Il est possible d'utiliser la dernière couche en lecture/écriture pour inscrire
|
Docker met donc à notre disposition plusieurs mécanismes pour que les données
|
||||||
des données. Il n'est cependant pas recommandé de stocker des données de cette
|
de nos applications persistent et soient prêtes à être migrées d'un conteneur à
|
||||||
manière, car elles ne vont pas persister une fois que le conteneur aura terminé
|
l'autre.
|
||||||
son exécution ; elles seront alors plus compliquées à retrouver manuellement.
|
|
||||||
|
|
||||||
Docker met à notre disposition plusieurs mécanismes pour que les données de nos
|
|
||||||
applications persistent et soient prêtes à migrer plus facilement vers une
|
|
||||||
solution plus apte à la décentralisation.
|
|
||||||
|
|
||||||
|
|
||||||
## Partage avec la machine hôte
|
## Partage avec la machine hôte
|
||||||
|
|
||||||
Il est possible de monter un répertoire de la machine hôte dans un
|
Il est possible de partager un répertoire de la machine hôte avec un
|
||||||
conteneur. L'intérêt reste plutôt limité à des fins de facilité ou de test, par
|
conteneur. L'intérêt reste plutôt limité à des fins de facilité ou de test, par
|
||||||
exemple si vous voulez partager des fichiers avec votre voisin, en passant par
|
exemple si vous voulez partager des fichiers en passant par le protocole HTTP,
|
||||||
le protocole HTTP, mais sans se casser la tête à installer et configurer un
|
mais sans se casser la tête à installer et configurer un serveur web, vous
|
||||||
serveur web :
|
pourriez utiliser :
|
||||||
|
|
||||||
<div lang="en-US">
|
<div lang="en-US">
|
||||||
```bash
|
```bash
|
||||||
@ -33,14 +29,17 @@ docker run --rm -p 80:80 -v ~/Downloads:/usr/share/nginx/html:ro -d nginx
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Une fois cette commande lancée, votre voisin pourra accéder à votre dossier
|
Une fois le conteneur lancé, vous pourrez accéder à votre dossier *Downloads*
|
||||||
Downloads en renseignant l'IP de votre machine dans son navigateur favori !
|
en renseignant l'IP de votre machine dans un navigateur !
|
||||||
|
|
||||||
|
::::: {.warning}
|
||||||
|
|
||||||
Par défaut, `nginx` ne va pas permettre de lister le contenu du répertoire (et
|
Par défaut, `nginx` ne va pas permettre de lister le contenu du répertoire (et
|
||||||
va afficher une page 404, car il cherche un fichier `index.html` dans votre
|
va afficher une page 404, car il cherche un fichier `index.html` dans votre
|
||||||
répertoire). Vous pouvez par contre accéder à un fichier directement, par
|
répertoire). Vous pouvez par contre accéder à un fichier directement, par
|
||||||
exemple : <http://10.42.12.23/dQw4w9WgXcQ.mp4>
|
exemple : <http://10.42.12.23/dQw4w9WgXcQ.mp4>
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
## Les volumes
|
## Les volumes
|
||||||
|
|
||||||
@ -77,9 +76,12 @@ docker container run --name mydb -e MYSQL_ROOT_PASSWORD=my-secret-pw \
|
|||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Lorsque le volume est vide, si des données sont présentes à l'endroit du point
|
::::: {.question}
|
||||||
de montage, celles-ci sont recopiées dans le volume.
|
|
||||||
|
|
||||||
|
Lorsque le volume est vide, si des données sont présentes dans l'image à
|
||||||
|
l'endroit du point de montage, celles-ci sont recopiées dans le volume.
|
||||||
|
|
||||||
|
:::::
|
||||||
|
|
||||||
## Volumes temporaires
|
## Volumes temporaires
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user