Nächste: Netzwerkverbindungen im Container, Nach oben: Container mit Guix System [Inhalt][Index]
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]