Podman installeren en gebruiken om Containers te draaien op Rocky Linux 8

Podman is een gratis en open-source container platform gebouwd om containers en pods te ontwikkelen, beheren en inzetten op een Linux omgeving. Redhat ontwikkelde Podman in 2018. Het is een containerisatie engine die anders werkt dan Docker. Podman is niet afhankelijk van een daemon om te werken, in tegenstelling tot Docker dat Docker CLI en Docker daemon gebruikt. Afhankelijk zijn van daemon leidt tot een single point of failure.

Podman is ontworpen volgens de OCI (Open Container Initiative) standaarden die Podman in staat stellen direct te interageren met de kernel, containers en images. Het is ook veiliger dan Docker omdat het geen root toegang nodig heeft. Podman kan gebruikt worden als een drop-in vervanging voor Docker omdat beide OCI-compliant zijn.

Dit artikel laat je zien hoe je Podman installeert en gebruikt om images en containers te maken en te beheren.

Vereisten

  1. Een Rocky Linux gebaseerde server

  2. Een non-sudo gebruiker met root privileges.

  3. Zorg ervoor dat de server is bijgewerkt.

    $ sudo dnf update
    

Installeer Podman

Podman is opgenomen in de container-tools module, samen met Buildah en Skopeo. Het is ook beschikbaar in de AppStream repository voor Rocky Linux 8. We zullen de module methode gebruiken.

Installeer Podman met het dnf module commando.

$ sudo dnf module install container-tools

Controleer de versie van Podman om te zien of hij goed geïnstalleerd is.

$ podman --version
podman version 3.2.3

Container images zoeken en downloaden

Om naar het image van Nginx te zoeken, gebruik je het volgende commando.

$ podman search nginx

Podman Zoeken Beeld Resultaat

In de uitvoer zie je de naam van het register waar het image vandaan komt en een beschrijving van de images.

Om het image te downloaden, gebruik je een van de volgende commando’s.

$ podman pull docker.io/library/nginx

OR

$ podman pull nginx

Je kunt de gedownloade images bekijken via het volgende commando.

$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      f8f4ffc8092c  3 days ago  138 MB

Containers uitvoeren

Gebruik het volgende commando om een container te draaien die het Nginx image gebruikt. We hebben de container de naam webserver gegeven.

$ podman run -d --name webserver nginx 

We kunnen hetzelfde image gebruiken om een andere container met een andere naam te lanceren.

$ podman run -d --name webserver2 nginx

We kunnen een onbeperkt aantal containers starten met hetzelfde image.

Containers opnoemen en stoppen

Om alle draaiende containers op te sommen, gebruik je het volgende commando.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  31 seconds ago  Up 31 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 seconds ago   Up 3 seconds ago               webserver2

Stop de draaiende container.

$ podman stop webserver
webserver

Controleer of hij gestopt is.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS       NAMES
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago              webserver2

Om alle containers op te sommen, ook de gestopte, moet je de vlag -a gebruiken.

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                     PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago       Exited (0) 35 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago                  webserver2

Start een gestopte container

Gebruik het volgende commando om een gestopte container te starten.

$ podman start webserver
webserver

Controleer of hij gestart is.

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  3 minutes ago  Up 16 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago  Up 2 minutes ago               webserver2

Container verwijderen

Je moet een container stoppen voordat je hem verwijdert.

$ podman stop webserver2

Verwijder de container.

$ podman rm webserver2

Je kunt een draaiende container verwijderen door de --force vlag te gebruiken.

$ podman rm webserver2 --force
35a286ba5a553d5f88e3d9795780f893cfb58bf4a126c4912d1ec56b9d0e5a27

Container doden

Stoppen en Killen van een Container zijn twee verschillende dingen die uiteindelijk hetzelfde bereiken. Het verschil is dat Stopping een container sierlijk afsluit, terwijl Killing een container met geweld beëindigt, met gegevensverlies tot gevolg.

Gebruik het volgende commando om de container te doden.

$ podman kill -s 9 webserver2

Het bovenstaande commando gebruikt de SIGNAL 9 (SIGKILL) optie om de container te doden.

Om alle containers te doden, gebruik je de --all of -a vlag en om alleen de nieuwste container te doden, gebruik je de --latest of -l vlag.

Verwijder beeld

Je kunt de beelden wissen met het rmi commando.

$ podman rmi registry.redhat.io/rhel8/rsyslog

Je kunt meerdere images verwijderen door ze met komma’s van elkaar te scheiden.

$ podman rmi registry.redhat.io/rhel8/rsyslog registry.redhat.io/ubi8/ubi

Om alle images op je systeem te verwijderen, gebruik je de -a vlag.

$ podman rmi -a

Containerlogs bekijken

Om de container logs te bekijken, gebruik je het volgende commando.

$ podman logs webserver
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
......

Je kunt de logs beperken tot de laatste 5 regels door de --tail optie te gebruiken.

$ podman logs --tail=5 webserver
2021/10/05 10:13:52 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/10/05 10:13:52 [notice] 1#1: OS: Linux 4.18.0-305.19.1.el8_4.x86_64
2021/10/05 10:13:52 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 262144:262144
2021/10/05 10:13:52 [notice] 1#1: start worker processes
2021/10/05 10:13:52 [notice] 1#1: start worker process 23

Standaard krijg je geen tijdstempels op de logs. Gebruik de -t vlag om tijdstempels aan je logs toe te voegen.

$ podman logs -t webserver
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2021-10-05T09:25:02.033956297Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2021-10-05T09:25:02.043751152Z 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
2021-10-05T09:25:02.064561317Z 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
.....

Containers inspecteren

Inspecteren van een container drukt de informatie over een container af.

$ podman inspect webserver
[
    {
        "Id": "19b6668bc6278a66b3ffc98ae1515af25f5bebcd20bf26de803cae41c4485f59",
        "Created": "2021-10-05T09:25:01.784949744Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "OciVersion": "1.0.2-dev",
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4423,
....

Het standaard commando drukt een lange uitvoer af in JSON formaat. Om de uitvoer te filteren moet je de --format optie gebruiken. Om te weten te komen wanneer de container gestart werd, voer je het volgende commando uit.

$ podman inspect webserver --format '{{.State.StartedAt}}'
2021-10-05 10:13:52.794806322 +0000 UTC

Toegang tot Container Shell

Je kunt de Shell prompt van elke container openen met de exec optie.

$ podman exec -it webserver2 /bin/bash

Pods

Podman heeft een unieke eigenschap die Docker mist. Podman kan Pods maken van containers die samen werken. Hiermee kun je meerdere containers samen beheren.

Om een Pod te maken, gebruik je het volgende commando.

$ podman pod create --name mypod

Voeg de Containers toe aan de nieuw aangemaakte pod.

$ podman run --pod mypod --name myimage1 image:latest
$ podman run --pod mypod --name myimage2 diff-image:latest

Je kunt nu containers beheren met eenvoudige eenregelige commando’s.

$ podman kill mypod      # Kill all containers
$ podman restart mypod   # Restart all containers
$ podman stop mypod      # Stop all containers
$ podman pod ps			# List all pods
$ podman pod top mypod   # Display running processes in a pod
$ podman pod inspect mypod # Inspect a Pod
$ podman pod rm mypod    # Remove the pod

Conclusie

Dit beëindigt onze tutorial over het installeren en gebruiken van Podman om Containers te draaien. Er zijn een heleboel dingen die je met Podman kunt doen die we niet behandeld hebben. Als je vragen hebt, stel ze dan in de reacties hieronder.