Voir comment créer ou modifier des images.

I Préparation espace de travail

Création d’un répertoire de travail :

mkdir ~/dockerfile
cd ~/dockerfile
mkdir image1
cd image1

Le fichier doit avoir le nom « Dockerfile ».

touch Dockerfile

II Les variables qui seront utilisées

  • FROM permet de définir depuis quelle base votre image ve être créée
  • MAINTAINER permet de définir l’auteur de l’image et s’écrit de la manière suivante Nom <email>
  • RUN permet de lancer une commande, mais aura aussi pour effet de créer une image intermédiaire.
  • ADD permet de copier un fichier depuis la machine hôte ou depuis une URL
  • EXPOSE permet d’exposer un port du container vers l’extérieur
  • CMD détermine la commande qui sera exécutée lorsque le container démarrera
  • ENTRYPOINT permet d’ajouter une commande qui sera exécutée par défaut, et ce, même si on choisit d’exécuter une commande différente de la commande standard
  • WORKDIR permet de définir le dossier de travail pour toutes les autres commandes (par exemple RUN, CMD, ENTRYPOINT et ADD) ENV permet de définir des variables d’environnements qui pourront ensuite être modifiées grâce au paramètre de la commande run --env <key>=<value>.
  • VOLUMES permet de créer un point de montage qui permettra de persister les données. On pourra alors choisir de monter ce volume dans un dossier spécifique en utilisant la commande `run -v :

Pour plus d’information : lien vers docker

III Mon premier Dockerfile

Premier contenu :

# Image de base 
FROM centos 
# Qui maintien 
MAINTAINER Union31xh union31xh@gmail.com 

# Installation 
RUN yum -y update

Sauver puis compiler le fichier :

  • docker build -t union31xh/image1 .

Le -t est pour mettre un tag à l’image sous forme auteur/nom_projet. Le « . » est pour désigner le répertoire courant

Exemple de sortie :

Sending build context to Docker daemon 2.048 kB
 Step 1/3 : FROM centos
  ---> 9f38484d220f
 Step 2/3 : MAINTAINER Union31xh union31xh@gmail.com
  ---> Using cache
  ---> 9ca0e8b832cb
 Step 3/3 : RUN yum -y  update
  ---> Running in c4434d7f7cea
 Loaded plugins: fastestmirror, ovl
 Determining fastest mirrors
 base: centos.mirrors.proxad.net
 extras: centos.mirrors.ovh.net 

Si on relance le build :

Sending build context to Docker daemon 2.048 kB
 Step 1/3 : FROM centos
  ---> 9f38484d220f
 Step 2/3 : MAINTAINER Union31xh union31xh@gmail.com
  ---> Using cache
  ---> 9ca0e8b832cb
 Step 3/3 : RUN yum -y  update
  ---> Using cache
  ---> d0fd866d30f6
 Successfully built d0fd866d30f6

C’est beaucoup plus rapide car l’ensemble des fichiers sont déjà présents…

L’image est maintenant dans docker :

  • docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
 union31xh/image1              latest              d0fd866d30f6        8 minutes ago       401 MB
 centos-test                   latest              1b5c255408dd        2 days ago          202 MB
 docker.io/centos              latest              9f38484d220f        3 months ago        202 MB
 docker.io/eaudeweb/mailtrap   latest              adfbd16b7ba0        6 months ago        269 MB

Création d’un script « un_script.sh » dans le répertoire courant :

#! /bin/bash
echo "--> Bonjour !!!"

Ce script va être ajouté dans l’image et sera executé. Dans le fichier Dockerfile :

# Image de base
FROM centos

# Qui maintien
MAINTAINER Union31xh <union31xh@gmail.com>

RUN yum -y  update

# copie du script vers l'image
ADD un_script.sh /usr/bin/un_script.sh
# rend le script executable
RUN chmod 755 /usr/bin/un_script.sh

CMD ["un_script.sh"]

On rebuild l’image :

  • docker build -t union31xh/image1 .
Sending build context to Docker daemon 3.072 kB
 Step 1/6 : FROM centos
  ---> 9f38484d220f
 Step 2/6 : MAINTAINER Union31xh union31xh@gmail.com
  ---> Using cache
  ---> 9ca0e8b832cb
 Step 3/6 : RUN yum -y  update
  ---> Using cache
  ---> d0fd866d30f6
 Step 4/6 : ADD un_script.sh /usr/bin/un_script.sh
  ---> Using cache
  ---> 6fbe8d3b2df2
 Step 5/6 : RUN chmod 755 /usr/bin/un_script.sh
  ---> Running in 2f17b159f2e2
 ---> 7fc29898df1b
 Removing intermediate container 2f17b159f2e2
 Step 6/6 : CMD un_script.sh
  ---> Running in 68b39783f4ff
  ---> bf21b050b930
 Removing intermediate container 68b39783f4ff
 Successfully built bf21b050b930

Testons l’image :

  • docker run –rm -ti union31xh/image1
[root@localhost image1]# docker run --rm -ti union31xh/image1
 --> Bonjour !!!

(L’option –rm est pour supprimer le container une fois exécuté)

Le container s’est lancé mais à toute de suite quitter. En effet tous les processus ont été executés sans de mise en « attente ». De ce fait docker à supprimer le container.

Pour cela nous allons modifier le script est ajouté un bash en execution :

#! /bin/bash

echo "--> Bonjour !!!"
bash

On rebuild l’image :

  • docker build -t union31xh/image1 .

On lance le container (en mode démon) :

  • docker run –rm -d -ti union31xh/image1

Est-il toujours en exécution ?

  • docker ps -all
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 ad667d81d739        union31xh/image1    "un_script.sh"      10 seconds ago      Up 9 seconds                            tender_spence

Oui …

IV Mon deuxième Dockerfile

Nous allons maintenant faire une image utile. Elle contiendra apache et php afin de créer un premier environnement de développement.

Création de l’espace de travail :

cd ~/dockerfile
mkdir image2
cd image2
touch Dockerfile

Premier contenu du fichier :

# A partir de quelle image
FROM centos:7

# Qui maintien
MAINTAINER Union31xh <union31xh@gmail.com>

# permet d'activer le systemd (par defaut non actif)
#   indications Centos sur le HUB DOCKER
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]

RUN yum -y update
RUN yum -y install httpd
RUN yum clean all
RUN systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

On fabrique l’image :

  • docker build -t union31xh/image2 .

On vérifie :

  • docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
 union31xh/image2              latest              9ad2357b2e76        12 seconds ago      565 MB

On lance le container :

  • docker run –rm -d -ti union31xh/image2

On vérifie la présence du container :

  • docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 22be41836dfb        union31xh/image2    "/bin/bash"         42 seconds ago      Up 41 seconds       80/tcp              boring_euler

Le container est bien lancé mais le serveur apache n’est pas accessible. En effet un oubli de liaison de port a été fait.

On tue le container puis on le relance :

  • docker container rm -f 22be41836dfb
  • docker run –rm -d -ti -p 80:80 union31xh/image2

La page web « apache » est maintenant accessible

Il ne reste plus qu’a rajouter PHP. Editons le fichier Dockerfile

# A partir de quelle image
FROM centos:7

# Qui maintien
MAINTAINER Union31xh <union31xh@gmail.com>

# permet d'activer le systemd (par defaut non actif)
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
#VOLUME [ "/sys/fs/cgroup" ]


RUN yum -y update
RUN yum -y install httpd
RUN yum -y install php
RUN yum -y install php-common

RUN yum clean all

RUN systemctl enable httpd.service

EXPOSE 80

CMD ["/usr/sbin/init"]

Et on recommence : build

Avant de lancer le container, on va mapper le repertoire /var/www/html vers le répertoire hôte ~/www.

Création du répertoire :

  • mkdir ~/www

Puis lançons le container avec ce nouveau répertoire mappé

  • docker run –rm -d -ti -p 80:80 -v ~/www:/var/www/html union31xh/image2

Ainsi tous ce qui se trouvera dans ~/www sera lu par le container.

Docker : dockerfile

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *