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/loglinux:
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