Red Hat Training

A Red Hat training course is available for RHEL 8

8.5. Vagens de inicialização automática usando systemd

Você pode iniciar múltiplos containers como serviços de sistema. Note que o comando systemctl deve ser usado somente no pod e você não deve iniciar ou parar containers individualmente via systemctl, pois eles são gerenciados pelo serviço de pod junto com o infra-container interno.

Procedimento

  1. Criar uma cápsula vazia, por exemplo, chamada systemd-pod:

    $ podman pod create --name systemd-pod
    11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
  2. Liste todas as cápsulas:

    $ podman pod ps
    POD ID        NAME         STATUS   CREATED         # OF CONTAINERS  INFRA ID
    11d4646ba41b  systemd-pod  Created  40 seconds ago  1                8a428b257111
    11d4646ba41b1fffa51c108cbdf97cfab3213f7bd9b3e1ca52fe81b90fed5577
  3. Criar dois recipientes na cápsula vazia. Por exemplo, para criar container0 e container1 em systemd-pod:

    $ podman create --pod systemd-pod --name container0 registry.access.redhat.com/ubi8 top
    $ podman create --pod systemd-pod --name container1 registry.access.redhat.com/ubi8 top
  4. Liste todas as cápsulas e recipientes associados a elas:

    $ podman ps -a --pod
    CONTAINER ID  IMAGE                                   COMMAND  CREATED        STATUS         PORTS   NAMES               POD ID        PODNAME
    24666f47d9b2  registry.access.redhat.com/ubi8:latest  top      3 minutes ago  Created                container0          3130f724e229  systemd-pod
    56eb1bf0cdfe  k8s.gcr.io/pause:3.2                             4 minutes ago  Created                3130f724e229-infra  3130f724e229  systemd-pod
    62118d170e43  registry.access.redhat.com/ubi8:latest  top      3 seconds ago  Created                container1          3130f724e229  systemd-pod
  5. Gerar o arquivo da unidade do sistema para o novo módulo:

    $ podman generate systemd --files --name systemd-pod
    /home/user1/pod-systemd-pod.service
    /home/user1/container-container0.service
    /home/user1/container-container1.service

    Observe que são gerados três arquivos de unidade do sistema, um para o módulo systemd-pod e dois para os recipientes container0 e container1.

  6. Exibir o arquivo da unidade pod-systemd-pod.service:

    $ cat pod-systemd-pod.service
    # pod-systemd-pod.service
    # autogenerated by Podman 2.0.3
    # Tue Jul 28 14:00:46 EDT 2020
    
    
    [Unit]
    Description=Podman pod-systemd-pod.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network.target
    After=network-online.target
    Requires=container-container0.service container-container1.service
    Before=container-container0.service container-container1.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    ExecStart=/usr/bin/podman start c852fbaba568-infra
    ExecStop=/usr/bin/podman stop -t 10 c852fbaba568-infra
    ExecStopPost=/usr/bin/podman stop -t 10 c852fbaba568-infra
    PIDFile=/run/user/1000/containers/overlay-containers/a7ff86382608add27a03ac2166d5d0164199f01eadf80b68b06a406c195105fc/userdata/conmon.pid
    KillMode=none
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • A linha Requires na seção [Unit] define as dependências dos arquivos das unidades container-container0.service e container-container1.service. Ambos os arquivos unitários serão ativados.
    • As linhas ExecStart e ExecStop na seção [Service] iniciam e param o infracontainer, respectivamente.
  7. Exibir o arquivo da unidade container-container0.service:

    $ cat container-container0.service
    # container-container0.service
    # autogenerated by Podman 2.0.3
    # Tue Jul 28 14:00:46 EDT 2020
    
    [Unit]
    Description=Podman container-container0.service
    Documentation=man:podman-generate-systemd(1)
    Wants=network.target
    After=network-online.target
    BindsTo=pod-systemd-pod.service
    After=pod-systemd-pod.service
    
    [Service]
    Environment=PODMAN_SYSTEMD_UNIT=%n
    Restart=on-failure
    ExecStart=/usr/bin/podman start container0
    ExecStop=/usr/bin/podman stop -t 10 container0
    ExecStopPost=/usr/bin/podman stop -t 10 container0
    PIDFile=/run/user/1000/containers/overlay-containers/12e85378f2854b8283f791974494a02aa6c92630d76d1050237839b61508a008/userdata/conmon.pid
    KillMode=none
    Type=forking
    
    [Install]
    WantedBy=multi-user.target default.target
    • A linha BindsTo na seção [Unit] define a dependência do arquivo da unidade pod-systemd-pod.service
    • As linhas ExecStart e ExecStop na seção [Service] iniciam e param o container0 respectivamente.
  8. Exibir o arquivo da unidade container-container1.service:

    Container-container1.serviço de $ cat
  9. Copiar todos os arquivos gerados para $HOME/.config/systemd/user para instalação como usuário não-rootal:

    $ cp pod-systemd-pod.service container-container0.service container-container1.service $HOME/.config/systemd/user
  10. Habilite o serviço e comece com o login do usuário:

    $ systemctl enable --user pod-systemd-pod.service
    Created symlink /home/user1/.config/systemd/user/multi-user.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.
    Created symlink /home/user1/.config/systemd/user/default.target.wants/pod-systemd-pod.service → /home/user1/.config/systemd/user/pod-systemd-pod.service.

    Note que o serviço pára no logout do usuário.

Etapas de verificação

  • Verifique se o serviço está habilitado:

    $ systemctl is-enabled pod-systemd-pod.service
    enabled

Recursos adicionais

  • Para mais informações sobre o comando podman create, digite man podman-create.
  • Para mais informações sobre o comando podman generate systemd, digite man podman-generate-systemd.
  • Para mais informações sobre o comando systemctl, digite man systemctl.
  • Para mais informações, veja o artigo de Valentin Rothberg, " Running containers with Podman and shareable systemd services ".
  • Para saber mais sobre a configuração de serviços com o systemd, consulte o capítulo Configurando configurações básicas do sistema chamado Gerenciando serviços com o systemd.