Ceci est une ancienne révision du document !


Version : 2020.02 - Consulter le Change Log en fin de module.

Dernière mise-à-jour : 2020/03/03 14:01

DOF104 - Docker par la Pratique

Cette unité contient trois LABs :

  • LAB #8 - Lancer Nagios dans un container,
  • LAB #9 - Lancer Wordpress dans un container,
  • LAB #10 - Gestion d'une Architecture de Microservices.

LAB #8 - Lancer Nagios dans un container

Créez le répertoire /root/nagios et placez-vous dedans :

root@debian9:~# mkdir nagios
root@debian9:~# cd nagios
root@debian9:~/nagios# 

Créez le fichier Dockerfile suivant :

root@debian9:~/nagios# vi Dockerfile
root@debian9:~/nagios# cat Dockerfile
FROM ubuntu:14.04 
RUN apt-get update && \ 
  apt-get -y install wget && \ 
  wget https://raw.github.com/learning-nagios/nagios-install/master/install.sh && \
  sh install.sh
EXPOSE 80
ADD entrypoint.sh /entrypoint.sh
CMD ["sh", "/entrypoint.sh"]

Créez ensuite le fichier entrypoint.sh :

root@debian9:~/nagios# vi entrypoint.sh
root@debian9:~/nagios# cat entrypoint.sh
#!/bin/sh
# capture stop signals from Docker
trap stop_all 1 2 3 4 5 6 15
stop_all() {
    echo "Stopping services..."
    /etc/init.d/nagios stop
    apachectl stop
}
start_all() {
    echo "Starting services..."
    apachectl start
    /etc/init.d/nagios start
}
# start services and wait indefinitely
start_all
sleep 10000d

Créez maintenant l'image :

root@debian9:~/nagios# docker build --tag automated_nagios_image .

Une fois l'image construite, créez un conteneur ainsi :

root@debian9:~/nagios# docker run -p 8080:80 automated_nagios_image

Vérifiez que votre conteneur fonctionne :

root@debian9:~/nagios# docker ps -a
CONTAINER ID        IMAGE                    COMMAND               CREATED             STATUS              PORTS                  NAMES
23d6feb6e799        automated_nagios_image   "sh /entrypoint.sh"   5 minutes ago       Up 5 minutes        0.0.0.0:8080->80/tcp   peaceful_zhukovsky
...

Ouvrez une session en mode graphique dans la machine virtuelle Debian 8 et lancez le navigateur web. Saisissez l'adresse suivante :

http://localhost:8080/nagios

Vous devez obtenir la boîte de dialogue d'authentification. Connectez-vous avec le compte nagiosadmin / nagiosadmin.

LAB #9 - Lancer Wordpress dans un container

Créez le répertoire ~/wordpress et placez-vous dedans :

root@debian9:~# mkdir ~/wordpress && cd ~/wordpress

Créez un conteneur dénommé wordpressdb à partir de l'image mariadb:latest :

root@debian9:~/wordpress# docker run -e MYSQL_ROOT_PASSWORD=fenestros -e MYSQL_DATABASE=wordpress --name wordpressdb -v "$PWD/database":/var/lib/mysql -d mariadb:latest
Unable to find image 'mariadb:latest' locally
latest: Pulling from library/mariadb
f2b6b4884fc8: Pull complete 
26d8bdca4f3e: Pull complete 
74f09e820cce: Pull complete 
5390f1fe4554: Pull complete 
3d3f1706a741: Pull complete 
2942f66426ea: Pull complete 
97ee11d39c75: Pull complete 
590c46ef722b: Pull complete 
32eb4b9666e5: Pull complete 
fc883f98a064: Pull complete 
bb8bee61bc1e: Pull complete 
Digest: sha256:6135f5b851e7fe263dcf0edf3480cdab1ab28c4287e867c5d83fbe967412ea14
Status: Downloaded newer image for mariadb:latest
67831dacf002bdc21dc79b0e8483f538235d00ddd2e8aae175ef3ebf189ae14d

Vérifiez que le conteneur fonctionne :

root@debian9:~/wordpress# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
67831dacf002        mariadb:latest      "docker-entrypoint.s…"   About a minute ago   Up 45 seconds       3306/tcp            wordpressdb

Créez un conteneur appellé wordpress lié au conteneur wordpressdb :

root@debian9:~/wordpress# docker run -e WORDPRESS_DB_PASSWORD=fenestros --name wordpress --link wordpressdb:mysql -p 10.0.2.15:80:80 -v "$PWD/html":/var/www/html -d wordpress
Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
2a72cbf407d6: Pull complete 
273cd543cb15: Pull complete 
ec5ac8875de7: Pull complete 
9106e19b56c1: Pull complete 
ee2f70ac7c7d: Pull complete 
7257ad6985e8: Pull complete 
18f5c2055da2: Pull complete 
85293a6fdd80: Pull complete 
9e797eeb0c14: Pull complete 
f16178842884: Pull complete 
13899c06d3f8: Pull complete 
70c27fe4c3c5: Pull complete 
d32c8ad2d9d7: Pull complete 
07fe445494e6: Pull complete 
63b8de7b32fe: Pull complete 
e4b721952e22: Pull complete 
d9ede6dd6f74: Pull complete 
0af4f74bfd92: Pull complete 
e4e7c47b969f: Pull complete 
69aff47f3112: Pull complete 
Digest: sha256:201d004f55669dd2c0884f00fc44145fb0da8cafa465bf22cbaacecaf81138d4
Status: Downloaded newer image for wordpress:latest
9eb2f7fbfbd25307ed2f463c7eb3bef40bfa556174e68750bb76b8d032546129

Vérifiez que le conteneur fonctionne :

root@debian9:~/wordpress# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
9eb2f7fbfbd2        wordpress           "docker-entrypoint.s…"   2 minutes ago       Up About a minute   10.0.2.15:80->80/tcp   wordpress
67831dacf002        mariadb:latest      "docker-entrypoint.s…"   9 minutes ago       Up 8 minutes        3306/tcp               wordpressdb

Vérifiez que le Wordpress fonctionne :

root@debian9:~/wordpress# lynx --dump http://10.0.2.15
   [1]WordPress
   Select a default language [English (United States)________]

   Continue

References

   1. https://wordpress.org/

root@debian9:~/wordpress# docker inspect wordpress | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
                    
root@debian9:~/wordpress# lynx --dump http://172.17.0.3
   [1]WordPress
   Select a default language [English (United States)________]

   Continue

References

   1. https://wordpress.org/

LAB #10 - Gestion d'une Architecture de Microservices

Vous allez mettre en place une application simple sous forme de microservices, développé par Docker et appelé demo-voting-app, :

Dans cette application le conteneur voting-app permet de voter pour des chats ou des chiens. Cette application tourne sous Python et fournit une interface HTML :

Lors de la vote, le résultat de celle-ci est stocké dans Redis dans une base de données en mémoire. Le résultat est ensuite passé au conteneur Worker qui tourne sous .NET et qui met à jour la base de données persistante dans le conteneur db qui tourne sous PostgreSQL.

L'application result-app qui tourne sous NodeJS lit ensuite la table dans la base de données PostgreSQL et affiche le résultat sous forme HTML :

Cette application peut être mise en place sous docker avec les commandes suivantes :

docker run -d --name=redis redis
docker run -d --name=db postgres:9.4
docker run -d --name=vote -p 5000:80 --link redis:redis dockersamples/examplevotingapp_vote
docker run -d --name=result -p 5001:80 --link db:db dockersamples/examplevotingapp_result
docker run -d --name=worker --link db:db --link redis:redis dockersamples/examplevotingapp_worker

Cette solution utilise un réseau de type Bridge. Ce type de réseau est limité aux conteneurs d'un hôte unique exécutant Docker. Les conteneurs ne peuvent communiquer qu'entre eux et ils ne sont pas accessibles depuis l'extérieur. Pour que les conteneurs sur le réseau puissent communiquer ou être accessibles du monde extérieur, il faut configurer le mappage de port.


ChangeLog

2020.01

Première version en 2020.

2020.02

  • Added - LAB #10 - Gestion d'une Architecture de Microservices

<html>

Copyright © 2020 Hugh NORRIS

</html>

Menu