Sådan håndteres containere ved hjælp af Podman og Skopeo i RHEL 8


En af de udfordringer, som udviklere tidligere har haft, er at få applikationer til at køre pålideligt på tværs af flere computermiljøer. Ofte kørte applikationer ikke som forventet eller stødte på fejl og mislykkedes helt. Og det var her begrebet containere blev født.

Hvad er containerbilleder?

Containerbilleder er statiske filer, der leveres med eksekverbar kode, der kører i et isoleret miljø. Et containerbillede indeholder systembiblioteker, afhængigheder og andre platformindstillinger, som applikationen har brug for for at køre i forskellige miljøer.

Red Hat Linux leverer et sæt nyttige containerværktøjer, som du kan udnytte til at arbejde direkte med Linux-containere ved hjælp af krævende dockerkommandoer. Disse inkluderer:

  • Podman – This is a daemon less container engine for running and managing OCI containers in either root or rootless mode. Podman is similar to Docker and has the same command options except that Docker is a daemon. You can pull, run, and manage container images using podman in much the same way as you would with Docker. Podman comes with lots of advanced features, fully integrates with systems, and offers user Namespace support which includes running containers without the need for a root user.
  • Skopeo: This is a command-line tool used for copying container images from one registry to another. You can use Skopeo to copy images to and from a particular host as well as copy images to another container registry or environment. Apart from copying images, you can use it to inspect images from various registries and use signatures to create and verify images.
  • Buildah: This is a set of command-line tools used for creating and managing container OCI images using Docker files.

I denne artikel vil vi fokusere på styring af containere ved hjælp af podman og Skopeo.

Søgning efter containerbilleder fra et fjernregister

Podman-søgekommandoen giver dig mulighed for at søge i valgte fjernregistre efter containerbilleder. Standardlisten over registre er defineret i filen registries.conf, der findes i/etc/containers/biblioteket.

Registerene er defineret af 3 sektioner.

  • [registries.search] – This section specifies the default registries that podman can search for container images. It searches for the requested image in the registry.access.redhat.com, registry.redhat.io, and docker.io registries.
  • [registries.insecure]– This section specifies registries that do not implement TLS encryption i.e insecure registries. By default, no entries are specified.
  • [registries.block] – This blocks or denies access to the specified registries from your local system. By default, no entries are specified.

Som en almindelig (ikke-root) bruger, der kører podman-kommandoen, kan du definere din egen registries.conf-fil i dit hjemmekatalog (/.config/containers/registries.conf) for at tilsidesætte systemindstillinger.

Når du angiver registre, skal du huske følgende:

  • Every registry should be enclosed by single quotes.
  • Registries can be specified using either a hostname or IP address.
  • If multiple registries are specified, then they should be separated by commas.
  • If a registry uses a non-standard port – either port TCP ports 443 for secure and 80 for insecure, – the port number should be specified alongside the registry name e.g. registry.example.com:5566.

Sådan søger du i et register efter et containerbillede ved hjælp af syntaksen:

# podman search registry/container_image

For eksempel for at søge efter et Redis-billede i registreringsdatabasen.redhat.io skal du påkalde kommandoen:

# podman search registry.redhat.io/redis

For at søge efter en MariaDB-containerbilledkørsel.

# podman search registry.redhat.io/mariadb

For at få en detaljeret beskrivelse af et containerbillede skal du bruge indstillingen --no-trunc foran navnet på containerbilledet ud fra de resultater, du får. For eksempel vil vi forsøge at få en detaljeret beskrivelse af MariaDB-containerbilledet som vist:

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

Trækning af containerbilleder

Hvis du trækker eller henter containerbilleder fra en ekstern registreringsdatabase, skal du først godkende før noget andet. For eksempel, for at hente MariaDB-containerbilledet, skal du først logge på Redhat-registreringsdatabasen:

# podman login

Angiv dit brugernavn og din adgangskode, og tryk på 'ENTER' på dit tastatur. Hvis alt går godt, skal du få en bekræftelsesmeddelelse om, at login til registreringsdatabasen var vellykket.

Login Succeeded!

Nu kan du trække billedet ved hjælp af den viste syntaks:

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

<registry> henviser til den eksterne vært eller registreringsdatabasen, der giver et lager af containerbilleder på TCP <port>. <namespace> og <name> angiver samlet et containerbillede baseret på <namespace> i registreringsdatabasen. Endelig angiver indstillingen <tag> versionen af containerbilledet. Hvis der ikke er angivet nogen, bruges standardmærket - senest -.

Det anbefales altid at tilføje betroede registre, det vil sige dem, der giver kryptering og ikke tillader anonyme brugere at gyde konti med tilfældige navne.

For at trække MariaDB-billedet skal du køre kommandoen:

# podman pull registry.redhat.io/rhel8/mariadb-103
  • The <registry> – registry.redhat.io
  • The <namespace> – rhel8
  • The <name> – MariaDB
  • The <tag> – 103

For efterfølgende containerbilleder trækkes der ikke yderligere login, da du allerede er godkendt. For at trække et Redis-containerbillede skal du blot køre:

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

Notering af containerbilleder

Når du er færdig med at trække billederne, kan du se de billeder, der i øjeblikket findes på din vært ved at køre kommandoen podman images.

# podman images

Inspektion af containerbilleder

Før du kører en container, er det altid en god ide at undersøge billedet og forstå, hvad det gør. Podman inspect-kommandoen udskriver et hav af metadata om containeren som OS og arkitektur.

For at inspicere et billede skal du køre kommandoen podman inspect efterfulgt af billed-id eller lager.

# podman inspect IMAGE ID
OR
# podman inspect REPOSITORY

I eksemplet nedenfor inspicerer vi MariaDB-containeren.

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

For at trække specifikke metadata til en container skal du indstille indstillingen --format efterfulgt af metadataene og containerens identitet (billed-id eller navn).

I eksemplet nedenfor henter vi oplysninger om arkitekturen og beskrivelsen af RHEL 8-basisbeholderen, der falder ind under afsnittet 'Etiketter'.

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

For at inspicere et fjernbillede fra et andet register skal du bruge kommandoen skopeo inspect. I eksemplet nedenfor inspicerer vi et RHEL 8 init-image, der hostes på Docker.

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

Mærkning af containerbilleder

Som du måske har bemærket, er billednavne normalt generiske. For eksempel er redis-billedet mærket:

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

Mærkning af billeder giver dem et mere intuitivt navn for bedre at forstå, hvad de indeholder. Ved hjælp af kommandoen podman tag kan du oprette et billedtag, der i det væsentlige er et alias for et billednavn, der består af forskellige dele.

Disse er:

registry/username/NAME:tag

For eksempel for at ændre det generiske navn på Redis-billedet, der har ID 646f2730318c, udfører vi kommandoen:

# podman tag 646f2730318c myredis

For at tilføje et tag i slutningen tilføj et fuldt kolon efterfulgt af tagnummeret:

# podman tag 646f2730318c myredis:5.0

Uden at tilføje tagnummeret tildeles det bare attributten senest.

Kørsel af containerbilleder

For at køre en container skal du bruge kommandoen podman run. For eksempel:

# podman run image_id

For at køre en container stille i baggrunden som en dæmontjeneste skal du bruge indstillingen -d som vist.

# podman run -d image_id

For eksempel for at køre redis-billedet med ID 646f2730318c påkalder vi kommandoen:

# podman run -d 646f2730318c

Hvis du kører en container baseret på et operativsystem som f.eks. RHEL 8-basisbillede, kan du få adgang til skallen ved hjælp af -it -direktivet. Indstillingen -i opretter en interaktiv session, mens -t gyder en terminalsession. Indstillingen --name indstiller containernavnet til mybash, mens det er ecbc6f53bba0 billed-id for basisbilledet.

# podman run -it --name=mybash ecbc6f53bba0

Derefter kan du køre alle shell-kommandoer. I eksemplet nedenfor verificerer vi OS-versionen af containerbilledet.

# cat /etc/os-release

For at forlade beholderen skal du blot påkalde exit-kommandoen.

# exit

Når containeren er afsluttet, stopper den automatisk. For at starte containeren igen skal du bruge podman startkommando med -ai flag som vist.

# podman start -ai mybash

Endnu en gang giver dette dig adgang til skallen.

Notering af kørende containerbilleder

Hvis du vil liste en aktuelt kørende container, skal du bruge kommandoen podman ps som vist.

# podman ps

Brug kommandoen for at se alle containere inklusive dem, der er afsluttet efter kørsel:

# podman ps -a

Konfigurer containerbilleder til automatisk start under Systemd Service

I dette afsnit fokuserer vi på, hvordan en container kan konfigureres til at køre direkte på et RHEL-system som en systemd-tjeneste.

Få først dit foretrukne billede. I dette tilfælde har vi trukket Redis-billedet fra docker-hub:

# podman pull docker.io/redis

Hvis du har SELinux kørende på dit system, skal du aktivere container_manage_cgroup boolean for at køre containere med systemd.

# setsebool -p container_manage_cgroup on

Kør derefter containerbilledet i baggrunden og tildel det til dit foretrukne billednavn. I dette eksempel har vi navngivet vores billede redis_server og kortlagt porten 6379 fra containeren til vores RHEL 8-vært

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

Dernæst opretter vi en systemd-enhedskonfigurationsfil til redis i/etc/systemd/system/biblioteket.

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

Indsæt nedenstående indhold i filen.

[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

Gem og afslut filen.

Konfigurer derefter containeren, så den starter automatisk ved opstart.

# systemctl enable redis-container.service

Start derefter containeren og bekræft dens kørende status.

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

Konfigurer vedvarende opbevaring til containerbilleder

Når du kører containere, er det klogt at konfigurere vedvarende ekstern lagring på værten. Dette giver en sikkerhedskopi, hvis containeren går ned eller bliver fjernet ved et uheld.

For at fastholde dataene skal vi kortlægge en mappe, der er placeret i værten, til en mappe inde i containeren.

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

Indstillingen --privileged videregives, når SELinux er indstillet til at håndhæve. Indstillingen -v angiver den eksterne lydstyrke, der er placeret på værten. Containervolumen her er/mnt-biblioteket.

Når vi har fået adgang til skallen, opretter vi en prøvefil testing.txt i/mnt-biblioteket som vist.

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

Vi forlader derefter containeren og kontrollerer, om filen findes i det eksterne lager, der ligger på værten

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

Output ⇒ Dette tester vedvarende ekstern lagring.

Stop og fjernelse af containere

Når du er færdig med at køre din container, kan du stoppe den ved hjælp af kommandoen podman stop efterfulgt af container-id, som du kan få fra kommandoen podman ps.

# podman stop container-id

For at fjerne de containere, som du ikke længere har brug for, skal du først sørge for at stoppe den og derefter påkalde kommandoen podman rm efterfulgt af container-id eller navn som en mulighed.

# podman rm container-id

For at fjerne flere containere på en gang i en kommando skal du angive container-id'erne adskilt af et mellemrum.

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

For at rydde alle dine containere skal du køre kommandoen:

# podman rm -a

Fjernelse af et billede

For at fjerne et billede skal du først sikre dig, at alle beholdere, der er skabt fra billederne, stoppes og fjernes som beskrevet i det foregående underemne.

Fortsæt derefter og kør kommandoen podman -rmi efterfulgt af billedets ID som vist:

# podman -rmi image-id

Konklusion

Dette afslutter dette kapitel om styring og arbejde med containere i RHEL 8. Vi håber, at denne vejledning gav en anstændig forståelse af containere, og hvordan du kan interagere og styre dem på dit RHEL-system ved hjælp af podman og Skopeo.