2015-10-22 03:25:20 +00:00
|
|
|
\newpage
|
|
|
|
|
2016-09-08 01:44:20 +00:00
|
|
|
`Dockerfile`
|
|
|
|
============
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-15 20:49:27 +00:00
|
|
|
## Ma première image ... par `Dockerfile`
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-04 23:42:56 +00:00
|
|
|
Pour construire une image, nous ne sommes pas obligés 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 `Dockerfile` suivant :
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
|
|
|
FROM ubuntu:latest
|
|
|
|
|
|
|
|
RUN apt-get update
|
|
|
|
RUN apt-get install -y nano
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
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 le
|
|
|
|
but de le construire.
|
|
|
|
|
|
|
|
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` :
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-04 23:42:56 +00:00
|
|
|
docker image build --tag=my_editor .
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
Une fois la construction de l'image terminée, vous pouvez la lancer et
|
|
|
|
constater l'existence de notre éditeur favori :
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-04 23:42:56 +00:00
|
|
|
docker container run -it my_editor /bin/bash
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
## `RUN` dans le `Dockerfile`
|
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
Dans un `Dockerfile`, chaque ligne est exécutée indépendamment des autres et
|
|
|
|
correspondra à une nouvelle couche de notre image.
|
2016-09-08 01:44:20 +00:00
|
|
|
|
|
|
|
Cela signifie que l'exemple suivant **ne fonctionne pas** :
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
|
|
|
COPY db.sql /db.sql
|
|
|
|
RUN service mysqld start
|
|
|
|
RUN mysql -u root -p toor virli < /db.sql
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
Cet exemple ne fonctionne pas car le serveur MySQL qui est lancé dans le
|
|
|
|
premier `RUN`, n'est plus lancé au moment du deuxième `RUN`. En effet, chaque
|
|
|
|
commande du `Dockerfile` a pour but de modifier le système de fichiers.
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
Pour avoir le résultat escompté, il faut exécuter les commandes ensemble :
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
|
|
|
COPY db.sql /db.sql
|
|
|
|
RUN service mysqld start && mysql -u root -p toor virli < /db.sql
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
Après le `RUN`, MySQL sera de nouveau arrêté, si on veut l'utiliser dans le
|
|
|
|
conteneur, il ne faudra pas oublier de lancer le processus.
|
|
|
|
|
|
|
|
|
|
|
|
## Exposer des ports
|
|
|
|
|
|
|
|
Construisons maintenant un conteneur avec un serveur web :
|
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
|
|
|
FROM my_editor
|
|
|
|
|
|
|
|
RUN apt-get update
|
|
|
|
RUN apt-get install -y nginx
|
|
|
|
|
|
|
|
EXPOSE 80
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
L'instruction `EXPOSE` sera traitée plus tard par le client Docker (équivalent
|
|
|
|
à l'argument `--expose`). Il s'agit de préciser les ports sur lesquels votre
|
|
|
|
image écoute.
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
En utilisant l'option `-P` du `run`, vous allez pouvoir assigner une
|
2017-10-16 20:59:22 +00:00
|
|
|
redirection de port aléatoire sur la machine hôte vers votre conteneur :
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-04 23:42:56 +00:00
|
|
|
docker image build --tag=my_webserver .
|
|
|
|
docker container run -it -P my_webserver /bin/bash
|
2015-10-22 03:25:20 +00:00
|
|
|
service nginx start
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
Dans un autre terminal, lancer un `docker ps` et consulter la colonne *PORTS*
|
|
|
|
pour connaître le port choisi par Docker pour effectuer la redirection.
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
Rendez-vous ensuite dans votre navigateur sur <http://localhost:49153/>.
|
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
*À vous de jouer :* utilisez l'instruction `COPY` pour afficher votre propre
|
|
|
|
`index.html` remplaçant celui installé de base par nginx.
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Lancement de commande automatique
|
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
Vous pouvez placer dans un `Dockerfile` une instruction `CMD` qui sera exécutée
|
|
|
|
si aucune commande n'est passée lors du `run`, par exemple :
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
|
|
|
CMD nginx -g "daemon off;"
|
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-17 06:29:07 +00:00
|
|
|
<div lang="en-US">
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-04 23:42:56 +00:00
|
|
|
docker image build --tag=my_nginx .
|
|
|
|
docker container run -d -P my_nginx
|
2015-10-22 03:25:20 +00:00
|
|
|
```
|
2017-10-17 06:29:07 +00:00
|
|
|
</div>
|
2015-10-22 03:25:20 +00:00
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
L'option `-d` passée au `run` lance le conteneur en tâche de fond. Si vous
|
|
|
|
constatez via un `docker container ls` que le conteneur s'arrête directement,
|
|
|
|
retirez cette option pour voir ce qui ne va pas, ou utilisez la commande
|
|
|
|
`docker container logs`.
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
## D'autres instructions ?
|
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
Consultez <https://docs.docker.com/engine/reference/builder/> pour la liste
|
|
|
|
complète des instructions reconnues.
|
2015-10-22 03:25:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Rendu
|
|
|
|
|
|
|
|
Rendez le fichier `Dockerfile` et son contexte (`index.html`, fichiers de conf
|
2017-10-16 20:59:22 +00:00
|
|
|
éventuels, ...) que vous avez utilisé pour réaliser votre image `my_webserver`.
|
2017-10-08 22:08:33 +00:00
|
|
|
|
2017-10-16 20:59:22 +00:00
|
|
|
Une attention particulière sera apportée au respect des différentes bonnes
|
|
|
|
pratiques vues en cours pour l'écriture du `Dockerfile`.
|