Ir para o conteúdoIr para navegação de página: página anterior [tecla de acesso p]/próxima página [tecla de acesso n]
documentation.suse.com / Gerenciamento básico de contêineres com o Podman

Gerenciamento básico de contêineres com o Podman

Data de Publicação: 29/09/2024
O QUE É?

Os contêineres oferecem um método de virtualização leve para executar vários ambientes virtuais (contêineres) simultaneamente em um único host. Podman é a ferramenta padrão no SLE Micro para gerenciar os contêineres.

POR QUÊ?

O artigo apresenta informações básicas sobre o Podman e explica como usá-lo para gerenciar contêineres.

DEDICAÇÃO

A leitura do artigo leva aproximadamente 30 minutos.

META

Você aprenderá sobre Podman, imagens de contêiner e contêineres.

REQUISITOS
  • O Podman instalado.

1 Noções básicas sobre contêineres

Os contêineres oferecem um método de virtualização leve para executar vários ambientes virtuais (contêineres) simultaneamente em um único host. Ao contrário das tecnologias como Xen ou KVM, em que o processador simula um ambiente de hardware completo e um hipervisor controla as máquinas virtuais, os contêineres fornecem virtualização no nível do sistema operacional, em que o kernel controla os contêineres isolados.

Vantagens do uso de contêineres
  • Os contêineres possibilitam o isolamento de aplicativos em unidades independentes.

  • Os contêineres fornecem desempenho quase nativo. Dependendo do runtime, um contêiner pode usar o kernel do host diretamente, minimizando a sobrecarga.

  • É possível controlar interfaces de rede e aplicar recursos a contêineres por meio de grupos de controle do kernel.

Limitações dos contêineres
  • Os contêineres são executados no kernel do sistema host, portanto, eles não podem usar outros kernels ou versões de kernel diferentes.

  • A segurança dos contêineres depende do sistema host. Aplicativos conteinerizados podem ser protegidos por meio de perfis do AppArmor ou do SELinux. Proteger os contêineres é mais difícil do que proteger as máquinas virtuais devido à maior superfície de ataque.

2 Sobre o Podman

Podman é a abreviação da Ferramenta Pod Manager. Trata-se de um mecanismo de contêiner sem daemon que permite executar e implantar aplicativos usando contêineres e imagens de contêineres. O Podman oferece uma interface de linha de comando para gerenciar contêineres.

Como o Podman não tem daemon, ele permite a integração com o systemd. Isso possibilita o controle de contêineres por meio de unidades do systemd. Você pode criar essas unidades para contêineres existentes e também gerar unidades que podem iniciar contêineres, se eles não existirem no sistema. O Podman pode executar o systemd dentro de contêineres.

O Podman permite organizar os contêineres em pods. Os pods compartilham a mesma interface de rede e recursos. Um caso de uso comum para organizar um grupo de contêineres em um pod é um contêiner que executa um banco de dados e um contêiner com um cliente que acessa o banco de dados.

2.1 Instalação do Podman

Por padrão, o Podman está incluído no SLE Micro. No entanto, se o Podman estiver ausente, você poderá instalá-lo conforme descrito abaixo:

  1. Execute o comando:

    > sudo transactional-update pkg install podman*
  2. Reinicie o sistema para inicializá-lo no novo instantâneo.

3 Obtendo imagens de contêiner

Para executar um contêiner, você precisa de uma imagem. Uma imagem inclui todas as dependências necessárias para executar um aplicativo. Você pode obter imagens de um registro de imagens. Os registros disponíveis são definidos no arquivo de configuração /etc/containers/registries.conf. Se você tiver um registro de imagens local ou quiser usar outros registros, adicione-os ao arquivo de configuração.

Importante
Importante: Nenhuma ferramenta para criar imagens no SLE Micro

O SLE Micro não fornece ferramentas para criação de imagens personalizadas. Portanto, a única maneira de obter uma imagem é extraí-la de um registro de imagens.

Nota
Nota: O registro do openSUSE e o Docker Hub não estão habilitados por padrão

O registro do openSUSE e o Docker Hub não são configurados na instalação padrão. Para fazer download das imagens de contêiner desses registros, você precisa adicioná-los ao arquivo /etc/containers/registries.conf da seguinte maneira:

unqualified-search-registries = ["registry.suse.com", "registry.opensuse.org", "docker.io"]

O comando podman pull extrai uma imagem de um registro de imagens. Veja a sintaxe a seguir:

# podman pull[OPTIONS]SOURCE

source pode ser uma imagem sem o nome do registro. Nesse caso, o Podman tenta extrair a imagem de todos os registros configurados no arquivo /etc/containers/registries.conf. A tag de imagem padrão é latest. O local padrão das imagens extraídas é /var/lib/containers/storage/overlay-images/.

Para ver todas as opções possíveis do comando podman pull, execute:

# podman pull --help
Nota
Nota: Obtendo imagens por meio do Cockpit

Se você usa o Cockpit, também pode extrair imagens de um registro de imagens no menu Contêineres do Podman clicando em + Obter nova imagem.

O Podman permite pesquisar imagens em um registro de imagens ou em uma lista de registros usando o comando:

# podman searchIMAGE_NAME

Se preferir, use a ferramenta skopeo para gerenciar imagens de contêiner e repositórios de imagens. Para obter detalhes, consulte a seção a seguir.

3.1 skopeo

skopeo é um utilitário de linha de comando para gerenciar, inspecionar e assinar imagens de contêiner e repositórios de imagens. O skopeo permite inspecionar contêineres e repositórios em registros de contêineres remotos e locais e também facilita a cópia de imagens de contêiner entre back ends de armazenamento diferentes.

O skopeo funciona com os seguintes tipos de registro:

containers-storage:IMAGE_REFERENCE

Uma imagem localizada em um armazenamento de imagens local.

docker://IMAGE_REFERENCE

Uma imagem em um registro.

O skopeo oferece vários comandos para gerenciar imagens e registros:

inspect

O comando busca o manifesto do repositório e mostra informações como as tags disponíveis para o repositório especificado, os rótulos de uma imagem de contêiner, o sistema operacional de uma imagem e assim por diante.

O comando tem a seguinte sintaxe:

> skopeo inspect REGISTRY_TYPEIMAGE_NAME

Veja a seguir um exemplo de uso:

> skopeo inspect docker://registry.suse.com/suse/pcp:latest
{
  "Name": "registry.suse.com/suse/pcp",
  "Digest": "sha256:eee17c009fb8b05e5825a8c9658d972ab13a17541180bd7a1348fccc6e4fc77f",
  "RepoTags": [
      "5",
      "5-12.54",
      "5-13.10",
      ...
      ],
  "Created": "2023-06-19T16:59:01.617731565Z",
  "DockerVersion": "20.10.23-ce",
  "Labels": {
      "com.suse.application.pcp.created": "2023-06-19T16:58:29.786850402Z",
      "com.suse.application.pcp.description": "Performance Co-Pilot (pcp) container image based on the SLE Base Container Image. This container image is not supported when using a container runtime other than podman.",
      ...
      ],
      "Architecture": "amd64",
  "Os": "linux",
  "Layers": [
      "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e",
      "sha256:19793da49ce886a67aa62657dc24a105a26d63568ce27de241246bc6cc9bc008",
      "sha256:403f9ef6c98d4cf277caf3166ca4455817828e33c8b699237bb8eb24cb2b41bf"
  ],
  "LayersData": [
      {
          "MIMEType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
          "Digest": "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e",
          "Size": 47291175,
          "Annotations": null
      },
      ...
  ],
  "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
copy

O comando permite copiar imagens de contêiner entre registros, back ends de armazenamento de contêineres e diretórios locais.

Veja a seguir um exemplo de uso:

> skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
delete

Para marcar uma imagem para remoção posterior pelo coletor de lixo do registro.

> skopeo delete docker://registry.example.com/example/pause:latest
sync

Para sincronizar imagens entre repositórios de registro e diretórios locais.

4 Trabalhando com contêineres

4.1 Executando contêineres

Após extrair a imagem do contêiner, você poderá criar contêineres com base nela. Você pode executar uma instância da imagem usando o comando podman run. Veja a seguir a sintaxe do comando:

# podman run [OPTIONS] IMAGE [CONTAINER_NAME]

IMAGE é especificado no formato transporte:caminho. Se transporte for omitido, o docker padrão será usado. O caminho pode fazer referência a um registro de imagem específico. Se omitido, o Podman procura a imagem nos registros definidos no arquivo /etc/containers/registries.conf. Veja a seguir um exemplo que executa um contêiner chamado sles15 com base na imagem sle15:

# podman run registry.opensuse.org/suse/templates/images/sle-15-sp4/base/images/suse/sle15 sles15

Veja a seguir uma lista de opções usadas com frequência. Para obter uma lista completa das opções, execute o comando: podman run --help.

--detach, -d

O contêiner será executado em segundo plano.

--env, -e=env

Essa opção permite que variáveis de ambiente arbitrárias disponíveis para o processo sejam iniciadas dentro do contêiner. Se uma variável de ambiente for especificada sem um valor, o Podman verificará se há um valor no ambiente do host e definirá a variável apenas se ela estiver definida no host.

--help

Imprime a ajuda para o comando podman run.

--hostname=nome, -h

Define o nome de host do contêiner que está disponível dentro do contêiner.

--pod= nome

Executa o contêiner em um pod existente. Para criar um pod, insira um prefixo no nome do pod new:.

--read-only

Monta o sistema de arquivos raiz do contêiner como apenas leitura.

--systemd=true|false|always

Executa o contêiner no modo systemd. O padrão é verdadeiro.

4.2 Listando contêineres

O Podman permite listar todos os contêineres em execução usando o comando podman ps. A sintaxe genérica do comando é a seguinte:

# podman  ps[OPTIONS]

As opções de comando podem mudar as informações exibidas. Por exemplo, o uso da opção --all retorna todos os contêineres criados pelo Podman (não apenas os contêineres em execução).

Para obter uma lista completa das opções podman ps, execute :

# podman ps --help

4.3 Parando contêineres

Se o comando podman run foi concluído com êxito, um novo contêiner foi iniciado. Você pode parar o contêiner executando:

# podman stop[OPTIONS]CONTAINER

Você pode especificar um nome ou ID de um único contêiner ou uma lista de contêineres separados por espaço. O comando usa as seguintes opções:

--all, -a

Interrompe todos os contêineres em execução.

--latest, -l

Em vez de fornecer o nome de um contêiner, o último contêiner criado será interrompido.

--time, -t= segundos

Por quantos segundos aguardar antes de interromper o contêiner à força.

Para ver todas as opções possíveis do comando podman stop, execute o seguinte:

# podman stop --help

4.4 Iniciando contêineres

Para iniciar os contêineres já criados, mas que foram interrompidos, use o comando podman start. Veja a seguir a sintaxe do comando:

# podman start[OPTIONS]CONTAINER

CONTAINER pode ser o nome ou ID de um contêiner.

Para obter uma lista completa das opções possíveis de podman start, execute o comando:

# podman start --help

4.4.1 Confirmando contêineres modificados

Você pode executar um novo contêiner com atributos específicos que não fazem parte da imagem original. Para gravar o contêiner com esses atributos como uma nova imagem, você pode usar o comando podman commit:

# podman commit[OPTIONS]CONTAINERIMAGE

CONTAINER é o nome ou ID de um contêiner. IMAGE é o nome da nova imagem. Se o nome da imagem não começar com um nome de registro, o valor localhost será usado.

4.5 Removendo contêineres

Para remover um ou mais contêineres não utilizados do host, use o comando podman rm conforme mostrado a seguir:

# podman rm[OPTIONS]CONTAINER

CONTAINER pode ser o nome ou ID de um contêiner.

O comando não remove o contêiner especificado se ele estiver em execução. Para remover um contêiner em execução, use a opção -f.

Para obter uma lista completa das opções podman rm, execute :

# podman rm --help
Nota
Nota: Apagando todos os contêineres interrompidos

Você pode apagar todos os contêineres interrompidos do seu host com um único comando:

# podman container prune

Verifique se cada contêiner interrompido deve ser removido antes de executar o comando; do contrário, você poderá remover contêineres que ainda estão em uso e foram interrompidos apenas temporariamente.

5 Trabalhando com pods

Os contêineres podem ser agrupados em um pod. Em seguida, os contêineres no pod compartilham o namespace de rede, pid e IPC. Os pods podem ser gerenciados por comandos podman pod. Esta seção apresenta uma visão geral dos comandos para gerenciamento de pods.

5.1 Criando pods

O comando podman pod create é usado para criar um pod. A sintaxe do comando é a seguinte:

# podman pod create[OPTIONS]

O comando retorna o ID do pod. Por padrão, os pods são criados sem serem iniciados. Você pode iniciar um pod executando um contêiner no pod ou iniciando o pod conforme descrito na Seção 5.3, “Iniciando/interrompendo/reiniciando pods”.

Nota
Nota: Nomes de pod padrão

Se você não especificar um nome de pod com a opção --name, o Podman atribuirá um nome padrão para o pod.

Para obter uma lista completa das opções possíveis, execute o seguinte comando:

# podman pod create --help

5.2 Listando pods

Você pode listar todos os pods executando o comando:

# podman pod list

A saída é a seguinte:

POD ID        NAME               STATUS   CREATED       # OF CONTAINERS  INFRA ID
30fba506fecb  upbeat_mcclintock  Created  19 hours ago  1                4324f40c9651
976a83b4d88b  nervous_feynman    Running  19 hours ago  2                daa5732ecd02

Como cada pod inclui o contêiner INFRA, o número de contêineres em um pod é sempre maior do que zero.

5.3 Iniciando/interrompendo/reiniciando pods

Após a criação de um pod, você deverá iniciá-lo, pois ele não está no estado running por padrão. Nos comandos abaixo, POD pode ser o nome ou ID de um pod.

Para iniciar um pod, execute o comando:

# podman pod start[OPTIONS]POD

Para obter uma lista completa das opções possíveis, execute:

# podman pod start --help

Para interromper um pod, use o podman pod stop da seguinte maneira:

# podman pod stopPOD

Para reiniciar um pod, use o comando podman pod restart da seguinte maneira:

# podman pod restartPOD

5.4 Gerenciando contêineres em um pod

Para adicionar um novo contêiner a um pod, use o comando podman run com a opção --pod. Veja a seguir uma sintaxe geral do comando:

# podman run[OPTIONS] --pod POD_NAME IMAGE

Para obter detalhes sobre o comando podman run, consulte a Seção 4.1, “Executando contêineres”.

Nota
Nota: Apenas novos contêineres podem ser adicionados a um pod

O comando podman start não permite iniciar um contêiner em um pod se o contêiner não foi adicionado ao pod durante a execução inicial do contêiner.

Não é possível remover um contêiner de um pod e mantê-lo em execução, pois o próprio contêiner é removido do host.

Outras ações, como iniciar, reiniciar e parar, podem ser executadas em contêineres específicos sem afetar o status do pod.

5.5 Monitorando processos em pods

Para ver todos os contêineres em todos os pods, use o seguinte comando:

# podman ps -a --pod

A saída do comando será semelhante à seguinte:

CONTAINER ID  IMAGE                       COMMAND    CREATED       STATUS                 [...]
4324f40c9651  k8s.gcr.io/pause:3.2                   21 hours ago  Created
daa5732ecd02  k8s.gcr.io/pause:3.2                   22 hours ago  Up 3 hours ago
e5c8e360c54b  localhost/test:latest       /bin/bash  3 days ago    Exited (137) 3 days ago
82dad15828f7  localhost/opensuse/toolbox  /bin/bash  3 days ago    Exited (137) 3 days ago
1a23da456b6f  docker.io/i386/ubuntu       /bin/bash  4 days ago    Exited (0) 6 hours ago
df890193f651  localhost/opensuse/toolbox  /bin/bash  4 days ago    Created

Os dois primeiros registros são os contêineres INFRA de cada pod, com base na imagem k8s.gcr.io/pause:3.2. Outros contêineres na saída são independentes e não pertencem a nenhum pod.

5.6 Removendo pods

Há duas maneiras de remover pods. Você pode usar o comando podman pod rm para remover um ou mais pods. Se preferir, remova todos os pods interrompidos usando o comando podman pod prune.

Para remover um ou vários pods, execute o comando podman pod rm da seguinte maneira:

# podman pod rmPOD

POD pode ser o nome ou ID de um pod.

Para remover todos os pods interrompidos no momento, use o comando podman pod prune. Verifique se todos os pods interrompidos devem ser removidos antes de executar o comando podman pod prune; do contrário, você poderá remover pods que ainda estão em uso.