Nächste: , Nach oben: Container mit Guix System   [Inhalt][Index]


4.2.1 Ein Datenbank-Container

Ein geeignetes Beispiel wäre ein PostgreSQL-Datenbankserver. Die Komplexität, ihn aufzusetzen, können Sie großenteils in einer verführerisch kurzen Dienstdeklaration einfangen:

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

Eine vollumfängliche Betriebssystemdeklaration, die Sie für einen Guix-System-Container verwenden könnten, sähe in etwa so aus:

(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 "ist-egal"))
                        (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)))

Mit postgresql-role-service-type definieren wir eine Rolle namens „test“ und lassen eine zugehörige Datenbank erzeugen, so dass wir gleich mit dem Testen anfangen können ohne weitere manuelle Schritte. Mit den Einstellungen in postgresql-config-file wird einem Client mit der IP-Adresse 10.0.0.1 die Berechtigung verliehen, eine Verbindung zur Datenbank aufzubauen, ohne sich authentisieren zu müssen – eigentlich keine gute Idee bei Produktivsystemen, aber für dieses Beispiel geeignet.

Erstellen wir uns ein Skript, das eine Instanz dieses Guix-Systems als Container anlegt. Nachdem Sie obige Betriebssystemdeklaration mit dem operating-system in eine Datei os.scm speichern, entsteht das Startprogramm für den Container durch einen Aufruf von guix system container (siehe Aufruf von guix system in Referenzhandbuch zu GNU Guix).

$ guix system container os.scm
Folgende Ableitungen werden erstellt:
  /gnu/store/…-run-container.drv
  …
/gnu/store/…-run-container.drv wird erstellt …
/gnu/store/…-run-container

Jetzt, wo unser Startprogramm fertig ist, können wir es ausführen und ein neues System mit einem laufenden PostgreSQL-Dienst entschlüpft. Anmerkung: Aufgrund derzeit noch ungelöster Einschränkungen kann das Startprogramm nur mit Administratorrechten ausgeführt werden, zum Beispiel mit sudo.

$ sudo /gnu/store/…-run-container
system container is running as PID 5983
…

Versetzen Sie den Prozess in den Hintergrund, indem Sie Strg-z drücken und danach bg eingeben. Achten Sie auf die ausgegebene Prozesskennung (PID); wir brauchen sie später noch, um uns mit dem Container zu verbinden. Wissen Sie was? Schauen wir uns doch gleich an, wie Sie eine Verbindung zum Container herstellen. Dazu benutzen wir nsenter, ein Werkzeug, das im Paket util-linux zu finden ist:

$ 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

Wie Sie sehen, läuft der PostgreSQL-Dienst im Container!


Nächste: Netzwerkverbindungen im Container, Nach oben: Container mit Guix System   [Inhalt][Index]