Exposer un conteneur
Objectifs de cet atelier pratique
- 
Rendre une application qui tourne dans un conteneur publiquement accessible depuis la machine hôte. 
- 
Partager des données entre un conteneur et le système hôte. 
Comment utiliser une image Docker ?
Avant de lancer une image Docker, vous souhaitez probablement en savoir plus
sur les options appropriées à utiliser avec la commande docker run pour cette
image donnée.
Prenons l'exemple du serveur web Nginx :
- 
Rendez-vous sur Docker Hub. 
- 
Cherchez l'image officielle (Official build) de Nginx. 
- 
Repérez la section How to use this image. 
Préférez les images officielles
Idéalement, il vaut mieux s'en tenir aux images officielles sur Docker Hub pour être à l'abri des malwares.
Rendre une application publiquement accessible
Nous allons utiliser l'exemple de la section Exposing external port en l'adaptant à nos besoins :
- L'option -p 8080:80signifie simplement qu'il faut ouvrir le port TCP 8080 sur la machine hôte de Docker et rediriger le trafic vers et depuis ce port vers le port TCP 80 à l'intérieur du conteneur Nginx. Autrement dit, le port 8080 représente le monde extérieur, le port 80 le monde intérieur du conteneur.
Voyons si le conteneur fonctionne :
$ docker ps
CONTAINER ID   IMAGE  ...  PORTS                  NAMES
a92710efd101   nginx  ...  0.0.0.0:8080->80/tcp   mon_nginx
- 0.0.0.0:8080signifie que toutes les adresses IP locales de notre machine hôte servent sur le port TCP 8080, et que celui-ci est dirigé vers le port 80 à l'intérieur du conteneur.
Voyons ce que fait Nginx lorsque nous essayons de nous connecter au conteneur :
Nous venons de lancer notre premier conteneur Docker publiquement accessible. Un grand pas pour nous, un petit pas pour l'humanité.
Ouvrez un navigateur web sur la machine hôte pour accéder au serveur web Nginx qui tourne dans le conteneur :
- http://localhost:8080
Si le conteneur tourne sur une autre machine du réseau, vous pouvez accéder au serveur Nginx comme ceci par exemple :
- http://sandbox.microlinux.lan:8080
Alternativement, utilisez l'adresse IP de la machine :
- http://192.168.2.4:8080
Affichez les requêtes d'accès au serveur web :
$ docker logs mon_nginx
...
192.168.2.2 - - [30/Jun/2023:06:05:10 +0000] "GET / HTTP/1.1" 200 615 "-"
"Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0" "-"
Arrêtez le conteneur :
Partager des données entre l'hôte et le conteneur
À présent, essayons de remplacer la page par défaut de Nginx par du contenu personnalisé :
$ mkdir -v ~/pagesweb
mkdir: création du répertoire '/home/kikinovak/pagesweb'
$ echo '<h1>Le site web de Nico</h1>' > pagesweb/index.html
Lancez un conteneur Nginx avec une option supplémentaire comme ceci :
$ docker run --name autre_nginx -d -p 8080:80 \
-v $PWD/pagesweb:/usr/share/nginx/html:ro nginx
6b456addfb69fb9fe5acdec3dd4e5e7fbad0808edaac0ac28293979b036e4c0d
- 
$PWDest une simple variable d'environnement Bash qui fournit le répertoire de travail (present working directory).
- 
L'option -vcrée un volume pour le partage de fichiers. La syntaxe est-vsuivi du chemin d'accès vers le répertoire sur la machine hôte auquel le conteneur est censé avoir accès, suivi de deux-points, suivi du chemin d'accès vers le répertoire du conteneur qui accèdera à ces données. Si vous souhaitez fournir des options, vous aurez besoin d'un autre deux-points, suivi des options. En l'occurrence, nous avons utiliséroqui signifie read only, et qui monte le volume en lecture seule à l'intérieur du conteneur. Cela veut dire que les fichiers peuvent être modifiés depuis la machine hôte de Docker, mais le conteneur ne pourra pas modifier les fichiers. Le conteneur pourra uniquement lire les données contenues dans le volume. Dans mon exemple, le répertoire/home/kikinovak/pageswebest disponible dans/usr/share/nginx/htmlà l'intérieur du conteneur Docker.
Nous aurons l'occasion de voir de plus près ce concept de partage de fichiers entre l'hôte et le conteneur, qui fera l'objet d'un atelier pratique à part.
Voyons à présent si nous pouvons accéder à cette page personnalisée en envoyant une requête vers le port 8080 du système hôte :
Et depuis une autre machine :
Pour finir, faites un brin de ménage :
À vous de jouer !
- 
Recherchez l'image officielle du serveur web Apache sur Docker Hub. 
- 
Télécharchez la dernière version de l'image. 
- 
Renseignez-vous sur les options courantes à utiliser avec cette image. 
- 
Lancez un conteneur apache_bienvenuepubliquement accessible sur le port 9900 du système hôte.
- 
Vérifiez si le conteneur tourne correctement. 
- 
Jetez un œil sur la configuration de la redirection des ports. 
- 
Utilisez la commande curlen ligne de commande pour afficher la page par défaut du serveur web.
- 
Affichez cette page avec un navigateur web sur la machine hôte. 
- 
Créez un répertoire ~/mapagesur le système hôte, contenant un fichierindex.htmlavec le contenu<h1>Coucou !</h1>.
- 
Lancez un conteneur apache_coucoupubliquement accessible sur le port 9901 du système hôte, et qui utilise votre pageindex.htmlpersonnalisée comme page par défaut dans un volume partagé en lecture seule. Reportez-vous à la section How to use this image sur Docker Hub pour en savoir plus sur la configuration du serveur Apache, notamment l'emplacement de la page web par défaut.
- 
Vérifiez si le conteneur tourne correctement et jetez un œil sur la configuration de la redirection des ports. 
- 
Là encore, affichez votre page personnalisée sur le système hôte en utilisant successivement curlet un navigateur web.
- 
Ouvrez un navigateur web sur une machine distante et connectez-vous successivement aux deux serveurs web tournant sur les conteneurs apache_bienvenueetapache_coucou.
- 
Affichez le suivi des journaux d'accès et essayez d'identifier le ou les postes clients qui se connectent aux deux serveurs. 
- 
Arrêtez les deux conteneurs apache_bienvenueetapache_coucouet faites le ménage sur votre système.

