Manipulation des images et construction manuelle

Nous allons construire une image contenant un serveur web et une page web.

Pour ce faire, nous allons procéder manuellement en utilisant la commande docker commit

Démarrer l'image de base

Nous avons besoin d'une base pour créer notre image, en l'occurence nous allons partir de l'image ubuntu.

Exécuter la commande suivante :

docker run ubuntu

Afficher la liste des conteneurs en cours d'exécution.

Où est notre conteneur basé sur Ubuntu ?

Nous avons besoin d'un shell pour réaliser les modifications dans notre image de base avant de faire un docker commit, démarrons donc un conteneur ubuntu avec quelques arguments supplémentaires.

docker run -it ubuntu /bin/bash

Les options -i (--interactive) et -t (--tty) nous permettent d'associer notre interface en ligne de commande à celle du conteneur, que nous démarrons en passant son chemin absolu en commande de démarrage (/bin/bash).

Ajouter nginx à l'image de base

Nous sommes maintenant "à l'intérieur" du conteneur et pouvons réaliser les modifications que nous voulons.

Commençons par installer nginx.

apt-get update
apt-get install nginx

Nous pouvons dès maintenant utiliser les commandes diff et commit pour créer une nouvelle image.

Afficher les différences crées par l'exécution des commandes précédentes (récupérer l'identifiant du conteneur avec docker ps au préalable) :

docker diff <id du conteneur>

Créer une nouvelle image à partir du conteneur

docker commit <id du conteneur>

Quel est le nom de l'image ?

Pour manipuler les images que nous créons de manière plus pratique nous allons lui associer un tag (ou un "nom" par abus de langage)

docker commit <id du conteneur> my-nginx

Il est temps de démarrer un conteneur basé sur l'image que nous venons de créer

docker run my-nginx

Que s'est-il passé ?

Nous allons devoir configurer nginx pour qu'il ne se lance pas en tant que démon.

Avec docker diff, localiser le fichier de configuration de nginx.

Trouver un moyen d'ajouter la directive suivante à la fin du fichier

daemon off;

À nouveau, nous allons utiliser docker commit pour mettre à jour notre image

docker commit <id du conteneur> my-nginx

Pour faire fonctionner nginx, nous allons devoir le lancer comme commande principale du conteneur, sans quoi celui s'arrêtera immédiatement. Nous allons également devoir mapper un port pour pouvoir accéder au serveur depuis un navigateur.

docker run -d -p 8888:80 my-nginx nginx 

Accéder à l'adresse http://localhost:8888/ dans un navigateur.

Ajouter notre page web à notre image

Nous allons ajouter une page web à notre image avec docker cp et utiliser docker commit une dernière fois pour finaliser notre image.

Télécharger la page du présent TP (ctrl+s).

docker cp nous permet d'ajouter un fichier à un conteneur en cours d'exécution. Localiser le chemin servi par nginx dans notre conteneur (en analysant le contenu du fichier de configuration ou en utilisant docker diff)

docker cp <chemin vers page téléchargée> <id du conteneur>:<chemin dans le conteneur>

Mettre à jour l'image et la relancer

docker commit <id du conteneur> my-nginx
docker run -d -p 8888:80 my-nginx nginx

Accéder à l'adresse http://localhost:8888/ dans un navigateur. La page du TP doit s'afficher.