TP1 update
This commit is contained in:
parent
f9ced0f1b5
commit
c2693c0c19
12 changed files with 92 additions and 47 deletions
|
@ -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
|
||||
|
|
|
@ -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`
|
||||
|
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
{ width=85% }
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 292 KiB |
|
@ -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
|
||||
|
|
BIN
tutorial/docker-basis/layers-multi-container.png
Normal file
BIN
tutorial/docker-basis/layers-multi-container.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 78 KiB |
|
@ -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
|
||||
|
|
6
tutorial/docker-basis/secrets.md
Normal file
6
tutorial/docker-basis/secrets.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
\newpage
|
||||
|
||||
Garder des secrets
|
||||
==================
|
||||
|
||||
TODO
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
{ 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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue