「インストール - Podman」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
349行目: 349行目:
<br>
<br>
# コンテナを新しいメージとして作成する。
# コンテナを新しいメージとして作成する。
#: <code>podman commit <コンテナID> <任意のイメージ名>
#: <code>podman commit <コンテナID> <任意のイメージ名></code>
# 作成したイメージをファイルとして保存する。
# 作成したイメージをファイルとして保存する。
#: <code>podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar</code>
#: <code>podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar</code>
<br>
<br>
==== バックアップしたコンテナの復元 ====
==== バックアップしたコンテナの復元 ====
  podman load -i <バックアップしたファイル名>.tar
  podman load -i <バックアップしたファイル名>.tar

2024年2月4日 (日) 06:47時点における版

概要

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

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

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

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

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


Podmanのソケットアクティベーション

ソケットアクティベーションは、systemdがソケット (TCP、UDP、Unixソケット等) を作成することで機能する。

クライアントがソケットに接続する時、systemdはソケット用に設定されたsystemdサービスを起動する。
新しく起動されたプログラムは、ソケットのファイルディスクリプタを継承して、着信した接続を受け付けることができる。 (システムコールのaccept()を実行する)

これにより、デフォルトのsystemdソケット設定であるAccept=noに対応し、サービスがソケットを受け付けるようになる。

Podmanは、2種類のソケットアクティベーションをサポートしている。

  • APIサービスのソケットアクティベーション
  • コンテナのソケット起動



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コマンド

Podmanイメージの検索

Docker Hubからイメージを検索およびダウンロードする。

podman search <イメージ名>


Podmanイメージのダウンロード

podman pull <イメージ名>

# 例: Ubuntuの公式イメージをダウンロード
podman pull ubuntu

# 例: Docker HubからApache2のイメージをダウンロード
podman pull docker.io/httpd:latest


ダウンロードしたPodmanイメージの一覧の表示

podman images


Podmanイメージの削除

podman rmi <イメージID>


コンテナの起動

podman run --name <コンテナ名> -d <イメージ名>

# 例: イメージ名はubuntu、コンテナ名はubuntu01として起動
podman run --name ubuntu01 -itd ubuntu /bin/bash

# 例: イメージ名はhttpd、コンテナ名はwwwとして起動
#     また、コンテナ内の80番ポートをホスト側の8080番にポートフォワーディングしている
podman run --name www -p 8080:80 -d httpd


コンテナのプロセス確認

# 動作中のコンテナのみ表示
podman ps

# 全てのコンテナを表示
podman ps -a  または podman ps --all


コンテナの停止

コンテナが停止している時は、STATUSでExitedとなる。

podman stop <コンテナ名>  または  podman stop <コンテナID>


コンテナとホスト間のファイルコピー

ホストからコンテナにファイルをコピーする。

podman cp <ホストのファイルパス> <コンテナ名:コンテナ内の保存先>

# 例:
podman cp sample.txt my_suse:/tmp  # コンテナを実行
podman exec -it my_suse /bin/bash  # cd /tmp && lsコマンドを実行してファイルを確認


コンテナからホストにファイルをコピーする。

podman cp <コンテナ名:コンテナ内のファイルパス> <ホストの保存先>

# 例:
podman cp my_suse:/tmp/sample.txt ~/Downloads


コンテナのバックアップ

コンテナをイメージ化してバックアップする。

  1. コンテナを新しいメージとして作成する。
    podman commit <コンテナID> <任意のイメージ名>
  2. 作成したイメージをファイルとして保存する。
    podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar


バックアップしたコンテナの復元

podman load -i <バックアップしたファイル名>.tar


正常に復元されているかどうかを確認する。

podman images



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


しかし、Dockerには、コンテナを作成および管理するためDocker Composeが存在する。
幸運なことに、PodmanはDocker CLIをエミュレートできるため、Docker Composeと連携することができる。