Pesquisa de site

Como gerenciar contêineres usando Podman e Skopeo no RHEL 8


Um dos desafios enfrentados pelos desenvolvedores no passado é fazer com que os aplicativos sejam executados de maneira confiável em vários ambientes de computação. Muitas vezes, os aplicativos não funcionavam conforme o esperado ou encontravam erros e falhavam completamente. E foi aí que nasceu o conceito de contêineres.

O que são imagens de contêiner?

Imagens de contêiner são arquivos estáticos fornecidos com código executável executado em um ambiente isolado. Uma imagem de contêiner compreende bibliotecas de sistema, dependências e outras configurações de plataforma necessárias para que o aplicativo seja executado em diversos ambientes.

O Red Hat Linux fornece um conjunto de ferramentas de contêiner úteis que você pode aproveitar para trabalhar diretamente com contêineres Linux usando comandos docker necessários. Esses incluem:

  • Podman – Este é um mecanismo de contêiner sem daemon para executar e gerenciar contêineres OCI no modo root ou sem root. Podman é semelhante ao Docker e tem as mesmas opções de comando, exceto que Docker é um daemon. Você pode extrair, executar e gerenciar imagens de contêiner usando o podman da mesma forma que faria com o Docker. O Podman vem com muitos recursos avançados, integra-se totalmente aos sistemas e oferece suporte ao namespace do usuário, que inclui a execução de contêineres sem a necessidade de um usuário root.
  • Skopeo: Esta é uma ferramenta de linha de comando usada para copiar imagens de contêiner de um registro para outro. Você pode usar o Skopeo para copiar imagens de e para um host específico, bem como copiar imagens para outro registro de contêiner ou ambiente. Além de copiar imagens, você pode usá-lo para inspecionar imagens de vários registros e usar assinaturas para criar e verificar imagens.
  • Buildah: Este é um conjunto de ferramentas de linha de comando usadas para criar e gerenciar imagens OCI de contêiner usando arquivos Docker.

Neste artigo, focaremos no gerenciamento de contêineres usando podman e Skopeo.

Pesquisando imagens de contêiner em um registro remoto

O comando podman search permite pesquisar registros remotos selecionados por imagens de contêiner. A lista padrão de registros é definida no arquivo registries.conf localizado no diretório /etc/containers/.

Os registros são definidos por 3 seções.

  • [registries.search] – Esta seção especifica os registros padrão que o podman pode pesquisar por imagens de contêiner. Ele procura a imagem solicitada nos registros registry.access.redhat.com, registry.redhat.io e docker.io.

  • [registries.insecure]– Esta seção especifica registros que não implementam criptografia TLS, ou seja, registros inseguros. Por padrão, nenhuma entrada é especificada.

  • [registries.block] – Bloqueia ou nega acesso aos registros especificados do seu sistema local. Por padrão, nenhuma entrada é especificada.

Como um usuário regular (não root) executando o comando podman, você pode definir seu próprio arquivo registries.conf em seu diretório inicial ($HOME/.config /containers/registries.conf) para substituir as configurações de todo o sistema.

Regras ao especificar registros

Ao especificar os registros, tenha em mente o seguinte:

  • Todo registro deve ser colocado entre aspas simples.
  • Os registros podem ser especificados usando um nome de host ou endereço IP.
  • Se vários registros forem especificados, eles deverão ser separados por vírgulas.
  • Se um registro usar uma porta não padrão – seja a porta TCP 443 para segura e 80 para insegura – o número da porta deve ser especificado junto com o nome do registro, por exemplo. registry.example.com:5566.

Para pesquisar uma imagem de contêiner em um registro usando a sintaxe:

podman search registry/container_image

Por exemplo, para procurar uma imagem Redis no registro registry.redhat.io, invoque o comando:

podman search registry.redhat.io/redis

Para procurar uma imagem de contêiner MariaDB, execute.

podman search registry.redhat.io/mariadb

Para obter uma descrição elaborada de uma imagem de contêiner, use a opção --no-trunc antes do nome da imagem de contêiner a partir dos resultados obtidos. Por exemplo, tentaremos obter uma descrição detalhada da imagem do contêiner MariaDB conforme mostrado:

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

Extraindo imagens de contêiner

Extrair ou recuperar imagens de contêiner de um registro remoto requer que você primeiro se autentique antes de qualquer outra coisa. Por exemplo, para recuperar a imagem do contêiner MariaDB, primeiro faça login no registro Redhat:

podman login

Forneça seu nome de usuário e senha e pressione ‘ENTER‘ no teclado. Se tudo correr bem, você deverá receber uma mensagem de confirmação de que o login no registro foi bem-sucedido.

Login Succeeded!

Agora, você pode extrair a imagem usando a sintaxe mostrada:

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

O <registry> refere-se ao host ou registro remoto que fornece um repositório de imagens de contêiner no TCP <port>. O <namespace> e o <name> especificam coletivamente uma imagem de contêiner com base no <namespace> no registro. Finalmente, a opção <tag> especifica a versão da imagem do contêiner. Se nada for especificado, a tag padrão – mais recente – será usada.

É sempre recomendável adicionar registros confiáveis, ou seja, aqueles que fornecem criptografia e não permitem que usuários anônimos gerem contas com nomes aleatórios.

Para extrair a imagem MariaDB, execute o comando:

podman pull registry.redhat.io/rhel8/mariadb-103
  • O <registry> – Registry.redhat.io
  • O <namespace> – rhel8
  • O <nome> – MariaDB
  • O <tag> – 103

Para a extração subsequente de imagens de contêiner, nenhum login adicional será necessário, pois você já está autenticado. Para extrair uma imagem de contêiner Redis, basta executar:

podman pull registry.redhat.io/rhscl/redis-5-rhel7

Listando imagens de contêiner

Depois de extrair as imagens, você pode visualizar as imagens atualmente existentes em seu host executando o comando podman images.

podman images

Inspecionando imagens de contêiner

Antes de executar um contêiner, é sempre uma boa ideia sondar a imagem e entender o que ela faz. O comando podman inspecionar imprime um mar de metadados sobre o contêiner, como sistema operacional e arquitetura.

Para inspecionar uma imagem, execute o comando podman inspecionar seguido pelo ID da imagem ou repositório.

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

No exemplo abaixo, estamos inspecionando o contêiner MariaDB.

podman inspect registry.redhat.io/rhel8/mariadb-103

Para extrair metadados específicos para um contêiner, passe a opção --format seguida dos metadados e da identidade do contêiner (ID ou nome da imagem).

No exemplo abaixo, estamos recuperando informações sobre a arquitetura e descrição do contêiner base RHEL 8 que se enquadra na seção ‘Rótulos’.

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

Para inspecionar uma imagem remota de outro registro, use o comando skopeo inspeciona. No exemplo abaixo, estamos inspecionando uma imagem inicial do RHEL 8 hospedada no Docker.

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

Marcando imagens de contêiner

Como você deve ter notado, os nomes das imagens geralmente são de natureza genérica. Por exemplo, a imagem redis é rotulada:

registry.redhat.io/rhscl/redis-5-rhel7

Marcar imagens dá a elas um nome mais intuitivo para entender melhor o que elas contêm. Usando o comando podman tag, você pode criar uma tag de imagem que é essencialmente um alias para um nome de imagem que compreende diferentes partes.

Estes são:

registry/username/NAME:tag

Por exemplo, para alterar o nome genérico da imagem Redis que possui um ID 646f2730318c , executaremos o comando:

podman tag 646f2730318c myredis

Para adicionar uma tag no final, acrescente dois pontos completos seguidos do número da tag:

podman tag 646f2730318c myredis:5.0

Sem adicionar o número da etiqueta, apenas será atribuído o atributo mais recente.

Executando imagens de contêiner

Para executar um contêiner, use o comando podman run. Por exemplo:

podman run image_id

Para executar um contêiner silenciosamente em segundo plano como um serviço daemon, use a opção -d conforme mostrado.

podman run -d image_id

Por exemplo, para executar a imagem redis com ID 646f2730318c, invocaremos o comando:

podman run -d 646f2730318c

Se você estiver executando um contêiner baseado em um sistema operacional como a imagem base do RHEL 8, poderá obter acesso ao shell usando a diretiva -it. A opção -i cria uma sessão interativa enquanto a -t gera uma sessão de terminal. A opção --name define o nome do contêiner como mybash enquanto é o ID da imagem ecbc6f53bba0 da imagem base.

podman run -it --name=mybash ecbc6f53bba0

Depois disso, você pode executar qualquer comando shell. No exemplo abaixo, estamos verificando a versão do sistema operacional da imagem do contêiner.

cat /etc/os-release

Para sair do contêiner, basta invocar o comando exit.

exit

Assim que o contêiner é encerrado, ele para automaticamente. Para iniciar o contêiner novamente, use o comando podman start com o sinalizador -ai conforme mostrado.

podman start -ai mybash

Mais uma vez, isso lhe dá acesso ao shell.

Listando imagens de contêiner em execução

Para listar os contêineres atualmente em execução, use o comando podman ps conforme mostrado.

podman ps

Para visualizar todos os contêineres, incluindo aqueles que foram encerrados após a execução, use o comando:

podman ps -a

Configurar imagens de contêiner para inicialização automática no serviço Systemd

Nesta seção, nos concentramos em como um contêiner pode ser configurado para ser executado diretamente em um sistema RHEL como um serviço systemd.

Primeiro, obtenha sua imagem preferida. Neste caso, extraímos a imagem Redis do docker hub:

podman pull docker.io/redis

Se você tiver o SELinux em execução no seu sistema, será necessário ativar o booleano container_manage_cgroup para executar contêineres com o systemd.

setsebool -p container_manage_cgroup on

Depois disso, execute a imagem do contêiner em segundo plano e atribua-a ao nome de imagem de sua preferência. Neste exemplo, nomeamos nossa imagem como redis_server e mapeamos a porta 6379 do contêiner para nosso host RHEL 8

podman run -d --name redis_server -p 6379:6379 redis

A seguir, criaremos um arquivo de configuração de unidade systemd para redis no diretório /etc/systemd/system/.

vim /etc/systemd/system/redis-container.service

Cole o conteúdo abaixo no arquivo.

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

Salve e saia do arquivo.

Em seguida, configure o contêiner para iniciar automaticamente na inicialização.

systemctl enable redis-container.service

Em seguida, inicie o contêiner e verifique seu status de execução.

systemctl start redis-container.service
systemctl status redis-container.service

Configurar armazenamento persistente para imagens de contêiner

Ao executar contêineres, é prudente configurar o armazenamento externo persistente no host. Isso fornece um backup caso o contêiner trave ou seja removido acidentalmente.

Para persistir os dados, vamos mapear um diretório localizado no host para um diretório dentro do contêiner.

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

A opção --privileged é passada quando SELinux está definido para aplicação. A opção -v especifica o volume externo localizado no host. O volume do contêiner aqui é o diretório /mnt.

Depois de acessar o shell, criaremos um arquivo de amostra testing.txt no diretório /mnt conforme mostrado.

echo "This tests persistent external storage" > /mnt/testing.txt

Iremos então sair do contêiner e verificar se o arquivo existe no armazenamento externo residente no host

exit
cat /var/lib/containers/backup_storage/testing.txt

SaídaIsso testa o armazenamento externo persistente.

Parando e removendo contêineres

Quando terminar de executar seu contêiner, você pode interrompê-lo usando o comando podman stop seguido pelo container-id que você pode obter no podman ps< comando.

podman stop container-id

Para remover os contêineres que você não precisa mais, primeiro certifique-se de interrompê-los e, em seguida, invoque o comando podman rm seguido pelo ID ou nome do contêiner como uma opção.

podman rm container-id

Para remover vários contêineres de uma só vez em um comando, especifique os ids do contêiner separados por um espaço.

podman rm container-id-1 container-id-2 container-id-3

Para limpar todos os seus contêineres, execute o comando:

podman rm -a

Removendo uma imagem

Para remover uma imagem, primeiro certifique-se de que todos os contêineres gerados a partir das imagens sejam interrompidos e removidos conforme discutido no subtópico anterior.

Em seguida, prossiga e execute o comando podman -rmi seguido pelo ID da imagem conforme mostrado:

podman -rmi image-id

Conclusão

Isso encerra este capítulo sobre gerenciamento e trabalho com contêineres no RHEL 8. Esperamos que este guia tenha fornecido uma compreensão decente sobre contêineres e como você pode interagir e gerenciá-los em seu sistema RHEL usando podman e Skopeo.