Próximo: , Acima: Contêineres do Sistema Guix   [Conteúdo][Índice]


4.2.1 Um banco de dados de contêineres

Um bom exemplo pode ser um servidor de banco de dados PostgreSQL. Grande parte da complexidade de configurar tal servidor de banco de dados está encapsulada nesta declaração de serviço enganosamente curta:

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

Uma declaração completa do sistema operacional para uso com um contêiner do sistema Guix seria algo como isto:

(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)))

Com postgresql-role-service-type definimos uma função “test” e criamos um banco de dados correspondente, para que possamos testar imediatamente sem nenhuma configuração manual adicional. As configurações do postgresql-config-file permitem que um cliente do endereço IP 10.0.0.1 se conecte sem exigir autenticação — uma má ideia em sistemas de produção, mas conveniente para este exemplo.

Vamos construir um script que irá iniciar uma instância deste Guix System como um contêiner. Escreva a declaração operating-system acima em um arquivo os.scm e então use guix system container para construir o inicializador. (veja Invocando guix system em Manual de Referência do GNU Guix).

$ guix system container os.scm
As seguintes derivações serão compiladas::
/gnu/store/…-run-container.drv
…
compilando /gnu/store/…-run-container.drv...
/gnu/store/…-run-container

Agora que temos um script de launcher, podemos executá-lo para gerar o novo sistema com um serviço PostgreSQL em execução. Observe que, devido a algumas limitações ainda não resolvidas, precisamos executar o launcher como usuário root, por exemplo, com sudo.

$ sudo /gnu/store/…-run-container
O contêiner de sistema está rodando como PID 5983
…

Coloque o processo em segundo plano com Ctrl-z seguido por bg. Observe o ID do processo na saída; precisaremos dele para conectar ao contêiner mais tarde. Quer saber? Vamos tentar anexar ao contêiner agora mesmo. Usaremos nsenter, uma ferramenta fornecida pelo pacote 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

O serviço PostgreSQL está sendo executado no contêiner!


Próximo: Rede em contêineres, Acima: Contêineres do Sistema Guix   [Conteúdo][Índice]