I La communication réseau

I.1 Mapper un port réseau

Dans l’article précédent nous avions téléchargé une image dédiée à mail trap. Et une fois le container lancé, nous voyons que les ports d’écoutes de ce container sont le port 25 (SMPTP) et le port 80(Web).

Or le container n’est pas accessible. C’est normal. Il faut au lancement du container spécifier les ports qui peuvent communiquer.

Dans notre exemple nous allons ouvrir le port 80 de la VM vers le port 80 du container. Ainsi la commande est la suivante :

docker run -p 80:80 -ti eaudeweb/mailtrap

Maintenant il est possible d’accéder au site web. Pour connaitre tous les détails de cette image, il faut aller sur le « hub » de docker. C’est un site web qui recense toutes les images. Pour l’image eaudeweb/mailtrap, les pages web indique que les identifiants roundcube sont : mailtrap/mailtrap.

Pour finir et si on veut que le container soit pleinement fonctionnel il faut également mapper le port.

  • docker run -p 80:80 -p 8025:25 -ti eaudeweb/mailtrap

I.2 Les réseaux privés

Il est possible de placer un docker dans un réseau privé dédié. Tous les containers placés dedans pourront communiquer entre eux.

Mais avant il faut créer ce réseau dans un premier temps :

docker network create reseau1
30e0e2f9ae017018889709ebf82ee024f4d9cc79781c67740c6ab031331fef9b

Pour visualiser la liste des réseaux :

docker network ls
NETWORK ID          NAME                     DRIVER              SCOPE
32ebbe8e1880        bridge                   bridge              local
e802263173bf        docker-compose_default   bridge              local
54bbf7e7b0ee        host                     host                local
2e1c935ffec9        none                     null                local
30e0e2f9ae01        reseau1                  bridge              local

Lancer 2 containers sur le même réseau :

sudo docker run -it --name ubuntu1 --net reseau1 debian bash
sudo docker run -it --name ubuntu2 --net reseau1 debian bash

Ainsi au sein d’un container il est possible de pinguer par exemple l’autre container. Dans le cas ci-dessous nous sommes dans ubuntu2 et voulons pinguer ubuntu1 :

root@a20b978f1d47:/# ping ubuntu1
PING ubuntu1 (172.19.0.2) 56(84) bytes of data.
64 bytes from ubuntu1.reseau1 (172.19.0.2): icmp_seq=1 ttl=64 time=0.117 ms
64 bytes from ubuntu1.reseau1 (172.19.0.2): icmp_seq=2 ttl=64 time=0.046 ms

En revanche si un 3ème container ne spécifie pas ce réseau il ne pourra pas communiquer avec les 2 premiers :

docker run -it --name ubuntu3 debian bash
root@fdd09adb97be:/# ping ubuntu1
ping: ubuntu1: No address associated with hostname
root@fdd09adb97be:/# 

Pour voir le détail du réseau privé fournit par docker :

docker network inspect reseau1
[
    {
        "Name": "reseau1",
        "Id": "30e0e2f9ae017018889709ebf82ee024f4d9cc79781c67740c6ab031331fef9b",
        "Created": "2021-03-13T10:30:45.139434009+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "1055e8e6f0421302ee9371ab978c12544457bdcdb104a6353b530109dc0f16ef": {
                "Name": "ubuntu1",
                "EndpointID": "5ba63bd7039b0656ab363923dc8664bad29a333f93aa51bbfdcf2914dfd9ce07",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "a20b978f1d471f7fe6b522c4d6c6af5d67a3c3b38ec2f1212be1ad463c486b8f": {
                "Name": "ubuntu2",
                "EndpointID": "a83e3b54306f57d94b399f968bae87d36cf65e6f3aec243742b7da466da3d2c0",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

Pour aller plus et comprendre ces mécanismes réseaux : lien

II Container en mode deamon

Lancer un container et laisser un terminal ouvert n’est franchement pas pratique. Il est possible de le lancer en tâche de fond :

  • docker run -d -p 80:80 -p 8025:25 -ti eaudeweb/mailtrap
7e896f3ffd4b8c20347517344373861250660e840ed2ef308136eaa0d9549e3a

Ainsi pour voir quels containers sont en cours d’execution :

  • docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
7e896f3ffd4b eaudeweb/mailtrap "/var/local/docker…" 41 seconds ago Up 41 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:8025->25/tcp admiring_bell

Entrer dans un docker existant :

  • docker exec -it 7e896f3ffd4b bash

Voir la consommation en ressource du container :

  • docker container stats 7e896f3ffd4b
CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS
7e896f3ffd4b 0.03% 22.96 MiB / 991.2 MiB 2.32% 6.63 kB / 17.1 kB 0 B / 2.76 MB 22

Arrêter un container :

  • docker container stop 7e896f3ffd4b
[root@localhost ~]# docker ps -a
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
 7e896f3ffd4b        eaudeweb/mailtrap   "/var/local/docker…"   7 minutes ago       Exited (137) About a minute ago                       admiring_bell

Supprimer un container (pas une image) :

  • docker container rm 7e896f3ffd4b

III Associer une ressource externe au container

Le fait de redémarrer le container implique que toutes les modifications seront perdues. Dans le cas de mailtrap, ce n’est pas trop grave. Mais dans le cas par exemple d’un serveur web ce n’est pas possible. L’idée de créer une nouvelle image n’est pas une solution (Cela fonction mais c’est peu pratique). L’autre idée est d’indiquer qu’un ou plusieurs répertoires du container soit mapper vers un répertoire extérieur. On dit que l’on va mapper un répertoire.

Nous allons prendre le container centos et mapper le répertoire /var/log du container vers le répertoire ~/lab/persistence :

  • docker run -ti -v ~/lab/persistence/:/var/log/ centos

PS : si au sein du container il y a un problème de droit, il faut se pencher sur le SE Linux du système hôte. C’est lui qui bloque les accès du container vers le répertoire extérieur.

Pour revenir à notre répertoire log, cet exemple fonctionne mais n’est pas probant. Dans le cas d’un container qui contient apache par exemple, mapper le répertoire WWW peut en revanche être plus qu’utile !

IV Docker-compose

IV.1 Installation

Docker compose est un outil qui va permettre de définir l’ensemble des options d’un container au sein d’un seul fichier. Ceci afin d’éviter de lancer une ligne de commande très longue.

Mais avant il faut l’installer. Pour cela aller sur le site https://docs.docker.com/compose/install/ et suivre les instruction.

Sous centos :

Récupérer les fichiers :

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Rendre exécutable :

sudo chmod +x /usr/local/bin/docker-compose

Sous ubuntu :

apt install docker-compose

Vérifier que cela fonctionne:

docker-compose -v
docker-compose version 1.24.0, build 0aa59064

L’installation est terminée

IV. 2 Utilisation

Création d’un répertoire qui va contenir l’ensemble des fichiers de configurations pour docker-compose

mkdir ~/docker-compose
cd ~/docker-compose

Le fichier doit comporter le nom docker-compose.yml

Création du fichier de configuration :

touch docker-compose.yml

Exemple d’un premier contenu :

version: '3.7'
services:
        mail_test-dev:
                image: eaudeweb/mailtrap
                container_name: mailtrap-test1
                ports:
                        - "8080:80"
                        - "8025:25"
                volumes:
                        - /home/xavior/docker-compose/persistence/mailtrap/:/var/log/

Le conteneur se nommera « Mail_test_dev » avec un chiffre à la fin. L’image du conteneur sera « eaudeweb/mailtrap ». Une ouverture de 2 ports sont faits (web et SMTP). Enfin un partage de ressources fichiers est fait entre l’hôte et le conteneur.

Pour connaitre la version du moteur docker :

La version à indiquer dans le fichier yaml est fonction de la version du moteur docker. Lien pour savoir quel version à utilise : lien

sudo docker -v
Docker version 19.03.8, build afacb8b7f0

Pour exécuter cette configuration :

  • docker-compose up
Starting mailtrap-test1 ... done
Attaching to mailtrap-test1
mailtrap-test1   | User 1000 already exists - mailtrap, skipping creation.
mailtrap-test1   | Starting enhanced syslogd: rsyslogdrsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
mailtrap-test1   | rsyslogd: activation of module imklog failed [v8.1901.0 try https://www.rsyslog.com/e/2145 ]
mailtrap-test1   | .
mailtrap-test1   | Starting Postfix Mail Transport Agent: postfix.
mailtrap-test1   | Starting IMAP/POP3 mail server: dovecot.
...

Pour quitter, faire CTRL-C.

Ce fichier peut contenir la configuration de plusieurs containers. Exemple ci-dessous :

version: '3.7'
 services:
         mail_test-dev:
                 image: eaudeweb/mailtrap
                 container_name: mailtrap-test1
                 ports:
                         - "8080:80"
                         - "8025:25"
                 volumes:
                         - /home/xavior/docker-compose/persistence/mailtrap:/var/log
         linux:
                 image: centos
                 container_name: linux_centos

Nous avons 2 containers : un serveur centos et un serveur de mail.

Puis pour exécuter l’ensemble :

  • docker-compose up
Starting mailtrap-test1 ... done
 Starting linux_centos   ... done
 Attaching to mailtrap-test1, linux_centos mailtrap-test1   |
 User 1000 already exists - mailtrap, skipping creation. linux_centos exited with code 0
 mailtrap-test1   |
 Starting enhanced syslogd: rsyslogdrsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted. mailtrap-test1   |
 rsyslogd: activation of module imklog failed [v8.1901.0 try https://www.rsyslog.com/e/2145 ] mailtrap-test1   |
 . mailtrap-test1   |
 Starting Postfix Mail Transport Agent: postfix. mailtrap-test1   |
 Starting IMAP/POP3 mail server: dovecot. mailtrap-test1   | Starting Apache httpd web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message 

IV. 3 Quelques commandes utiles

En mode démon il faut ajouter l’option -d :

  • docker-compose up -d

Pour arrêter les containers :

  • docker-compose stop

Pour supprimer les containers

  • docker-compose rm

Docker : réseau, volume, docker-compose

Laisser un commentaire

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