Gerenciamento básico de contêineres com o Podman
- 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.
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.
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:
Execute o comando:
>
sudo
transactional-update pkg install podman*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.
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.
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
Se você usa o Cockpit, também pode extrair imagens de um registro de imagens no menu
clicando em .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
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”.
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”.
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.
6 Informações legais #
Copyright © 2006-2024 SUSE LLC e colaboradores. Todos os direitos reservados.
Permissão concedida para copiar, distribuir e/ou modificar este documento sob os termos da Licença GNU de Documentação Livre, Versão 1.2 ou (por sua opção) versão 1.3; com a Seção Invariante sendo estas informações de copyright e a licença. Uma cópia da versão 1.2 da licença está incluída na seção intitulada “GNU Free Documentation License” (Licença GNU de Documentação Livre).
Para ver as marcas registradas da SUSE, visite https://www.suse.com/company/legal/. Todas as marcas comerciais de terceiros pertencem a seus respectivos proprietários. Os símbolos de marca registrada (®, ™ etc.) indicam marcas registradas da SUSE e de suas afiliadas. Os asteriscos (*) indicam marcas registradas de terceiros.
Todas as informações deste manual foram compiladas com a maior atenção possível aos detalhes. Entretanto, isso não garante uma precisão absoluta. A SUSE LLC, suas afiliadas, os autores ou tradutores não serão responsáveis por possíveis erros nem pelas consequências resultantes de tais erros.