En av utmaningarna som utvecklare ställts inför tidigare är att få applikationer att köras tillförlitligt över flera datormiljöer. Ofta körde inte program som förväntat eller stötte på fel och misslyckades helt. Och det är där begreppet containers föddes.

Vad är containerbilder?

Container bilder är statiska filer som levereras med körbar kod som körs i en isolerad miljö. En containeravbildning består av systembibliotek, beroenden och andra plattformsinställningar som applikationen behöver för att köras i olika miljöer.

Red Hat Linux tillhandahåller en uppsättning användbara containerverktyg som du kan använda för att arbeta direkt med Linux-containrar genom att använda dockningskommandon. Dessa inkluderar:

  • Podman – Det här är en demonfri containermotor för att köra och hantera OCI behållare i antingen rot- eller rotlöst läge. Podman liknar Docker och har samma kommandoalternativ förutom det Docker är en demon. Du kan dra, köra och hantera behållarbilder med hjälp av podman på ungefär samma sätt som du skulle göra med Docker. Podman kommer med massor av avancerade funktioner, helt integrerad med systems, och erbjuder användarnamnutrymmesstöd som inkluderar körande behållare utan behov av en rotanvändare.
  • Skopeo: Detta är ett kommandoradsverktyg som används för att kopiera behållarbilder från ett register till ett annat. Du kan använda Skopeo att kopiera bilder till och från en viss värd samt kopiera bilder till ett annat containerregister eller miljö. Förutom att kopiera bilder kan du använda den för att inspektera bilder från olika register och använda signaturer för att skapa och verifiera bilder.
  • Buildah: Detta är en uppsättning kommandoradsverktyg som används för att skapa och hantera container OCI bilder med hjälp av Dockers.

I den här artikeln kommer vi att fokusera på att hantera behållare med hjälp av podman och Skopeo.

Söka behållarebilder från ett fjärrregister

De podman search låter dig söka i utvalda fjärrregister efter behållarbilder. Standardlistan över register definieras i registries.conf ligger i /etc/containers/.

Registren definieras av 3 sektioner.

  • [registries.search] – Det här avsnittet specificerar standardregistren som podman kan söka efter behållarbilder. Den söker efter den efterfrågade bilden i registry.access.redhat.com, registry.redhat.io, och docker.io register.
Standardregister
  • [registries.insecure]– Det här avsnittet specificerar register som inte implementerar TLS-kryptering, dvs osäkra register. Som standard anges inga poster.
Osäkra register
Osäkra register
  • [registries.block] – Detta blockerar eller nekar åtkomst till de angivna registren från ditt lokala system. Som standard anges inga poster.
Blockerar register
Blockerar register

Som en vanlig (non-root) användare som kör kommandot podman kan du definiera din egen registries.conf i din hemkatalog ($HOME/.config/containers/registries.conf) för att åsidosätta systemomfattande inställningar.

Regler när du anger register

När du anger registren, tänk på följande:

  • Varje register bör omges av enstaka citat.
  • Register kan specificeras med antingen ett värdnamn eller IP-adress.
  • Om flera register anges ska de separeras med kommatecken.
  • Om ett register använder en icke-standardport – antingen port TCP-portar 443 för säker och 80 för osäker, – ska portnumret anges bredvid registernamnet, t.ex. registry.example.com:5566.

Så här söker du i ett register efter en behållarbild med syntaxen:

# podman search registry/container_image

Till exempel, för att söka efter en Redis bild i registry.redhat.io registret, anropa kommandot:

# podman search registry.redhat.io/redis
Sök i registret efter Container Image
Sök i registret efter Container Image

För att söka efter en MariaDB körning av containerbild.

# podman search registry.redhat.io/mariadb
Sök MariaDB Container Image
Sök MariaDB Container Image

För att få en utförlig beskrivning av en behållarbild, använd –no-trunc före namnet på behållarbilden från resultaten som du får. Till exempel kommer vi att försöka få en detaljerad beskrivning av MariaDB-behållarbilden som visas:

# podman search --no-trunc registry.redhat.io/rhel8/mariadb-103
Listbeskrivning av MariaDB Container Image
Listbeskrivning av MariaDB Container Image

Dra behållarebilder

Att dra eller hämta behållarbilder från ett fjärrregister kräver att du först autentiseras före något annat. Till exempel, för att hämta MariaDB-behållaravbildningen, logga först in på Redhat-registret:

# podman login

Ange ditt användarnamn och lösenord och tryck på ’ENTER’ på ditt tangentbord. Om allt går bra bör du få ett bekräftelsemeddelande om att inloggningen till registret lyckades.

Login Succeeded!

Nu kan du dra bilden med hjälp av syntaxen som visas:

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

De <registry> hänvisar till fjärrvärden eller registret som tillhandahåller ett arkiv med behållarbilder på TCP <port>. De <namespace> och den <name> ange tillsammans en behållarbild baserat på <namespace> på registret. Slutligen, den <tag> anger versionen av behållarbilden. Om ingen anges används standardtaggen – senaste –.

Det rekommenderas alltid att lägga till betrodda register, det vill säga de som tillhandahåller kryptering och inte tillåter anonyma användare att skapa konton med slumpmässiga namn.

För att dra MariaDB-bilden, kör kommandot:

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

För efterföljande behållarbilder krävs ingen ytterligare inloggning eftersom du redan är autentiserad. Att dra en Redis behållarbild, kör helt enkelt:

# podman pull registry.redhat.io/rhscl/redis-5-rhel7
Dra Redis Container Image
Dra Redis Container Image

Lista containerbilder

När du är klar med att dra bilderna kan du se de bilder som för närvarande finns på din värd genom att köra kommandot podman images.

# podman images
Lista behållarbilder
Lista behållarbilder

Inspektera behållarebilder

Innan du kör en container är det alltid en bra idé att undersöka bilden och förstå vad den gör. De podman inspect skriver ut ett hav av metadata om behållaren som OS och arkitektur.

För att inspektera en bild, kör podman inspect följt av bild-ID eller arkiv.

# podman inspect IMAGE ID
OR
# podman inspect REPOSITORY

I exemplet nedan inspekterar vi MariaDB behållare.

# podman inspect registry.redhat.io/rhel8/mariadb-103
Inspektera MariaDB-behållarebilder
Inspektera MariaDB-behållarebilder

För att dra specifik metadata för en behållare passera –format följt av metadata och behållarens identitet (bild-ID eller namn).

I exemplet nedan hämtar vi information om arkitekturen och beskrivningen av RHEL 8-basbehållaren som faller under ’Labels’ sektion.

# podman inspect --format=’{{.Labels.architecture}}’ image ID
# podman inspect --format=’{{.Labels.description}}’ image ID
Få information om containerarkitektur
Få information om containerarkitektur

För att inspektera en fjärravbildning från ett annat register, använd skopeo inspect. I exemplet nedan inspekterar vi en RHEL 8 init-bild som finns på Docker.

# skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init
Inspektera fjärrbild från Docker Registry
Inspektera fjärrbild från Docker Registry

Märkning av behållarebilder

Som du kanske har noterat är bildnamn vanligtvis generiska till sin natur. Till exempel är redis-bilden märkt:

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

Att tagga bilder ger dem ett mer intuitivt namn för att bättre förstå vad de innehåller. Använda podman tagkan du skapa en bildtagg som i huvudsak är ett alias till ett bildnamn som består av olika delar.

Dessa är:

registry/username/NAME:tag

Till exempel för att ändra det generiska namnet på Redis-bilden som har ett ID för 646f2730318c kommer vi att köra kommandot:

# podman tag 646f2730318c myredis

För att lägga till en tagg i slutet, lägg till ett helt kolon följt av taggnumret:

# podman tag 646f2730318c myredis:5.0

Utan att lägga till taggnumret kommer den bara att tilldelas attributet senast.

Ange namn för Redis Container Image
Ange namn för Redis Container Image

Kör containerbilder

För att köra en container, använd podman run. Till exempel:

# podman run image_id

För att köra en behållare tyst i bakgrunden som en demontjänst använd -d som visat.

# podman run -d image_id

Till exempel att köra redis bild med ID 646f2730318ckommer vi att anropa kommandot:

# podman run -d 646f2730318c
Kör Redis Container Images
Kör Redis Container Images

Om du kör en container baserad på ett operativsystem som t.ex RHEL 8 basbild kan du få tillgång till skalet med hjälp av -it direktiv. De -i skapar en interaktiv session medan -t skapar en terminalsession. De –name ställer in behållarens namn till mybash medan är ecbc6f53bba0 bild-id för basbilden.

# podman run -it --name=mybash ecbc6f53bba0

Därefter kan du köra alla skalkommandon. I exemplet nedan verifierar vi OS-versionen av behållarbilden.

# cat /etc/os-release
Verifiera Container Image OS-version
Verifiera Container Image OS-version

För att avsluta behållaren, anropa helt enkelt exit-kommandot.

# exit

När behållaren har lämnats stannar den automatiskt. För att starta behållaren igen, använd podman start de -ai som visat.

# podman start -ai mybash

Återigen ger detta dig tillgång till skalet.

Starta Container Images
Starta Container Images

Lista Running Container Images

För att lista behållare som körs för närvarande, använd podman ps som visat.

# podman ps
Lista körande behållarebilder
Lista körande behållarebilder

För att se alla behållare inklusive de som har avslutats efter körning, använd kommandot:

# podman ps -a
Visa alla behållarebilder
Visa alla behållarebilder

Konfigurera Container Images för att autostarta under Systemd Service

I det här avsnittet fokuserar vi på hur en container kan konfigureras för att köras direkt på ett RHEL-system som en systemtjänst.

Skaffa först din favoritbild. I det här fallet har vi dragit Redis bild från docker hub:

# podman pull docker.io/redis

Om du har SELinux igång på ditt system måste du aktivera container_manage_cgroup boolesk att köra containrar med systemd.

# setsebool -p container_manage_cgroup on

Kör sedan behållarbilden i bakgrunden och tilldela den till ditt föredragna bildnamn. I det här exemplet har vi döpt vår bild redis_server och kartlade hamnen 6379 från containern till vår RHEL 8 värd

# podman run -d --name redis_server -p 6379:6379 redis
Kör containerbild i bakgrunden
Kör containerbild i bakgrunden

Därefter ska vi skapa en systemd enhetskonfigurationsfil för redis i /etc/systemd/system/.

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

Klistra in innehållet nedan 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

Spara och avsluta filen.

Konfigurera sedan behållaren att starta automatiskt vid uppstart.

# systemctl enable redis-container.service

Starta sedan behållaren och verifiera dess körstatus.

# systemctl start redis-container.service
# systemctl status redis-container.service
Verifiera status för behållarens bild
Verifiera status för behållarens bild

Konfigurera beständig lagring för behållarbilder

När du kör behållare är det klokt att konfigurera beständig extern lagring på värden. Detta ger en säkerhetskopia om behållaren kraschar eller tas bort av misstag.

För att bevara data kommer vi att mappa en katalog som finns i värden till en katalog inuti behållaren.

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

De –privileged är godkänd när SELinux är inställd på att verkställa. De -v anger den externa volymen som finns på värden. Behållarvolymen här är /mnt.

När vi har kommit åt skalet kommer vi att skapa en exempelfil testing.txt i /mnt som visat.

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

Det gör vi då exit behållaren och kontrollera om filen finns i det externa minnet som finns på värden

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

Utgång ⇒ This tests persistent external storage.

Konfigurera beständig lagring för behållare
Konfigurera beständig lagring för behållare

Stoppa och ta bort behållare

När du är klar med att köra din behållare kan du stoppa den med hjälp av podman stop följt av container-id som du kan få från podman ps.

# podman stop container-id
Stoppa behållarebild
Stoppa behållarebild

För att ta bort behållare som du inte längre behöver, se först till att du stoppar den och anropar sedan podman rm följt av behållarens id eller namn som ett alternativ.

# podman rm container-id

För att ta bort flera behållare samtidigt i ett kommando, ange behållaren ids åtskilda av ett mellanslag.

# podman rm container-id-1 container-id-2 container-id-3
Ta bort behållarebild
Ta bort behållarebild

För att rensa alla dina behållare, kör kommandot:

# podman rm -a
Rensa alla behållare
Rensa alla behållare

Ta bort en bild

För att ta bort en bild, se först till att alla behållare som skapats från bilderna stoppas och tas bort som diskuterades i föregående underämne.

Fortsätt sedan och kör podman -rmi följt av bildens ID som visas:

# podman -rmi image-id
Ta bort bild
Ta bort bild

Slutsats

Detta avslutar det här kapitlet om att hantera och arbeta med containrar i RHEL 8. Vi hoppas att den här guiden gav en anständig förståelse för behållare och hur du kan interagera och hantera dem på din RHEL systemet använder podman och Skopeo.