Zum Hauptinhalt springen

Podman Installationsanweisungen

Suchen Sie nach einer GUI? Sie finden Podman Desktop hier.

Installation auf Mac & Windows

Obwohl "Container Linux sind", läuft Podman auch auf Mac und Windows, wo es eine native Podman CLI bereitstellt und ein Gast-Linux-System einbettet, um Ihre Container zu starten. Dieser Gast wird als Podman Machine bezeichnet und wird mit dem Befehl podman machine verwaltet. Podman auf Mac und Windows lauscht auch auf Docker API-Clients und unterstützt die direkte Verwendung von Docker-basierten Tools und den programmatischen Zugriff aus Ihrer bevorzugten Sprache.

macOS

Auf Mac wird jede Podman Machine von einer virtuellen Maschine unterstützt. Nach der Installation kann der podman-Befehl direkt von der Unix-Shell im Terminal ausgeführt werden, wo er remote mit dem podman- Service kommuniziert, der in der Machine VM läuft.

Podman Installer herunterladen (Empfohlen)

Podman kann von der Podman.io Website heruntergeladen werden.

Wir laden auch die Installer und andere Binärdateien auf unsere GitHub Release-Seite hoch.

Obwohl nicht empfohlen, kann Podman auch über Homebrew, den Paketmanager, bezogen werden.

Installation über Brew

Da Brew ein von der Community gepflegter Paketmanager ist, können wir die Stabilität von Brew-Installationen von Podman nicht garantieren. Daher wird die Installation über Brew nicht empfohlen.

Wenn Sie jedoch Brew verwenden möchten, müssen Sie zuerst Homebrew installieren. Sobald Sie Brew eingerichtet haben, können Sie den Befehl brew install verwenden, um Podman zu installieren:

brew install podman

Nach der Installation müssen Sie Ihre erste Podman Machine erstellen und starten:

podman machine init
podman machine start

Sie können dann die Installationsinformationen überprüfen mit:

podman info

Wir stellen auch Binärdateien und einen pkginstaller auf unserer GitHub Release-Seite bereit

Windows

Unter Windows wird jede Podman Machine von einer virtualisierten Windows Subsystem for Linux (WSLv2) Distribution unterstützt. Nach der Installation kann der podman-Befehl direkt von Ihrer Windows PowerShell (oder CMD) Eingabeaufforderung ausgeführt werden, wo er remote mit dem podman-Service kommuniziert, der in der WSL-Umgebung läuft. Alternativ können Sie direkt von der WSL-Instanz auf Podman zugreifen, wenn Sie eine Linux-Eingabeaufforderung und Linux-Tools bevorzugen.

Siehe den Podman for Windows Leitfaden für Einrichtungs- und Nutzungsanweisungen.

Installation auf Linux

Linux-Distributionen

Arch Linux & Manjaro Linux

sudo pacman -S podman

Wenn Sie Probleme beim Ausführen von Podman im rootless Modus haben, folgen Sie den Anweisungen hier

Für weitere Informationen zu Podman auf ArchLinux klicken Sie hier

Alpine Linux

sudo apk add podman

Für weitere Details beziehen Sie sich bitte auf die Anweisungen im Alpine Linux Wiki.

CentOS Stream

Podman ist standardmäßig im AppStream Repository für CentOS Stream 9+ verfügbar.

sudo dnf -y install podman

Debian

Das podman-Paket ist in den Debian 11 (Bullseye) Repositories und später verfügbar.

sudo apt-get -y install podman

Fedora

sudo dnf -y install podman

Um podman machine ... Befehle auszuführen

sudo dnf -y install podman-machine

slirp4netns ist nicht mehr der Standard für rootless Networking bei neuen podman-Installationen, wurde zugunsten von passt abgelöst. Wenn Sie Container haben, die slirp4netns verwenden, stellen Sie sicher, dass slirp4netns installiert ist:

sudo dnf -y install slirp4netns

Fedora CoreOS, Fedora Silverblue

Eingebaut, keine Installation erforderlich

Gentoo

sudo emerge app-containers/podman

OpenEmbedded

Bitbake-Rezepte für Podman und seine Abhängigkeiten sind im meta-virtualization Layer verfügbar. Fügen Sie den Layer zu Ihrer OpenEmbedded Build-Umgebung hinzu und erstellen Sie Podman mit:

bitbake podman

openSUSE

sudo zypper install podman

openSUSE Kubic

Eingebaut, keine Installation erforderlich

Raspberry Pi OS arm64 (beta)

Raspberry Pi OS verwendet die Standard-Debian-Repositories, daher ist es vollständig kompatibel mit Debians arm64-Repository. Sie können einfach den Schritten für Debian folgen, um Podman zu installieren.

RHEL

Folgen Sie der offiziellen Dokumentation.

Ubuntu

Das podman-Paket ist in den offiziellen Repositories für Ubuntu 20.10 und neuer verfügbar.

# Ubuntu 20.10 und neuer
sudo apt-get update
sudo apt-get -y install podman

Linux Mint

Folgen Sie den Schritten für Ubuntu (oder Debian, wenn Sie LMDE verwenden).

Installation von Entwicklungsversionen von Podman

Fedora

Sie können das allerneueste Podman in Fedoras updates-testing Repository testen, bevor es an alle Fedora-Benutzer geht.

sudo dnf update --refresh --enablerepo=updates-testing podman

Wenn Sie ein neueres Podman-Paket aus Fedoras updates-testing verwenden, würden wir Ihr +1 Feedback in Bodhi, Fedoras Update-Management- System schätzen.

Installation von Bleeding-Edge-Versionen von Podman

Wenn Sie Gefahr mögen und daran interessiert sind, die neuesten unveröffentlichten Bits von Podman auf Fedora, CentOS Stream 9+ und RHEL9+ zu testen, haben wir ein Copr Repository.

VORSICHT: Dieses Repository enthält RPM-Builds, die mit dem main Branch der Upstream-Container-Tools-Repositories generiert wurden, und kann einfach NICHT für den Produktionseinsatz empfohlen werden.

Aktivieren Sie das Copr und installieren Sie podman.

sudo dnf copr enable rhcontainerbot/podman-next -y
sudo dnf install podman

Installation auf FreeBSD 14.0

[!WARNING] Der FreeBSD-Port der Podman Container Engine ist experimentell und sollte nur für Evaluierungs- und Testzwecke verwendet werden.

Sie können Podman auf FreeBSD mit pkg installieren:

pkg install podman

Es gibt auch ein podman-suite Meta-Paket, das zusätzliche Pakete für Sie holt (buildah, skopeo).

Anfangskonfiguration

Um Podmans Container-Restart-Policy ordnungsgemäß zu unterstützen, benötigt conmon fdescfs(5), das auf /dev/fd gemountet ist.

Wenn /dev/fd noch nicht gemountet ist:

mount -t fdescfs fdesc /dev/fd

Um es dauerhaft zu machen, fügen Sie die folgende Zeile zu /etc/fstab hinzu:

fdesc   /dev/fd         fdescfs         rw      0       0

Um Podman nach einem Neustart zu starten:

service podman enable
Netzwerk

Container-Netzwerk stützt sich auf NAT, um Container-Netzwerkpakete an das Netzwerk des Hosts weiterzuleiten. Dies erfordert eine PF-Firewall zur Durchführung der Übersetzung. Ein einfaches Beispiel ist enthalten - um es zu verwenden:

cp /usr/local/etc/containers/pf.conf.sample /etc/pf.conf

Bearbeiten Sie /etc/pf.conf und setzen Sie die Variablen v4egress_if, v6egress_if auf Ihre Netzwerkschnittstelle(n)

Aktivieren und starten Sie pf:

service pf enable
service pf start

Die Beispiel-PF-Konfiguration enthält Unterstützung für Port-Umleitungen. Diese sind als Redirect-Regeln in Anchors implementiert, die unter cni-rdr verschachtelt sind.

Unterstützung für die Umleitung von Verbindungen vom Container-Host zu Services, die innerhalb eines Containers laufen, ist für FreeBSD 13.3 und später enthalten. Um dies zu aktivieren, laden Sie zuerst das pf-Kernel-Modul und aktivieren Sie PF-Unterstützung für diese Umleitungen mit sysctl:

echo 'pf_load="YES"' >> /boot/loader.conf
kldload pf
sysctl net.pf.filter_local=1
echo 'net.pf.filter_local=1' >> /etc/sysctl.conf.local
service pf restart

Redirect-Regeln funktionieren, wenn die Zieladresse localhost ist (z.B. 127.0.0.1 oder ::1) - um dies zu aktivieren, muss die folgende Zeile in Ihrer /etc/pf.conf enthalten sein:

nat-anchor "cni-rdr/*"

Bei einem Upgrade von einer älteren Version muss dies zu /etc/pf.conf hinzugefügt werden.

Zum Beispiel, wenn Host-Port 1234 zu einem HTTP-Service umgeleitet wird, der in einem Container läuft, können Sie sich damit verbinden:

fetch -o- http://$(hostname):1234

oder

fetch -o- http://localhost:1234
Speicher

Container-Images und zugehörige Zustände werden in /var/db/containers gespeichert. Es wird empfohlen, dafür ZFS zu verwenden:

zfs create -o mountpoint=/var/db/containers zroot/containers

Wenn Ihr System ZFS nicht verwenden kann, ändern Sie storage.conf, um den vfs Storage-Treiber zu verwenden:

sed -I .bak -e 's/driver = "zfs"/driver = "vfs"/' /usr/local/etc/containers/storage.conf
Überprüfung

Nach dem Befolgen dieser Schritte sollten Sie native Images ausführen können:

podman run --rm docker.io/dougrabson/hello
Linux-Emulation

Es ist möglich, viele Linux-Container-Images mit FreeBSDs Linux-Emulation auszuführen:

sudo sysrc linux_enable=YES
sudo service linux start
sudo podman run --rm --os=linux docker.io/library/alpine cat /etc/os-release | head -1
NAME="Alpine Linux"

Erstellen aus dem Quellcode

Build- und Laufzeit-Abhängigkeiten

Erforderlich

Auf Fedora:

# Build-Abhängigkeiten installieren
sudo dnf -y builddep rpm/podman.spec

# Laufzeit-Abhängigkeiten installieren
sudo dnf -y install catatonit conmon containers-common-extra

Auf allen RHEL und CentOS Stream installieren Sie zuerst dnf-builddep:

sudo dnf -y install 'dnf-command(builddep)'

Build-Abhängigkeiten installieren:

# CentOS Stream 9+
sudo dnf -y builddep rpm/podman.spec --enablerepo=crb

# RHEL 9+
sudo dnf -y builddep rpm/podman.spec --enablerepo=codeready-builder-for-rhel-$(rpm --eval %{?rhel})-$(uname -m)-rpms

Laufzeit-Abhängigkeiten installieren:

sudo dnf -y install \
conmon \
containers-common \
crun \
iptables \
netavark \
nftables \
slirp4netns

Debian, Ubuntu und verwandte Distributionen:

sudo apt-get install \
btrfs-progs \
gcc \
git \
golang-go \
go-md2man \
iptables \
libassuan-dev \
libbtrfs-dev \
libc6-dev \
libdevmapper-dev \
libglib2.0-dev \
libgpgme-dev \
libgpg-error-dev \
libprotobuf-dev \
libprotobuf-c-dev \
libseccomp-dev \
libselinux1-dev \
libsystemd-dev \
make \
netavark \
passt \
pkg-config \
runc \
uidmap

Das netavark-Paket ist möglicherweise nicht auf älteren Debian / Ubuntu Versionen verfügbar. Installieren Sie stattdessen das containernetworking-plugins-Paket.

Auf openSUSE Leap 15.x und Tumbleweed:

sudo zypper -n in libseccomp-devel libgpgme-devel

Auf Manjaro (und möglicherweise anderen Linux-Distributionen):

Stellen Sie sicher, dass der Linux-Kernel User-Namespaces unterstützt:

> zgrep CONFIG_USER_NS /proc/config.gz
CONFIG_USER_NS=y

Falls nicht, aktualisieren Sie bitte den Kernel. Für Manjaro Linux finden Sie die Anweisungen hier: https://wiki.manjaro.org/index.php/Manjaro_Kernels

Danach aktivieren Sie User-Namespaces:

sudo sysctl kernel.unprivileged_userns_clone=1

Um die User-Namespaces dauerhaft zu aktivieren:

echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/userns.conf

Fehlende Abhängigkeiten erstellen

Wenn Abhängigkeiten nicht installiert werden können oder nicht ausreichend aktuell sind, müssen sie aus dem Quellcode erstellt werden. Dies betrifft hauptsächlich Debian, Ubuntu und verwandte Distributionen oder RHEL, wo kein Abonnement aktiv ist (z.B. Cloud-VMs).

golang

Achten Sie darauf, dass die Version von golang neu genug ist (d.h. go version), seit Januar 2022 ist Version 1.16.x oder höher erforderlich. Die aktuelle minimal erforderliche Version kann immer in der go.mod Datei gefunden werden. Falls benötigt, sind golang-Kits unter https://golang.org/dl/ verfügbar. Alternativ kann go wie folgt aus dem Quellcode erstellt werden (es ist hilfreich, das System-go installiert zu lassen, um das Bootstrapping von go zu vermeiden):

export GOPATH=~/go
git clone https://go.googlesource.com/go $GOPATH
cd $GOPATH
cd src
./all.bash
export PATH=$GOPATH/bin:$PATH

conmon

Die neueste Version von conmon wird auf dem System erwartet. Conmon wird verwendet, um OCI-Runtimes zu überwachen. Um aus dem Quellcode zu erstellen, verwenden Sie folgendes:

git clone https://github.com/containers/conmon
cd conmon
export GOCACHE="$(mktemp -d)"
make
sudo make podman

crun / runc

Die neueste Version von mindestens einer Container-Runtime wird auf dem System erwartet. crun oder runc sind einige der Möglichkeiten, und eine wird als Standard-Runtime von Podman ausgewählt (crun hat Priorität vor runc). Unterstützte Versionen von crun oder runc sind beispielsweise auf Ubuntu 22.04 verfügbar. runc Version 1.0.0-rc4 ist die Mindestanforderung, die seit Ubuntu 18.04 verfügbar ist.

Zur Überprüfung sollte runc --version mindestens spec: 1.0.1 ausgeben, andernfalls erstellen Sie Ihre eigene:

git clone https://github.com/opencontainers/runc.git $GOPATH/src/github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc
make BUILDTAGS="selinux seccomp"
sudo cp runc /usr/bin/runc

Konfiguration hinzufügen

sudo mkdir -p /etc/containers
sudo curl -L -o /etc/containers/registries.conf https://raw.githubusercontent.com/containers/image/main/registries.conf
sudo curl -L -o /etc/containers/policy.json https://raw.githubusercontent.com/containers/image/main/default-policy.json

Optionale Pakete

Fedora, CentOS, RHEL und verwandte Distributionen:

(keine optionalen Pakete)

Debian, Ubuntu und verwandte Distributionen:

apt-get install -y \
libapparmor-dev

Quellcode holen

Stellen Sie zunächst sicher, dass die go version, die zuerst im $PATH gefunden wird, 1.16.x oder höher ist. Die Anweisungen oben helfen Ihnen dabei, eine neuere Version von Go zu kompilieren, falls erforderlich. Dann können wir Podman erstellen:

git clone https://github.com/containers/podman/
cd podman
make BUILDTAGS="selinux seccomp" PREFIX=/usr
sudo env PATH=$PATH make install PREFIX=/usr

Build Tags

Andernfalls, wenn Sie Podman nicht mit seccomp- oder selinux-Unterstützung erstellen möchten, können Sie BUILDTAGS="" beim Ausführen von make hinzufügen.

make BUILDTAGS=""
sudo make install

Podman unterstützt optionale Build-Tags für die Kompilierung der Unterstützung verschiedener Features. Um Build-Tags zur make-Option hinzuzufügen, muss die Variable BUILDTAGS gesetzt werden, zum Beispiel:

make BUILDTAGS='seccomp apparmor'

Wenn Sie auf RHEL8 erstellen, müssen Sie ohne btrfs-Unterstützung erstellen, da es entfernt wurde:

make BUILDTAGS="btrfs_noversion exclude_graphdriver_btrfs"
Build TagFeatureAbhängigkeit
apparmorapparmor-Unterstützunglibapparmor
cniCNI-Networking
exclude_graphdriver_btrfsbtrfs ausschließenlibbtrfs
exclude_graphdriver_devicemapperdevice-mapper ausschließenlibdm
libdm_no_deferred_removeverzögerte Entfernung in libdm ausschließenlibdm
seccompSyscall-Filterunglibseccomp
selinuxselinux Prozess- und Mount-Labeling
systemdjournald-Logginglibsystemd

Beachten Sie, dass Podman device-mapper nicht offiziell unterstützt. Daher ist das Tag exclude_graphdriver_devicemapper obligatorisch.

Vendoring - Abhängigkeitsverwaltung

Dieses Projekt verwendet go modules für die Abhängigkeitsverwaltung. Wenn die CI sich über einen Pull Request beschwert, der einen unsauberen Zustand hinterlässt, hat sie wahrscheinlich recht. Nach Änderungen an Abhängigkeiten stellen Sie sicher, dass Sie make vendor ausführen, um den Code mit dem go-Modul zu synchronisieren und das ./vendor-Verzeichnis neu zu füllen.

Ansible

Eine Ansible Role ist auch verfügbar, um die Installation der oben genannten statisch verlinkten Binärdatei auf unterstützten Betriebssystemen zu automatisieren:

sudo su -
mkdir -p ~/.ansible/roles
cd ~/.ansible/roles
git clone https://github.com/alvistack/ansible-role-podman.git podman
cd ~/.ansible/roles/podman
pip3 install --upgrade --ignore-installed --requirement requirements.txt
molecule converge
molecule verify

Konfigurationsdateien

registries.conf

Man Page: registries.conf.5

/etc/containers/registries.conf

registries.conf ist die Konfigurationsdatei, die angibt, welche Container-Registries konsultiert werden sollen, wenn Image-Namen vervollständigt werden, die keinen Registry- oder Domain-Teil enthalten.

HINWEIS: Auf macOS oder Windows führen Sie bitte den Befehl podman machine ssh aus, um die Machine VM zu betreten und die /etc/containers/registries.conf Datei mit demselben Konfigurationsinhalt zu bearbeiten. Wenn Sie Berechtigungsprobleme haben, führen Sie podman machine set --rootful aus und versuchen Sie es erneut.

Beispiel aus dem Fedora containers-common Paket

$ cat /etc/containers/registries.conf
# Für weitere Informationen zu dieser Konfigurationsdatei siehe containers-registries.conf(5).
#
# HINWEIS: RISIKO BEI DER VERWENDUNG VON UNQUALIFIZIERTEN IMAGE-NAMEN
# Wir empfehlen, immer vollqualifizierte Image-Namen zu verwenden, einschließlich des Registry-
# Servers (vollständiger DNS-Name), Namespace, Image-Name und Tag
# (z.B. registry.redhat.io/ubi8/ubi:latest). Das Pullen über Digest (d.h.
# quay.io/repository/name@digest) eliminiert zusätzlich die Mehrdeutigkeit von Tags.
# Bei der Verwendung von Kurznamen besteht immer ein inhärentes Risiko, dass das zu pullende
# Image gefälscht werden könnte. Zum Beispiel möchte ein Benutzer ein Image namens
# `foobar` von einer Registry pullen und erwartet, dass es von myregistry.com kommt. Wenn
# myregistry.com nicht an erster Stelle in der Suchliste steht, könnte ein Angreifer ein
# anderes `foobar` Image in einer Registry weiter oben in der Suchliste platzieren. Der Benutzer
# würde versehentlich das Image und den Code des Angreifers pullen und ausführen anstatt des
# beabsichtigten Inhalts. Wir empfehlen, nur Registries hinzuzufügen, die vollständig
# vertrauenswürdig sind (d.h. Registries, die unbekannten oder anonymen Benutzern nicht erlauben,
# Konten mit beliebigen Namen zu erstellen). Dies verhindert, dass ein Image gefälscht,
# besetzt oder anderweitig unsicher gemacht wird. Wenn es notwendig ist, eine
# dieser Registries zu verwenden, sollte sie am Ende der Liste hinzugefügt werden.
#
# # Ein Array von host[:port] Registries, die beim Pullen eines unqualifizierten Images ausprobiert werden sollen, in Reihenfolge.
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "docker.io"]
#
# [[registry]]
# # The "prefix" field is used to choose the relevant [[registry]] TOML table;
# # (only) the TOML table with the longest match for the input image name
# # (taking into account namespace/repo/tag/digest separators) is used.
# #
# # If the prefix field is missing, it defaults to be the same as the "location" field.
# prefix = "example.com/foo"
#
# # If true, unencrypted HTTP as well as TLS connections with untrusted
# # certificates are allowed.
# insecure = false
#
# # If true, pulling images with matching names is forbidden.
# blocked = false
#
# # The physical location of the "prefix"-rooted namespace.
# #
# # By default, this equal to "prefix" (in which case "prefix" can be omitted
# # and the [[registry]] TOML table can only specify "location").
# #
# # Example: Given
# # prefix = "example.com/foo"
# # location = "internal-registry-for-example.net/bar"
# # requests for the image example.com/foo/myimage:latest will actually work with the
# # internal-registry-for-example.net/bar/myimage:latest image.
# location = "internal-registry-for-example.com/bar"
#
# # (Possibly-partial) mirrors for the "prefix"-rooted namespace.
# #
# # The mirrors are attempted in the specified order; the first one that can be
# # contacted and contains the image will be used (and if none of the mirrors contains the image,
# # the primary location specified by the "registry.location" field, or using the unmodified
# # user-specified reference, is tried last).
# #
# # Each TOML table in the "mirror" array can contain the following fields, with the same semantics
# # as if specified in the [[registry]] TOML table directly:
# # - location
# # - insecure
# [[registry.mirror]]
# location = "example-mirror-0.local/mirror-for-foo"
# [[registry.mirror]]
# location = "example-mirror-1.local/mirrors/foo"
# insecure = true
# # Given the above, a pull of example.com/foo/image:latest will try:
# # 1. example-mirror-0.local/mirror-for-foo/image:latest
# # 2. example-mirror-1.local/mirrors/foo/image:latest
# # 3. internal-registry-for-example.net/bar/image:latest
# # in order, and use the first one that exists.
#
# short-name-mode="enforcing"

[[registry]]
location="localhost:5000"
insecure=true

mounts.conf

/usr/share/containers/mounts.conf und optional /etc/containers/mounts.conf

Die mounts.conf Dateien spezifizieren Volume-Mount-Verzeichnisse, die automatisch in Container eingebunden werden, wenn die Befehle podman run oder podman build ausgeführt werden. Container-Prozesse können dann diesen Inhalt verwenden. Der Volume-Mount-Inhalt wird nicht in das finale Image committet.

Normalerweise werden diese Verzeichnisse verwendet, um Secrets oder Credentials zu übergeben, die von der Paket-Software benötigt werden, um auf entfernte Paket-Repositories zuzugreifen.

Zum Beispiel, bei einer mounts.conf mit der Zeile "/usr/share/rhel/secrets:/run/secrets", wird der Inhalt des /usr/share/rhel/secrets Verzeichnisses auf /run/secrets innerhalb des Containers gemountet. Dieser Mountpoint ermöglicht es, Red Hat Enterprise Linux Abonnements vom Host innerhalb des Containers zu verwenden.

Beachten Sie, dass dies kein Volume-Mount ist. Der Inhalt der Volumes wird in den Container-Speicher kopiert, nicht direkt vom Host bind-gemountet.

Beispiel aus dem Fedora containers-common Paket:

cat /usr/share/containers/mounts.conf
/usr/share/rhel/secrets:/run/secrets

seccomp.json

/usr/share/containers/seccomp.json

seccomp.json enthält die Whitelist von seccomp-Regeln, die innerhalb von Containern erlaubt sein sollen. Diese Datei wird normalerweise vom containers-common Paket bereitgestellt.

Der obige Link führt Sie zur seccomp.json

policy.json

/etc/containers/policy.json

Man Page: policy.json.5

Beispiel aus dem Fedora containers-common Paket:

cat /etc/containers/policy.json
{
"default": [
{
"type": "insecureAcceptAnything"
}
],
"transports":
{
"docker-daemon":
{
"": [{"type":"insecureAcceptAnything"}]
}
}
}