Suivant: , Monter: Conteneurs pour le système Guix   [Table des matières][Index]


4.2.1 Un conteneur de base de données

Un bon exemple pourrait être un serveur de base de données PostgreSQL. La majeure partie de la complexité de configuration d’un tel serveur de base de données est encapsulée dans cette déclaration trompeusement courtes :

(service postgresql-service-type
         (postgresql-configuration
          (postgresql postgresql-14)))

Une déclaration de système d’exploitation complète utilisable avec un conteneur du système Guix ressemblerait à ceci :

(use-modules (gnu))
(use-package-modules databases)
(use-service-modules databases)

(operating-system
  (host-name "container")
  (timezone "Europe/Berlin")
  (file-systems (cons (file-system
                        (device (file-system-label "does-not-matter"))
                        (mount-point "/")
                        (type "ext4"))
                      %base-file-systems))
  (bootloader (bootloader-configuration
               (bootloader grub-bootloader)
               (targets '("/dev/sdX"))))
  (services
   (cons* (service postgresql-service-type
                   (postgresql-configuration
                    (postgresql postgresql-14)
                    (config-file
                     (postgresql-config-file
                      (log-destination "stderr")
                      (hba-file
                       (plain-file "pg_hba.conf"
                                   "\
local	all	all			trust
host	all	all	10.0.0.1/32 	trust"))
                      (extra-config
                       '(("listen_addresses" "*")
                         ("log_directory"    "/var/log/postgresql")))))))
          (service postgresql-role-service-type
                   (postgresql-role-configuration
                    (roles
                     (list (postgresql-role
                            (name "test")
                            (create-database? #t))))))
          %base-services)))

Avec postgresql-role-service-type nous définissons un rôle « test » et créons une base de données correspondante, pour que nous puissions le tester immédiatement sans autre paramétrage manuel. Les paramètres de postgresql-config-file permettent à un client de se connecter à partir de l’adresse IP 10.0.0.1 sans authentification — une mauvaise idée en production, mais pratique pour cet exemple.

Construisons un script qui exécutera une instance de ce système Guix dans un conteneur. Écrivez la déclaration operating-system ci-dessus dans un fichier os.scm puis utilisez guix system container pour construire le lanceur (voir Invoquer guix system dans le manuel de référence de GNU Guix).

$ guix system container os.scm
Les dérivations suivantes seront construites :
  /gnu/store/…-run-container.drv
  …
construction de /gnu/store/…-run-container.drv...
/gnu/store/…-run-container

Maintenant que nous avons le script de lancement nous pouvons le lancer pour démarrer le nouveau système avec un service PostgreSQL. Remarquez qu’à cause de limites non encore résolues, nous devons lancer le lanceur en root, par exemple avec sudo.

$ sudo /gnu/store/…-run-container
le conteneur système tourne avec le PID 5983
…

Mettez le processus en fond avec Ctrl-z suivie de bg. Prenez note de l’ID du processus dans la sortie ; nous en aurons besoin pour nous connecter au conteneur plus tard. Vous savez quoi ? Essayons de nous attacher au conteneur immédiatement. Nous utiliserons nsenter, un outil fournit par le paquet util-linux :

$ guix shell util-linux
$ sudo nsenter -a -t 5983
root@container /# pgrep -a postgres
49 /gnu/store/…-postgresql-14.4/bin/postgres -D /var/lib/postgresql/data --config-file=/gnu/store/…-postgresql.conf -p 5432
51 postgres: checkpointer
52 postgres: background writer
53 postgres: walwriter
54 postgres: autovacuum launcher
55 postgres: stats collector
56 postgres: logical replication launcher
root@container /# exit

Le service PostgreSQL tourne dans le conteneur !


Suivant: Utilisation du réseau dans le conteneur, Monter: Conteneurs pour le système Guix   [Table des matières][Index]