Próximo: Rede em contêineres, Acima: Contêineres do Sistema Guix [Conteúdo][Índice]
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]