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.