Docker explications et installation sur un machine Debian 10 (Article 1)

Je vais commencer une série sur Docker(pas d’un coup bien sûr 🙂 ) où j’expliquerai ce qu’est Docker et comment l’installer dans un premier article. Et par la suite (dans d’autres articles) j’expliquerai comment l’utiliser.

1. Qu’est ce qu’un conteneur ? Qu’est-ce que Docker ?

Vous connaissez la virtualisation avec des hyperviseurs VMWare, Hyper-V, Proxmox etc… ? Et bien dans la virtualisation vous avez une machine physique avec un OS, par dessus vous avez l’hyperviseurs (parfois même l’hypervieurs et l’OS font partie de la même couche). Au dessus de l’hyperviseur une machine virtuelle à qui nous allons attribuer des ressources hardaware (CPU, RAM etc …). Enfin sur la machine virtuelle vous avez un OS avec dedans une application.

Dans le conteneur, et bien on ne va pas avoir la couche hyperviseur ni la couche VM on va avoir le hardware, l’OS de la machine hôte puis l’applications qui s’exécutera dans un environnement isolé (le conteneur).

Schématisons cela :

Dans la virtualisation, on a la liberté d’installer un OS Windows, Linux ou autre dans une machine virtuelle alors qu’on l’a vue le conteneur n’a pas d’OS mais un environnement d’exécution; il va donc se reposer sur l’OS, c’est à dire le noyau de la machine hôte. Donc concrètement on ne pourra utiliser uniquement des conteneurs ayant le même noyau que l’hôte. C’est à dire des conteneurs Linux.

L’avantage avec la conteneurisation c’est que le conteneur va accéder plus rapidement aux ressources, le déploiement est très rapide même beaucoup plus rapide.

En résumé (ce qui ressort souvent), la virtualisation (avec les hyperviseurs) c’est de la virtualisation matérielle et les conteneurs sont de la virtualisation système.

Et Docker alors ?

Eh bien c’est un des logiciels de conteneurisation open source qui permet justement de gérer des conteneurs Linux.

2. Installer Docker sur Debian 10

Nous allons faire un « apt update » :

root@DockerSAVOIRITLAB:~# apt update

Et nous allons installer les paquets suivants :

root@DockerSAVOIRITLAB:~# apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

On ajoute ensuite la clé GPG :

curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

On ajoute ensuite le repo docker :

root@DockerSAVOIRITLAB:~# echo \
>   "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
>   $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

On update les packages (pour pouvoir installé les nouveaux)car on a rajouté un autre miroir :

root@DockerSAVOIRITLAB:~# apt update

On installe ensuite la community édition de docker :

root@DockerSAVOIRITLAB:~# apt install docker-ce 

On start le service et on l’enable(cette étape n’est pas nécessaire car de base le service est start et actif il me semble) :

root@DockerSAVOIRITLAB:~# systemctl start docker
root@DockerSAVOIRITLAB:~# systemctl enable docker
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker

On va vérifier que tout est fonctionnel. On va d’abord vérifier la version de Docker :

root@DockerSAVOIRITLAB:~# docker version
Client: Docker Engine - Community
 Version:           20.10.5
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        55c4c88
 Built:             Tue Mar  2 20:17:50 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.5
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Tue Mar  2 20:15:47 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

On a la version 20.10.15 et surtout on a un docker client et un docker serveur très important pour la suite de l’utilisation de Docker.

Pour vérifier que cela fonctionne bien on va lancer un conteneur :

root@DockerSAVOIRITLAB:~# docker run  hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Tout fonctionne bien ! On d’ailleurs le message « Hello from Docker!
This message shows that your installation appears to be working correctly.
 » qui nous indique que tout fonctionne correctement.

Docker est installé on va pouvoir passer à la suite et voir comment utiliser Docker dans les prochains tutos.

Logs distants avec rsyslog

Nous allons voir dans ce tuto comment envoyer des logs à un serveurs rsyslog.

Tout d’abord qu’est ce que syslog ?

1. Qu’est ce Syslog ?

Syslog est un protocole réseau fonctionnant sur le port UDP 514 (pour les logs distants). Il permet de journaliser les événements passés sur le système. Plus précisément il va recevoir les messages de la part des démons. Ces messages sont envoyés avec deux autres informations :

  1. La catégorie du message
  2. La gravité du message

Listes des catégories :

Source : https://fr.wikipedia.org/wiki/Syslog#:~:text=Syslog%20est%20un%20protocole%20d%C3%A9finissant,%C3%A9v%C3%A9nements%20d’un%20syst%C3%A8me%20informatique

La gravité est divisée en 8 niveaux :

Source : https://fr.wikipedia.org/wiki/Syslog#:~:text=Syslog%20est%20un%20protocole%20d%C3%A9finissant,%C3%A9v%C3%A9nements%20d’un%20syst%C3%A8me%20informatique

2. Configuration du serveur rsyslog

Contexte : nous avons deux machines, une machine de type serveur qui se nomme Librenms ( je réutilise cette machine pour les logs qui a aussi comme fonction un serveur de supervision que j’aurai l’occasion de vous présenter plus tard 😉 ) et une machine cliente LAMP que l’on configurera dans la partie 3.

Nous allons éditer le fichier « /etc/rsyslog.conf »

root@librenms:~# vim /etc/rsyslog.conf 

Nous allons décommenter ces 2 lignes (en bleu) pour activer la réception des logs sur le port UDP 514 :

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

J’enregistre le fichier de conf sur VIM « :wq » 🙂 .

Je restart le service rsyslog.

root@librenms:~# systemctl restart rsyslog.service 

3. Configuration de la machine cliente

Dans la machine distante j’édite le fichier de configuration de rsyslog :

root@LAMP:~# vim /etc/rsyslog.conf 

Je me dirige vers la section « RULES » :

Et rajouter cette ligne :

 *.info @192.168.1.219

192.168.1.219 représente mon serveur rsyslog (LIBRENMS) qui va recevoir les logs distant de mon serveur LAMP.

*.info : « * » tout types de logs et « info » le niveau de logs transmis. C’est à dire tout les logs de niveau 6 est en dessous donc : info, notice, warn, err, crit, alert & emergency.

Je restart mon service sur la machine cliente :

root@LAMP:~# systemctl restart rsyslog.service 

Si je redémarre mon serveur Apache sur la machine LAMP je verrais les logs sur le syslog de librenms :

root@LAMP:~# systemctl restart apache2.service 

Sur Librenms :

root@librenms:~# tail -f /var/log/syslog

Mar  7 14:56:40 LAMP systemd[1]: Stopped The Apache HTTP Server.
Mar  7 14:56:40 LAMP systemd[1]: Starting The Apache HTTP Server...

On voit bien que la machine est identifiée (surlignée en bleu).

Cependant, mélanger les logs LAMP avec les logs système de librenms, c’est pas très propre et, en plus de cela, si on a plusieurs clients ça va être difficilement gérable. De ce fait nous allons classifier les logs en fonctions des hôtes et par dates comme cela il y aura une meilleure organisation.

4. Classifier les logs par hôte distant.

Nous allons retourner sur le serveur (Librenms) et nous allons créer un template qui va faire en sorte de créer un dossier par client. J’édite donc le fichier de configuration de rsyslog :

root@librenms:~# vim /etc/rsyslog.conf 

Dans les RULES je rajoute la règle suivante:

$template syslogclients,"/var/log/syslogclients/%hostname%/%$now%.log"
*.* ?syslogclients

Expliquons ces lignes :

$template syslogclients : le nom de mon template pour toutes les machines distantes qui enverrons des logs vers moi.

/var/log/syslogclients/%hostname%/%$now%.log : le chemin répertoriant les logs de ces machines qui seront classifier par noms de machine (à l’aide des dossiers) et dans chacun de ces dossier la date.

%hostname% : pour le nom de l’hôte

%$now%.log : pour la date

Pour les propriétés si vous souhaitez les modifier je vous invite à lire la doc rsyslog : https://www.rsyslog.com/doc/master/configuration/properties.html

*.* ?syslogclients : cela veur dire que nous acceptons pour ce templates tous les logs entrants.

Maintenant si je fait des actions sur mon client « LAMP  » :

root@LAMP:~# systemctl restart apache2.service
root@LAMP:~# systemctl restart apache2.service
root@LAMP:~# logger -p user.info "TEST LOG SUR LIBRENMS"
root@LAMP:~# systemctl restart mariadb.service 

Remarque : logger permet d’entrer un message dans le système de log.

Je vais sur mon serveur rsyslog :

Je vois qu’un dossier portant le nom de ma machine est bien créé, ainsi qu’un fichier de log avec comme nom la date. Celui-ci se trouve dans mon dossier LAMP :

Et si je regarde son contenu je vois bien les logs de ma machine LAMP :

root@librenms:/var/log/syslogclients/LAMP# cat 2021-03-07.log

Mar  7 15:11:15 LAMP systemd[1]: Stopping The Apache HTTP Server...
Mar  7 15:11:15 LAMP systemd[1]: apache2.service: Succeeded.
Mar  7 15:11:15 LAMP systemd[1]: Stopped The Apache HTTP Server.
Mar  7 15:11:15 LAMP systemd[1]: Starting The Apache HTTP Server...
Mar  7 15:11:15 LAMP systemd[1]: Started The Apache HTTP Server.
Mar  7 15:17:01 LAMP CRON[1816]: pam_unix(cron:session): session opened for user root by (uid=0)
Mar  7 15:17:01 LAMP CRON[1817]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Mar  7 15:17:01 LAMP CRON[1816]: pam_unix(cron:session): session closed for user root
Mar  7 15:19:10 LAMP root: TEST LOG SUR LIBRENMS
Mar  7 15:19:16 LAMP systemd[1]: Stopping MariaDB 10.3.27 database server...
Mar  7 15:19:17 LAMP systemd[1]: mariadb.service: Succeeded.
Mar  7 15:19:17 LAMP systemd[1]: Stopped MariaDB 10.3.27 database server.
Mar  7 15:19:17 LAMP systemd[1]: Starting MariaDB 10.3.27 database server...
Mar  7 15:19:17 LAMP mysqld[1888]: 2021-03-07 15:19:17 0 [Note] /usr/sbin/mysqld (mysqld 10.3.27-MariaDB-0+deb10u1) starting as process 1888 ...
Mar  7 15:19:17 LAMP mysqld[1888]: 2021-03-07 15:19:17 0 [Warning] Could not increase number of max_open_files to more than 16384 (request: 32183)
Mar  7 15:19:17 LAMP systemd[1]: Started MariaDB 10.3.27 database server.
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1923]: Upgrading MySQL tables if necessary.
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1926]: /usr/bin/mysql_upgrade: the '--basedir' option is always ignored
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1926]: Looking for 'mysql' as: /usr/bin/mysql
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1926]: Looking for 'mysqlcheck' as: /usr/bin/mysqlcheck
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1926]: This installation of MySQL is already upgraded to 10.3.27-MariaDB, use --force if you still need to run mysql_upgrade
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1934]: Checking for insecure root accounts.
Mar  7 15:19:17 LAMP /etc/mysql/debian-start[1938]: Triggering myisam-recover for all MyISAM tables and aria-recover for all Aria tables
Mar  7 15:23:50 LAMP kernel: [ 5472.807720] audit: type=1400 audit(1615127030.428:7): apparmor="DENIED" operation="capable" profile="/usr/bin/man" pid=1979 comm="man" capability=1  capname="dac_override"
Mar  7 15:25:15 LAMP root: TEST LOG SUR LIBRENMS   111111

C’est terminé avec ce tuto vous êtes maintenant capable de centraliser vos logs avec rsyslog 😀 .