インストール - Podman

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2024年2月3日 (土) 15:39時点におけるWiki (トーク | 投稿記録)による版 (→‎ルートレスモード)
ナビゲーションに移動 検索に移動

概要

コンテナとは、ソフトウェアプロセスやマイクロサービスをパッケージ化して、あらゆるコンピューティング環境で実行可能にするソフトウェアソリューションである。

コンテナに含まれるファイルには、アプリケーションコード、環境変数、設定コード、バイナリプログラム、ソフトウェアの依存関係、ライブラリ等がある。
これらのコンポーネントをバンドルするプロセスはコンテナ化と呼ばれ、最終的な製品はコンテナイメージとして知られている。

このイメージは、クラウド、オンプレミスのデータシステム、ローカルシステム等、あらゆるプラットフォームにデプロイされる。

Podman (Pod Manage) は、Open Container Initiatives (OCI) のコンテナイメージを開発、管理、本番環境で実行する時に使用するコンテナエンジンである。
OCIは、コンテナフォーマットとランタイムに関するOSレベルの仮想化ソフトウェアコンテナのオープンなガバナンス構造を実装するために設計された。

Podmanコンテナは、スーパユーザ / 非スーパーユーザのいずれでも実行可能である。


Podmanのインストール

パッケージ管理システムからインストール

# RHEL
sudo yum install epel-release
sudo dnf install podman

# SUSE
sudo zypper install podman


Tarballからインストール

※注意
スタティックビルド済みのPodmanを使用する場合は、Podman Desktopが使用できないことに注意する。

PodmanのGithubにアクセスして、スタティックビルド済みのPodmanをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf podman-remote-static-linux_<アーキテクチャ名>.tar.gz
cd bin
mv podman-remote-static-linux_<アーキテクチャ名> podman


必要ならば、Podmanを任意のインストールディレクトリに配置する。

mkdir -p <任意のインストールディレクトリ>
mv podman <任意のインストールディレクトリ>


~/.profileファイル等に、環境変数PATHおよびソケットの設定を記述する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="<Podmanのインストールディレクトリ>:$PATH"
 
 export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock


SUSEにおいて、パッケージ管理システムにgvproxyパッケージが存在しないため、手動でgvproxyをインストールする必要がある。

まず、gvproxyのGithubにアクセスして、gvproxyをダウンロードする。
ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。

mv gvproxy-linux-<アーキテクチャ名> gvproxy
sudo mkdir -p /usr/libexec/podman  または  sudo mkdir -p /usr/local/libexec/podman
sudo mv gvproxy /usr/local/libexec/podman


ソースコードからインストール

Goのバージョンが1.16未満の場合

もし、パッケージ管理システムのGoのバージョンが1.16未満の場合は、Goの公式Webサイトにアクセスして、Goをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf go<バージョン>.linux-<アーキテクチャ名>.tar.gz
mv go<バージョン>.linux-<アーキテクチャ名> Go


必要ならば、Goを任意のインストールディクトリに配置する。

mv Go <任意のインストールディレクトリ>


~/.profileファイル等に、環境変数PATHを追記する。

 export GOPATH=<Goのインストールディレクトリ>
 export PATH=/<Goのインストールディレクトリ>/bin:$PATH


最新のconmonが必要な場合

最新バージョンのconmonがシステムにインストールされていることが期待される。
conmonは、OCIランタイムをモニタリングするために使用される。

conmonのビルドに必要なライブラリをインストールする。

# SUSE
sudo zypper install meson ninja glib2-devel libseccomp-devel


conmonのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf conmon-<バージョン>.tar.gz
cd conmon-<バージョン>


または、git cloneコマンドを実行して、ソースコードをダウンロードする。

git clone https://github.com/containers/conmon
cd conmon


conmonをビルドおよびインストールする。

meson --prefix=<Podmanのインストールディレクトリ> ./build
ninja -C ./build
ninja -C ./build install


conmonファイルは/<Podmanのインストールディレクトリ>/liexec/podmanディレクトリにインストールされるため、binディレクトリへのシンボリックリンクを作成する。

ln -s /<Podmanのインストールディレクトリ>/liexec/podman/conmon /<Podmanのインストールディレクトリ>/bin/conmon


最新のcrun /runcが必要な場合

最新バージョンのcrun /runcがシステムにインストールされていることが期待される。
crun /runcは、Podmanによりその1つがデフォルトのランタイムとしてピックアップされる。(crunはruncよりも優先される)

crun /runcのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf runc-<バージョン>.tar.gz
cd runc-<バージョン>


または、git cloneコマンドを実行して、ソースコードをダウンロードする。

git clone https://github.com/opencontainers/runc.git
cd runc


crun /runcをビルドおよびインストールする。

# SELinux, SECcompを有効にする場合
make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) 

# SELinux, SECcompを無効にする場合
make BUILDTAGS="" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) 

make PREFIX=<Podmanのインストールディレクトリ> install


CNIネットワークの設定

※注意
CNIバックエンドは非推奨であり、Podman 5.0以降ではNetavarkが優先されるため、CNIネットワークは削除される予定である。

CNIネットワーキングの基本的な設定は、Podmanのビルド時で行われており、Podmanを使用するために他の設定は必要ない。

追加の設定を行う場合は、CNIネットワークの設定ファイルをダウンロードして、/etc/containersディレクトリに配置する。

sudo mkdir -p /etc/containers

sudo curl -L -o /etc/containers/registries.conf https://src.fedoraproject.org/rpms/containers-common/raw/main/f/registries.conf
sudo curl -L -o /etc/containers/policy.json https://src.fedoraproject.org/rpms/containers-common/raw/main/f/default-policy.json


CNIネットワークの設定の詳細は、PodmanのGithubに記載されている。

ユーザネームスペースの有効化

Linuxカーネルがユーザネームスペースをサポートしているかどうかを確認する。

zgrep CONFIG_USER_NS /proc/config.gz

# 出力例: ユーザネームスペースをサポートしている場合
CONFIG_USER_NS=y


もし、ユーザネームスペースが無効の場合は有効にする。

# ユーザネームスペースを一時的に有効にする
sudo sysctl kernel.unprivileged_userns_clone=1

# ユーザネームスペースを恒久的に有効にする
echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/userns.conf


Podmanのビルド

Podmanのビルドに必要なライブラリをインストールする。

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

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

# SUSE
sudo zypper install pkg-config libseccomp-devel libgpgme-devel libbtrfs-devel device-mapper-devel systemd-devel libapparmor-devel protobuf-devel

# Raspberry Pi / Mobian
sudo apt install btrfs-progs git uidmap pkg-config crun 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 libapparmor-dev \
                 netavark  # 古いバージョンのRaspbian OSの場合、netavarkパッケージが利用できない場合がある
                           # その場合、containernetworking-pluginsパッケージをインストールする


PodmanのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf podman-<バージョン>.tar.gz
cd podman-<バージョン>


または、git cloneコマンドを実行して、Podmanのソースコードをダウンロードすることもできる。

git clone git clone https://github.com/containers/podman/
cd podman


Podmanをビルドおよびインストールする。

# SELinux, SECcomp (syscall filtering) を有効にする場合
make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc)

# AppArmor, SECcomp (syscall filtering) を有効にする場合
make BUILDTAGS="apparmor seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc)

# SELinux, SECcomp (syscall filtering) を無効にする場合
make BUILDTAGS="" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc)

make install PREFIX=<Podmanのインストールディレクトリ>


~/.profileファイル等に、環境変数PATHおよびソケットの設定を記述する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="<Podmanのインストールディレクトリ>:$PATH"
 
 export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock


SUSEにおいて、パッケージ管理システムにgvproxyパッケージが存在しないため、手動でgvproxyをインストールする必要がある。

まず、gvproxyのGithubにアクセスして、gvproxyをダウンロードする。
ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。

mv gvproxy-linux-<アーキテクチャ名> gvproxy
chmod u+x gvproxy

sudo mkdir -p /usr/libexec/podman  または  sudo mkdir -p /usr/local/libexec/podman
sudo mv gvproxy /usr/libexec/podman  または  sudo mv gvproxy /usr/local/libexec/podman



Podmanの設定

Dockerから移行する場合

DockerからPodman Desktopに透過的に移行するため、環境変数DOCKER_HOSTを使用することができる。

  • 使い慣れたDockerコマンドを使い続けることが可能である。
  • Podmanの利点を活用できる。
  • GradleやTestcontainers等のツールは、再設定なしでPodmanと通信することができる。


Podmanソケットファイルの場所を確認する。

podman info --format '{{.Host.RemoteSocket.Path}}'


Podmanソケットの場所を設定するため、~/.profileファイル等に環境変数DOCKER_HOSTに記述する。

vi ~/.profile


 # ~/.profileファイル
 
 export DOCKER_HOST="unix://<Podmanソケットファイルのパス>"


Linux仮想マシンの初期化

コンテナが実行される新しいLinux仮想マシンを初期化する。
VMにアクセスするためのSSHキーが自動的に生成されて、VM内のスーパーユーザアカウントとユーザアカウントへのシステム接続が追加される。

podman machine init


デフォルトでは、VMのディストリビューションはカスタムFedoraイメージに基づくWSLを除き、Fedora CoreOSである。
一般的なFedora CoreOSのアップグレードは14日ごとに行われるが、自動アップデートのZincataはPodmanマシンでは無効になっている。

Linux仮想マシンを開始する。

podman machine start


Podmanマシンの接続の設定

各Podmanマシンは2つのデフォルト接続を公開する。
Podmanのデフォルト接続は1つのみ選択することができる。

  • ルートレス
  • ルートフル


Podman DesktopやKind等の他のツールはデフォルト接続に接続する。
もし、別のPodmanマシンの作成等により、デフォルトのPodmanマシン接続が変更された可能性があるイベントが発生した場合、デフォルト接続の確認と設定を検討すること。

まず、Podmanマシンの接続を確認する。

podman system connection ls


次に、Podmanマシンのデフォルト接続を任意の接続に設定する。

podman system connection default podman-machine-default
# または
podman system connection default podman-machine-default-root


Podmanマシンのデフォルト接続が変更されているかどうかを確認する。

podman system connection ls


デフォルト接続を持つPodmanマシンを再起動する。

podman machine stop
podman machine start


Podman DesktopとPodmanの接続を更新する。

Podman Desktopのメイン画面右下にある[電球]アイコンを選択して[トラブルシューティング]ページを開き、[プロバイダーを再接続]ボタンを押下する。


Podmanの動作確認

Podmanの動作を確認するため、テストイメージをダウンロードして実行する。

 podman run hello-world



Podman Desktop

Podman Desktopのインストール

Podman Desktopの公式Webサイト、または、Githubにアクセスして、Podman Desktopをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf podman-desktop-<バージョン>.tar.gz
mv podman-desktop-<バージョン> Podman-Desktop


必要ならば、任意のインストールディレクトリに配置する。

mv Podman-Desktop <任意のインストールディレクトリ>


Podman Desktopのデスクトップエントリファイルを作成する。

vi ~/.local/share/applications/Podman-Desktop.desktop


 # ~/.local/share/applications/Podman-Desktop.desktopファイル
 
 [Desktop Entry]
 Type=Application
 Name=Podman Desktop
 Exec=/<Podman Desktopのインストールディレクトリ>/podman-desktop %F
 Icon=io.podman_desktop.PodmanDesktop
 Categories=Development;
 StartupWMClass=Podman Desktop
 Terminal=false


Docker Hubの使用

Docker Hubにログインする。

podman login -u <Docker Hubのユーザ名> -v https://docker.io
podman login -u <Docker Hubのユーザ名> -v https://index.docker.io/v2/


Podman Desktopを再起動する。

認証情報は、/run/user/$UID/containers/auth.jsonファイルに保存される。


ルートレスモード

ルートレスモードとは

Podmanはsetuidパッケージが不要であり、一般ユーザとしてコンテナを実行することができる。
ルートレスモードで実行する場合、Podmanコンテナはユーザネームスペースを使用して、コンテナ内のrootをPodmanを実行しているユーザに設定する。

ルートレスモードのPodmanは、コンテナを実行しているユーザには無い特権は持たず、ロックダウンされたコンテナを実行する。

これらの制限の一部は (例えば、--privilegedオプションを付加して) 解除できるが、ルートレスコンテナが起動したユーザ以上の権限を持つことはない。
一般ユーザとしてPodmanを実行する時、ホストから/etc/passwdにマウントした場合でも、一般ユーザには権限が無いため変更することはできない。

PodmanとDockerの違い

DockerとPodmanの違いの1つは、コンテナの扱い方である。
Dockerは、コンテナを実行するためにスーパーユーザ権限を必要とする。
Podmanは、スーパーユーザ権限無しでコンテナを実行することができる。

例えば、ルートレスモードのPodmanでは、ポート番号が1024番未満のポートでコンテナを起動することはできないため、1024番以上のポートを使用する必要がある。

もし、1024番未満のポートでコンテナを作成する必要がある場合は、ルートレスモードを解除してスーパーユーザ権限で実行する。

podman machine set --rootful


ルートレスモードに戻す場合は、以下に示すコマンドを実行する。

podman machine set --rootful=false