Podman

From wiki
Jump to navigation Jump to search

Podman is used to create containers, like Docker. In a container system resources are separated from each other e.g. to create a development environment where the developer can experiment freely without the risk of jeopardizing the host system.

The main difference is podman does not need a daemon like docker. It is lighter and more secure [1]

A containerfile defines what will be in the podman image, running the image will create a container.

Podman containterfiles have the same syntax as dockerfiles. The podman build command looks first for Containerfile and then for Dockerfile in the specified directory.

Basics

apt install podman
Install podman
This containerfile creates a working container with a python virtual environment
FROM debian
LABEL name="Hans de Ridder"
RUN apt-get update
RUN apt-get -y install python3-full
RUN python3 -m venv /home/ubuntu/venv
ENV PATH="/home/ubuntu/venv/bin:$PATH"
RUN pip install pandas
CMD ["echo", "I'm alive"]
podman build -t <name>:<tag> <directory>
This builds the image with a name and a tag
podman pull <registry image>
Create an image from the registry image (see #FROM)
podman image ls
List all existing images
podman image inspect <image ID>
Return the whole image specification as json-string
podman run -v <hostdir>:<containerdir> --rm -it <image ID> bash
Create the container and open a bash prompt in it (as root user). When leaving the shell the container is closed
This way you can run any command in a container that only exists while the command is running.
<hostdir> is mounted on <containerdir> which will be created automatically.
NOTE: <hostdir> should not be a NFS filesystem, the container has no access to that.
podman run -it --network=host <image ID>
You will enter the container with the network settings (interface, hostname,...) from the host system. This enables mailing from the container.
podman run --rm <image ID> <command>
Run <command> in the container, remove the container on exit,
podman exec -it <containerid> <command>
Run <command> in a running container, -it is needed for interactive commands like bash
podman stop <containerID>
Stop a container
podman rm <containerID>
Remove a container
podman image rm <imageID>
Remove an image
podman ps -a
List all containers
podman system prune
Delete unused images and build caches
podman system prune -a
Delete unused images and all build caches

Containerfile commands

FROM

FROM <Imagelocation>
Specifies what is the base-image. Images are on a registry server like docker.io. You can use aliases like ubuntu or debian but that is not advised as you cannot be 100% sure where the images will be coming from. Therefor it is advised to user the full image path like docker.io/library/debian
podman search docker.io/library/nginx
List all images for nginx

RUN

RUN <command>
Specify a command to run when the images is build. You can have a whole lot of these.

CMD

CMD <command>
Command to run when the container starts

LABEL

LABEL name="My Name"
Give the container a label. You can have several labels of a container.

COPY

COPY <localfile> <containerpath>
Copy <localfile>, that must be in Containerfile directory, to <containerpath>

Full-fledged container

Containerfile

FROM docker.io/library/debian
LABEL name="Full-fledged debian image"
LABEL maintainer="Hans de Ridder"
RUN apt-get update
RUN apt-get -y install less joe vim exim4 procps
RUN apt-get -y install python3-full
RUN python3 -m venv /opt/python/venv
ENV PATH="/opt/python/venv/bin:$PATH"
RUN pip install pandas
COPY update-exim4.conf.conf /etc/exim4/
RUN update-exim4.conf
CMD ["bash", "-i"]

Usage

podman build -t debian <directory>
Build the image
podman run -it --name FF <image ID>
You will enter the container.
podman start -ia FF
Re-enter the container after you left it. If the container is already running you will be in the same shell.