MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
インストール - Podmanのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
インストール - Podman
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == コンテナとは、ソフトウェアプロセスやマイクロサービスをパッケージ化して、あらゆるコンピューティング環境で実行可能にするソフトウェアソリューションである。<br> <br> コンテナに含まれるファイルには、アプリケーションコード、環境変数、設定コード、バイナリプログラム、ソフトウェアの依存関係、ライブラリ等がある。<br> これらのコンポーネントをバンドルするプロセスはコンテナ化と呼ばれ、最終的な製品はコンテナイメージとして知られている。<br> <br> このイメージは、クラウド、オンプレミスのデータシステム、ローカルシステム等、あらゆるプラットフォームにデプロイされる。<br> <br> Podman (Pod Manage) は、Open Container Initiatives (OCI) のコンテナイメージを開発、管理、本番環境で実行する時に使用するコンテナエンジンである。<br> OCIは、コンテナフォーマットとランタイムに関するOSレベルの仮想化ソフトウェアコンテナのオープンなガバナンス構造を実装するために設計された。<br> <br> Podmanコンテナは、スーパユーザ / 非スーパーユーザのいずれでも実行可能である。<br> <br><br> == Podmanのソケットアクティベーション == ソケットアクティベーションは、systemdがソケット (TCP、UDP、Unixソケット等) を作成することで機能する。<br> <br> クライアントがソケットに接続する時、systemdはソケット用に設定されたsystemdサービスを起動する。<br> 新しく起動されたプログラムは、ソケットのファイルディスクリプタを継承して、着信した接続を受け付けることができる。 (システムコールの<code>accept()</code>を実行する)<br> <br> これにより、デフォルトのsystemdソケット設定である<code>Accept=no</code>に対応し、サービスがソケットを受け付けるようになる。<br> <br> Podmanは、2種類のソケットアクティベーションをサポートしている。<br> * APIサービスのソケットアクティベーション * コンテナのソケット起動 <br><br> == Podmanのインストール == ==== パッケージ管理システムからインストール ==== # RHEL sudo yum install epel-release sudo dnf install podman # SUSE sudo zypper install podman <br> ==== スタティックビルド済みのPodmanの使用 ==== ===== Podmanのダウンロード ===== <u>※注意</u><br> <u>スタティックビルド済みのPodmanを使用する場合は、Podman Desktopが使用できないことに注意する。</u><br> <br> [https://github.com/containers/podman/ PodmanのGithub]にアクセスして、スタティックビルド済みのPodmanをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf podman-remote-static-linux_<アーキテクチャ名>.tar.gz cd bin mv podman-remote-static-linux_<アーキテクチャ名> podman <br> 必要ならば、Podmanを任意のインストールディレクトリに配置する。<br> mkdir -p <任意のインストールディレクトリ> mv podman <任意のインストールディレクトリ> <br> ~/.profileファイル等に、環境変数<code>PATH</code>およびソケットの設定を記述する。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export PATH="<Podmanのインストールディレクトリ>:$PATH" export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock </syntaxhighlight> <br> ===== gvproxyのダウンロード ===== SUSEにおいて、パッケージ管理システムにgvproxyパッケージが存在しないため、手動でgvproxyをインストールする必要がある。<br> <br> まず、[https://github.com/containers/gvisor-tap-vsock/ gvproxyのGithub]にアクセスして、gvproxyをダウンロードする。<br> ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。<br> # ファイル名を変更 mv gvproxy-linux-<アーキテクチャ名> gvproxy # 実行権限を付加 (非スーパーユーザでも実行できるようにする) chmod +x gvproxy # gvproxyを配置するディレクトリを作成 sudo mkdir -p /usr/libexec/podman ## または sudo mkdir -p /usr/local/libexec/podman ## または sudo mkdir -p /usr/local/lib/podman ## または sudo mkdir -p /usr/lib/podman # gvproxyを配置する sudo mv gvproxy /usr/local/libexec/podman <br> ==== ソースコードからインストール ==== ===== Goのバージョンが1.16未満の場合 ===== もし、パッケージ管理システムのGoのバージョンが1.16未満の場合は、[https://golang.org/dl/ Goの公式Webサイト]にアクセスして、Goをダウンロードする。<br> ダウンロードしたファイルを解凍する。</u><br> tar xf go<バージョン>.linux-<アーキテクチャ名>.tar.gz mv go<バージョン>.linux-<アーキテクチャ名> Go <br> 必要ならば、Goを任意のインストールディクトリに配置する。<br> mv Go <任意のインストールディレクトリ> <br> ~/.profileファイル等に、環境変数<code>PATH</code>を追記する。<br> <syntaxhighlight lang="sh"> export GOPATH=<Goのインストールディレクトリ> export PATH=/<Goのインストールディレクトリ>/bin:$PATH </syntaxhighlight> <br> ===== 最新のconmonが必要な場合 ===== 最新バージョンのconmonがシステムにインストールされていることが期待される。<br> conmonは、OCIランタイムをモニタリングするために使用される。<br> <br> conmonのビルドに必要なライブラリをインストールする。<br> # RHEL sudo dnf install meson ninja glib2-devel glibc-devel libseccomp-devel # SUSE sudo zypper install meson ninja glib2-devel glibc-devel libseccomp-devel <br> [https://github.com/containers/conmon conmonのGithub]にアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf conmon-<バージョン>.tar.gz cd conmon-<バージョン> <br> または、<code>git clone</code>コマンドを実行して、ソースコードをダウンロードする。<br> git clone https://github.com/containers/conmon cd conmon <br> conmonをビルドおよびインストールする。<br> meson --prefix=<Podmanのインストールディレクトリ> ./build ninja -C ./build ninja -C ./build install <br> conmonファイルは/<Podmanのインストールディレクトリ>/liexec/podmanディレクトリにインストールされるため、binディレクトリへのシンボリックリンクを作成する。<br> ln -s /<Podmanのインストールディレクトリ>/liexec/podman/conmon /<Podmanのインストールディレクトリ>/bin/conmon <br> ===== 最新のcrun /runcが必要な場合 ===== 最新バージョンのcrun /runcがシステムにインストールされていることが期待される。<br> crun /runcは、Podmanによりその1つがデフォルトのランタイムとしてピックアップされる。(crunはruncよりも優先される)<br> <br> crun / runcのビルドに必要なライブラリをインストールする。<br> # SUSE sudo zypper install libseccomp-devel libapparmor-devel libselinux-devel <br> [https://github.com/opencontainers/runc/ crun /runcのGithub]にアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf runc-<バージョン>.tar.gz cd runc-<バージョン> <br> または、<code>git clone</code>コマンドを実行して、ソースコードをダウンロードする。<br> git clone https://github.com/opencontainers/runc.git cd runc <br> crun /runcをビルドおよびインストールする。<br> # AppArmor, SECcompを有効にする場合 make BUILDTAGS="apparmor seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) # SELinux, SECcompを有効にする場合 make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) # SELinux, SECcompを無効にする場合 make BUILDTAGS="" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) make PREFIX=<Podmanのインストールディレクトリ> install <br> ===== slirp4netnsのインストール ===== slirp4netnsは、コンテナのネットワーク機能を提供するために使用されるライブラリである。<br> <br> Podmanがルートレス環境でコンテナのネットワーク機能を提供するために重要な役割を果たしている。<br> これにより、ユーザはroot権限を必要とせずにコンテナを実行して、ネットワークを利用できるようになる。<br> また、各コンテナが独立したネットワーク環境を持つことにより、セキュリティと分離性が向上する。<br> <br> 主な役割を以下に示す。<br> * ユーザ空間ネットワーキング *: slirp4netnsは、カーネル空間ではなくユーザ空間でネットワーキングを実現する。 *: これにより、ルートレス環境でもコンテナがネットワーク機能を利用できるようになる。 *: <br> * ネットワーク名前空間の分離 *: 各コンテナに独立したネットワーク名前空間を提供して、ホストから分離されたネットワーク環境を実現する。 *: <br> * ネットワークアドレス変換 (NAT) *: コンテナ内部のIPアドレスをホストのIPアドレスに変換することで、外部ネットワークとの通信を可能にする。 *: <br> * ポートフォワーディング *: コンテナ内部のポートをホストのポートに転送して、外部からコンテナが公開するサービスにアクセスできるようにする。 *: <br> * DNS解決 *: コンテナ内部からDNSを利用してホスト名の解決ができるようにする。 <br> slirp4netnsのビルドに必要なライブラリをインストールする。<br> # RHEL sudo dnf install glib2-devel libslirp-devel libcap-devel libseccomp-devel # SUSE sudo zypper install glib2-devel libslirp-devel libcap-devel libseccomp-devel <br> [https://github.com/rootless-containers/slirp4netns slirp4netns]のGithubにアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf slirp4netns-<バージョン>.tar.gz cd slirp4netns-<バージョン> <br> slirp4netnsをビルドおよびインストールする。<br> ./autogen.sh mkdir build && cd build ../configure --prefix=<Podmanのインストールディレクトリ> make -j $(nproc) make install <br> ===== CNIネットワークの設定 ===== <u>※注意</u><br> <u>CNIバックエンドは非推奨であり、Podman 5.0以降ではNetavarkが優先されるため、CNIネットワークは削除される予定である。</u><br> <br> CNIネットワーキングの基本的な設定は、Podmanのビルド時で行われており、Podmanを使用するために他の設定は必要ない。<br> <br> 追加の設定を行う場合は、CNIネットワークの設定ファイルをダウンロードして、/etc/containersディレクトリに配置する。<br> 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 <br> CNIネットワークの設定の詳細は、[https://github.com/containers/podman/blob/main/cni/README.md PodmanのGithub]に記載されている。<br> <br> ===== ユーザネームスペースの有効化 ===== Linuxカーネルがユーザネームスペースをサポートしているかどうかを確認する。<br> zgrep CONFIG_USER_NS /proc/config.gz # 出力例: ユーザネームスペースをサポートしている場合 CONFIG_USER_NS=y <br> もし、ユーザネームスペースが無効の場合は有効にする。<br> # ユーザネームスペースを一時的に有効にする sudo sysctl kernel.unprivileged_userns_clone=1 # ユーザネームスペースを恒久的に有効にする echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/userns.conf <br> ===== Podmanのビルド ===== Podmanのビルドに必要なライブラリをインストールする。<br> # 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パッケージをインストールする <br> [https://github.com/containers/podman/ PodmanのGithub]にアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf podman-<バージョン>.tar.gz cd podman-<バージョン> <br> または、<code>git clone</code>コマンドを実行して、Podmanのソースコードをダウンロードすることもできる。<br> git clone https://github.com/containers/podman/ cd podman <br> Podmanをビルドおよびインストールする。<br> # 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のインストールディレクトリ> <br> ~/.profileファイル等に、環境変数<code>PATH</code>およびPodmanソケットの設定を記述する。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export PATH="/<Podmanのインストールディレクトリ>/bin:$PATH" export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock </syntaxhighlight> <br> ===== 最新のnetavarkが必要な場合 ===== 最新バージョンのnetavarkをインストールする場合、ソースコードからインストールする。<br> <br> netavarkはコンテナ用のRustベースのコンテナネットワークスタックである。<br> Podmanで動作するように設計されているが、他のOCIコンテナ管理アプリケーションにも適用できる。<br> <br> netavarkのビルドに必要なライブラリをインストールする。<br> # SUSE sudo zypper install rust cargo protobuf-devel go-md2man <br> [https://github.com/containers/netavark netavark]のGithubにアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf netavark-<バージョン>.tar.gz cd netavark-<バージョン> <br> netavarkをビルドおよびインストールする。<br> make PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) make PREFIX=<Podmanのインストールディレクトリ> install <br> ==== エラー関連 ==== ===== Seccompエラー ===== Podmanイメージのビルド時において、以下に示すようなエラーが出力される場合がある。<br> Error: loading seccomp profile () failed: seccomp not enabled in this build <br> Podmanイメージでは、Seccompを無効にしている場合はコンテナを作成できないイメージが存在する。<br> この時、runc / crunおよびPodmanのビルド時において、<code>BUILDTAGS</code>オプションに<code>seccomp</code>を指定する必要がある。<br> <br><br> == gvproxy == ==== gvproxyとは ==== gvproxyは、libslirpおよびVPNKitを置き換えるものであり、Golangで記述されている。<br> gVisorのネットワークスタックをベースにしている。<br> <br> libslirpと比較して、gvisor-tap-vsockは設定可能なDNSサーバと動的なポート転送を提供する。<br> <br> また、QEMU、Hyperkit、Hyper-V、User Mode Linuxで使用することができる。<br> <br> <u>※注意 1</u><br> <u>SUSEにおいて、パッケージ管理システムにgvproxyパッケージが存在しないため、手動でgvproxyをインストールする必要がある。</u><br> <br> <u>※注意 2</u><br> <u><code>podman machine start</code>コマンドを実行して仮想マシンを起動する時、gvproxyが無いためホストネットワークを起動できない場合がある。</u><br> <u>この時、以下に示すセクションを参照して、gvproxyをインストールする必要がある。</u><br> <br> ==== Staticビルド済みのバイナリをインストール ==== まず、[https://github.com/containers/gvisor-tap-vsock/ gvproxyのGithub]にアクセスして、gvproxyをダウンロードする。<br> ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。<br> # ファイル名を変更 mv gvproxy-linux-<アーキテクチャ名> gvproxy # 実行権限を付加 (非スーパーユーザでも実行できるようにする) chmod +x gvproxy # gvproxyを配置するディレクトリを作成 sudo mkdir -p /usr/libexec/podman ## または sudo mkdir -p /usr/local/libexec/podman ## または sudo mkdir -p /usr/local/lib/podman ## または sudo mkdir -p /usr/lib/podman # gvproxyを配置する sudo mv gvproxy /usr/local/libexec/podman <br> ==== ソースコードからインストール ==== gvproxyのビルドに必要なライブラリをインストールする。<br> # SUSE sudo zypper install rust cargo protobuf-devel go-md2man <br> [https://github.com/containers/gvisor-tap-vsock.git gvproxyのGithub]にアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf gvisor-tap-vsock-<バージョン>.tar.gz cd gvisor-tap-vsock-<バージョン> <br> gvproxyをビルドする。<br> make -j $(nproc) <br> binディレクトリに実行バイナリ群が生成される。<br> そのため、それらの実行バイナリ群をPodmanのインストールディレクトリに配置する。<br> cd bin mv ./* /<Podmanのインストールディレクトリ>/bin <br><br> == Podmanの設定 == ==== Dockerから移行する場合 ==== DockerからPodman Desktopに透過的に移行するため、環境変数<code>DOCKER_HOST</code>を使用することができる。<br> * 使い慣れたDockerコマンドを使い続けることが可能である。 * Podmanの利点を活用できる。 * GradleやTestcontainers等のツールは、再設定なしでPodmanと通信することができる。 <br> Podmanソケットファイルの場所を確認する。<br> podman info --format <nowiki>'{{.Host.RemoteSocket.Path}}'</nowiki> <br> Podmanソケットの場所を設定するため、~/.profileファイル等に環境変数<code>DOCKER_HOST</code>に記述する。<br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル export DOCKER_HOST="unix://<Podmanソケットファイルのパス>" </syntaxhighlight> <br> ==== cgroup v1に関する警告 ==== <code>podman</code>コマンドを実行した時、以下に示すような警告が出力される時がある。<br> Using cgroups-v1 which is deprecated in favor of cgroups-v2 with Podman v5 and will be removed in a future version. Set environment variable `PODMAN_IGNORE_CGROUPSV1_WARNING` to hide this warning. <br> この警告は、Podman 5.0以降はcgroups v1の使用が非推奨となり、将来のバージョンでは削除される予定であることを示している。<br> これは、以下に示すような原因がある。<br> * システムがcgroups-v1を使用している場合。 *: 現在のシステムがcgroups-v1を使用しており、Podmanもそれを検出して使用している。 *: しかし、Podman v5以降ではcgroups-v2の使用が推奨されている。 * Podmanのバージョン *: 使用しているPodmanのバージョンが5.0以降であるため、この警告メッセージが表示されている。 <br> この警告は、将来的にcgroups v1のサポートが終了することを事前に知らせるためのものである。<br> 現時点ではcgroups v1を使用していても問題ないが、将来のバージョンではcgroups v2に移行する必要がある。<br> <br> 警告を非表示にするには、~/.profileファイル等に環境変数<code>PODMAN_IGNORE_CGROUPSV1_WARNING</code>を<code>1</code>、または、<code>true</code>、または、<code>yes</code>に設定する。<br> ただし、これは警告を非表示にするだけで、根本的な問題は解決しない。<br> <br> vi ~/.profile <br> <syntaxhighlight lang="sh"> # ~/.profileファイル # 上記の警告を非表示にする export PODMAN_IGNORE_CGROUPSV1_WARNING=1 # Podmanの設定ファイルのパスを指定 export CONTAINERS_CONF="$HOME/.config/containers/containers.conf" </syntaxhighlight> <br> 長期的には、システムをcgroups v2に移行することを検討する。<br> cgroups v2は、より効率的でシンプルなリソース管理機能を提供している。<br> 移行には、カーネルのアップグレード、または、関連するツールやライブラリの対応が必要となる場合がある。<br> <br> SUSEのcgroupのデフォルトモードはハイブリッドモードである。<br> ハイブリッドモードは、それを必要とするアプリケーションに後方互換性を提供する。<br> <br> 以下に示す機能はunified v2階層でのみ使用可能である。<br> * メモリコントローラ *: 再生保護(別名 memory.low)、memory.high、PSI(圧力ストール情報) * I/Oコントローラ *: ライトバック制御、新しい制御ポリシー * 非特権ユーザへのコントローラ委譲 (ルートレスコンテナ) * systemd のフリーザサポート * 単一階層の取り扱いがよりシンプルになる。 <br> cgroupは、1つのモードしか設定できない。<br> <br> 現在のPCにおいて、cgroups v2が有効になっているかどうかを確認する。<br> sudo mount | grep cgroup2 # cgroups v2が有効になっている場合 # 出力にcgroup v2のエントリが含まれている場合は、cgroups v2が有効になっている # 出力例: cgroups v2が有効になっている場合 cgroup2 on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate) <br> vi ~/.config/containers/containers.conf # または sudo vi /etc/containers/containers.conf <br> <syntaxhighlight lang="ini"> [engine] cgroup_manager = "systemd" cgroups = "v2" </syntaxhighlight> <br> もし、上記の手順で解決しない場合は、GRUB2のブートオプションに設定を追加する。<br> 統一制御グループ階層を有効にする場合は、GRUB2ブートローダのカーネルコマンドラインパラメータとして追加する。<br> sudo vi /etc/default/grub <br> # /etc/default/grubファイル GRUB_CMDLINE_LINUX_DEFAULT="〜 systemd.unified_cgroup_hierarchy=1 〜" <br> GRUB2を更新する。<br> sudo grub2-mkconfig -o /boot/grub2/grub.cfg <br> Linuxを再起動する。<br> sudo shutdown -r now <br> ==== Linux仮想マシンの作成と開始 ==== ===== Linux仮想マシンの初期化 ===== コンテナが実行される新しいLinux仮想マシンを初期化する。<br> VMにアクセスするためのSSHキーが自動的に生成されて、VM内のスーパーユーザアカウントとユーザアカウントへのシステム接続が追加される。<br> podman machine init <br> デフォルトでは、VMのディストリビューションはカスタムFedoraイメージに基づくWSLを除き、Fedora CoreOSである。<br> 一般的なFedora CoreOSのアップグレードは14日ごとに行われるが、自動アップデートのZincataはPodmanマシンでは無効になっている。<br> <br> ===== Linux仮想マシンの編集 ===== <u>Podmanをソースコードから任意のディレクトリにインストールした場合、</u><br> ~/.config/containers/containers.confファイル内の<code>[engine]</code>セクションの直下に<code>helper_binaries_dir</code>キーを追加して、ヘルパーバイナリのあるディレクトリを設定する。<br> vi ~/.config/containers/containers.conf <br> <syntaxhighlight lang="ini"> # ~/.config/containers/containers.confファイル [engine] helper_binaries_dir = ["/<Podmanのインストールディレクトリ>/bin", "/<Podmanのインストールディレクトリ>/libexec/podman", "/usr/local/libexec/podman", "/usr/local/lib/podman", "/usr/libexec/podman", "/usr/lib/podman"] </syntaxhighlight> <br> ===== Linux仮想マシンの開始 ===== Linux仮想マシンを開始する。<br> podman machine start <br> 開始後、Docker APIに関するメッセージが表示される。<br> これは、Docker APIフォワーディングがリッスンしているため、環境変数<code>DOCKER_HOST</code>を設定することにより、Docker APIクライアントに接続することができることを表す。<br> API forwarding listening on: /home/user-name/.local/share/containers/podman/machine/qemu/podman.sock You can connect Docker API clients by setting DOCKER_HOST using the following command in your terminal session: export DOCKER_HOST='unix:///home/user-name/.local/share/containers/podman/machine/qemu/podman.sock' <br> ==== Podmanマシンの接続の設定 ==== 各Podmanマシンは2つのデフォルト接続を公開する。<br> Podmanのデフォルト接続は1つのみ選択することができる。<br> * ルートレス * ルートフル <br> Podman DesktopやKind等の他のツールはデフォルト接続に接続する。<br> もし、別のPodmanマシンの作成等により、デフォルトのPodmanマシン接続が変更された可能性があるイベントが発生した場合、デフォルト接続の確認と設定を検討すること。<br> <br> まず、Podmanマシンの接続を確認する。<br> podman system connection ls <br> 次に、Podmanマシンのデフォルト接続を任意の接続に設定する。<br> podman system connection default podman-machine-default # または podman system connection default podman-machine-default-root <br> Podmanマシンのデフォルト接続が変更されているかどうかを確認する。<br> podman system connection ls <br> デフォルト接続を持つPodmanマシンを再起動する。<br> podman machine stop podman machine start <br> Podman DesktopとPodmanの接続を更新する。<br> <br> Podman Desktopのメイン画面右下にある[電球]アイコンを選択して[トラブルシューティング]ページを開き、[プロバイダーを再接続]ボタンを押下する。<br> <br><br> == Podmanの動作確認 == Podmanの動作を確認するため、テストイメージをダウンロードして実行する。<br> podman run hello-world <br><br> == Podmanコマンド == ==== ログイン ==== podman loguin -u <ユーザ名> -v <登録するURL> # 例: Docker Hubにログインする場合 podman login -u <Docker Hubのユーザ名> -v https://docker.io podman login -u <Docker Hubのユーザ名> -v https://index.docker.io/v2/ <br> 認証情報は、/run/user/$UID/containers/auth.jsonファイルに保存される。<br> <br> Docker Hubにログインすることにより、Podmanコマンドで[https://hub.docker.com Docker Hub]からイメージを検索およびダウンロードすることができる。<br> <br> ==== イメージの検索 ==== [https://quay.io/search Quay] (デフォルト) および他のWebサイト (登録している場合) からイメージを検索およびダウンロードする。<br> podman search <イメージ名> <br> ==== イメージのダウンロード ==== podman pull <イメージ名> # 例: Ubuntuの公式イメージをダウンロード podman pull ubuntu # 例: Docker HubからApache2のイメージをダウンロード podman pull docker.io/httpd:latest <br> ==== ダウンロードしたイメージの一覧の表示 ==== podman images <br> ==== イメージの削除 ==== podman image rm <イメージID> <br> Podmanイメージを全て削除する。<br> podman image rm -f $(podman images -q) <br> ==== コンテナの削除 ==== podman container rm <コンテナID> <br> Podmanコンテナを全て削除する。<br> podman container rm -f $(podman container ps -a -q) <br> ==== コンテナの作成 ==== * <code>-t</code> または <code>--tty</code> *: コンテナに擬似TTYを割り当てる。 * <code>-d</code> または <code>--detach</code> *: コンテナをバックグラウンドで実行して、コンテナIDを表示する。 <br> # コンテナを作成して、フォアグラウンドで起動 podman run --name <コンテナ名> <イメージ名> # <code>-d</code>オプションを付加して、コンテナをバックグラウンドで起動 # <code>-t</code>オプションを付加して、コンテナに擬似ttyを割り当てる podman run -dt --name <コンテナ名> <イメージ名> # 例: イメージ名はopensuse、コンテナ名はsuse01として起動 podman run --name suse01 -itd opensuse /bin/bash # 例: イメージ名はhttpd、コンテナ名はwwwとして起動 # また、コンテナ内の80番ポートをホスト側の8080番にポートフォワーディングしている podman run -dt -p 8080:80 --name www httpd <br> ==== コンテナのプロセス確認 ==== # 動作中のコンテナのみ表示 podman ps # 全てのコンテナを表示 podman ps -a または podman ps --all <br> ==== コンテナの起動 ==== podman start <コンテナ名> または podman start <コンテナID> <br> 停止中のコンテナをインタラクティブに実行することもできる。<br> * <code>-a</code>オプション *: コンテナにアタッチすることを指定する。 *: これにより、コンテナの標準入力、標準出力、標準エラー出力がホストのターミナルに接続される。 * <code>-i</code>オプション *: インタラクティブモードを有効にする。 *: これにより、コンテナの標準入力に対してコマンドを入力できる。 <br> podman start -ai <コンテナ名> または podman start -ai <コンテナID> <br> ==== コンテナの再起動 ==== podman restart <コンテナ名> または podman restart <コンテナID> <br> ==== コンテナの停止 ==== コンテナが停止している時は、STATUSでExitedとなる。<br> podman stop <コンテナ名> または podman stop <コンテナID> <br> ==== コンテナのログ確認 ==== 例えば、コンテナが起動せずに失敗する (exited) する場合、ログを確認する。<br> podman logs <コンテナID> <br> ==== コンテナに名前を付ける ==== podman commit <コンテナID> <任意のコンテナ名> <br> ==== コマンドの実行 ==== 起動中のコンテナにコマンドを実行する。<br> podman exec -it <コンテナ名> /bin/bash <br> ==== コンテナとホスト間のファイルコピー ==== ホストからコンテナにファイルをコピーする。<br> podman cp <ホストのファイルパス> <コンテナ名>:<コンテナ内の保存先のパス> # または podman cp <ホストのファイルパス> <コンテナID>:<コンテナ内の保存先のパス> # 例: podman cp sample.txt my_suse:/tmp # コンテナを実行 podman exec -it my_suse /bin/bash # cd /tmp && lsコマンドを実行してファイルを確認 <br> コンテナからホストにファイルをコピーする。<br> podman cp <コンテナ名>:<コンテナ内のファイルパス> <ホストの保存先のパス> # または podman cp <コンテナID>:<コンテナ内のファイルパス> <ホストの保存先のパス> # 例: podman cp my_suse:/tmp/sample.txt ~/Downloads <br> ==== ボリュームのマウント ==== コンテナにボリュームをマウントする。<br> <br> <code>-v</code>オプションの代わりに<code>--mount</code>オプションを付加することが推奨されている。<br> <code>--mount</code>オプションは、キーバリュー形式で各要素が指定できる。<br> podman container run -it --mount type=<volume, bind, tmpfsのいずれかを指定>,src=<ボリューム名>,dst=<コンテナ内のパス> <コンテナ名/イメージ名:タグ名> <br> <code>--rm</code>オプションを付加することにより、匿名ボリュームの場合はコンテナ停止と同時にボリュームも破棄される。<br> 名前付きボリュームの場合は、<code>--rm</code>オプションを付加しても、ボリュームは破棄されない。<br> <br> <center> {| class="wikitable" | style="background-color:#fefefe;" |+ mountオプションについて |- ! style="background-color:#66CCFF;" | mountオプションで指定できる種類 ! style="background-color:#66CCFF;" | 説明 |- | style="text-align: center;" | type || <code>volume</code>、<code>bind</code>、<code>tmpfs</code>を指定する。 |- | style="text-align: center;" | src || <code>source</code>と記述することもできる。<br><br>匿名ボリュームの場合は、省略する。<br>名前付きボリュームの場合は、その名前を記述する。<br>バインドマウントの場合は、ホスト側のディレクトリを指定する。 |- | style="text-align: center;" | dst || <code>destination</code>、<code>target</code>と記述することもできる。<br><br>コンテナ側のディレクトリを指定する。 |} </center> <br> * 匿名ボリューム *: ホスト側に/var/lib/podman/volumesディレクトリ内に領域が確保されて、指定したコンテナ内のディレクトリと共有される。 *: 識別のためにハッシュ値が振られており、同一のネットワークからそのハッシュ値でアクセスすることができる。 *: <code>podman container run --mount type=volume,dst=<コンテナ内のディレクトリパス 例: /tmp/sample> <コンテナ名/イメージ名:タグ名></code> *: <br> * 名前付きボリューム *: 匿名ボリュームと同様、ホスト側には/var/lib/podman/volumesディレクトリ内に領域が確保されて、指定したコンテナ内のディレクトリと共有される。 *: ホスト名を指定するため、同一のネットワークからそのホスト名でアクセスすることができる。 *: <code>podman container run --mount type=volume,src=<ボリューム名>,dst=<ホスト名>:<コンテナ内のディレクトリパス 例: /tmp/sample> <コンテナ名/イメージ名:タグ名></code> *: <br> * バインドマウント *: <u>ホスト側のカレントディレクトリ内</u>にある指定したディレクトリとコンテナ側の指定したディレクトリが共有される。 *: <code>podman container run --mount type=bind,src=<ホスト側のディレクトリパス 例: $PWD/host-sample>,dst=<コンテナ内のディレクトリパス 例: /tmp/container-sample> <コンテナ名/イメージ名:タグ名></code> <br> ホスト側がSELinuxを使用している場合は、ボリュームのマウントに<code>:Z</code>オプションを付加する必要がある。<br> これは、Podmanにボリュームのコンテンツをコンテナ内のラベルと一致するようにラベルを変更するよう指示するものである。<br> podman run -d --rm -v /<ホスト側のディレクトリのパス 1>/:/<コンテナ側のディレクトリのパス 1>:Z -v /<ホスト側のディレクトリのパス 2>/:/<コンテナ側のディレクトリのパス 2>:Z <br> ==== ボリュームのアンマウント ==== podman volume umount <ボリューム名> <br> 特定のコンテナにマウントされているボリュームをアンマウントする。<br> podman volume umount <コンテナID> <br> ==== ボリュームの削除 ==== podman volume rm <ボリューム名> <br> 使用されていないボリュームを削除する。<br> podman volume prune <br> ボリュームを全て削除する。<br> podman volume rm $(podman volume ls -q) <br> ==== セキュリティオプション ==== podman run --security-opt <オプション> -d <イメージ名> <br> AppArmorプロファイルの作成手順を、以下に示す。<br> * カスタムAppArmorプロファイルの作成 *: AppArmorプロファイルは、任意のプログラムが必要とする全てのファイルアクセス許可を明示的に許可する必要がある。 * プロファイルの保存と読み込み *: 作成したAppArmorプロファイルをホストPCに保存して、AppArmorに読み込ませる。 *: 一般的に、/etc/apparmor.dディレクトリにプロファイルを配置して、<code>apparmor_parser</code>コマンドでプロファイルを読み込むことで行う。 * Podmanコンテナの起動時にプロファイルを指定する *: コンテナを起動する際に、<code>--security-opt</code>オプションを付加して、カスタムAppArmorプロファイルを指定する。 *: 例: my_php_fpm_profileという名前のプロファイルを適用する場合 *: <code>podman run --security-opt apparmor=<AppArmorプロファイル名> -d <イメージ名></code> <br> ==== コンテナのバックアップ ==== コンテナをイメージ化してバックアップする。<br> <br> # コンテナを新しいメージとして作成する。 #: <code>podman commit <コンテナID> <任意のイメージ名></code> # 作成したイメージをファイルとして保存する。 #: <code>podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar</code> <br> ==== バックアップしたコンテナの復元 ==== podman load -i <バックアップしたファイル名>.tar <br> 正常に復元されているかどうかを確認する。<br> podman images <br> ==== Podmanに関するプロセスを全て終了する ==== <code>pkill</code>コマンドは、Linuxの基本コマンドであり、プロセスの名前や他の属性に基づいてプロセスを終了するために使用する。<br> これにより、<u>podman</u>という名前のプロセス (Podmanが起動しているプロセス) を全て終了することができる。<br> <br> pkill podman <br> 例えば、問題が発生した場合や特定の操作が必要な場合、全てのPodmanプロセスを終了させる手段として使用されることがある。<br> ただし、注意が必要であり、実行中のコンテナが強制的に停止される可能性がある点に留意する必要がある。<br> <br><br> == Podmanのストレージ == コンテナ内で発生したデータは同じコンテナ内のどこかに書き込まれるが、コンテナを破棄すると同時に削除される。<br> コンテナを破棄してもデータは保存する場合、または、他のコンテナで再利用する場合は、コンテナ外にデータ保存領域を作成する機能を提供している。<br> <br> * ボリューム *: Podmanの管理下でストレージ領域を確保する。 *: ルートレスモードのデフォルトでは、~/.local/share/containersディレクトリである。 *: <br> *: 名前付きボリュームと匿名ボリュームがあり、名前付きの場合はホスト内で名前解決できるため簡単にアクセスすることができる。 *: 匿名ボリュームは任意のハッシュ値が振られる。 *: <br> *: 他のプロセスからはアクセスできないため安全に使用できる。 *: <br> * バインドマウント *: ホスト側のディレクトリをコンテナ内のディレクトリと共有する。 *: <br> * tmpfs *: メモリ上に一時的なストレージ領域を確保する。 *: 使用用途としては、機密性の高い情報を一時的にマウントする場合等がある。 <br> <code>-v</code>オプション、<code>VOLUME</code>、<code>volumes</code>で指定する場合に関しても、基本的には上記のいずれかを扱っている。<br> <br><br> == Containerfile == ==== Containerfileとは ==== Containerfileは、コンテナイメージの作成手順を自動化する設定ファイルである。<br> コンテナエンジン (Podman、Buildah、Docker) は、Containerfileから指示を読み取り、イメージの作成に必要なステップを自動化する。<br> イメージを構築を自動化するには、Containerfileというファイルを作成する必要がある。<br> <br> Containerfileには、コンテナを構築するためのベースになる環境、実行するコマンド、配置するファイル等が記述されている。<br> Containerfileには、Containerfileを含むコンテキストディレクトリのパスを引数として、<code>buildah bud</code>、<code>podman build</code>コマンドを呼び出す。<br> PodmanおよびBuildahのデフォルトはContainerfileであり、Dockerfileにフォールバックする。<br> <br> Containerfileは、Dockerfileと同じシンタックスをサポートしている。<br> <br> Containerfileで作成したPodmanイメージを[https://quay.io Quay.io]にアップロードすることも可能である。<br> <br> ==== イメージの構築 ==== podman build -t <任意のリポジトリ名>/<任意のタグ名> . # Containerfileのパスを指定する場合 podman build -t <任意のリポジトリ名>/<任意のタグ名> -f <Containerfileのパス> <br> ==== シンタックス ==== ===== FROM ===== FROM <pullするイメージ名>:<タグ名> # 別名を指定する場合 FROM <pullするイメージ名>:<タグ名> AS <別名> # FROM <pullするイメージ名>@<ダイジェスト名> # 別名を指定する場合 FROM <pullするイメージ名>@<ダイジェスト名> AS <別名> <br> ===== MAINTAINER ===== MAINTAINERは生成されたイメージの作者フィールドを設定する。<br> ユーザにサポートのためのEメールもしくはURLを提供する場合に使用する。<br> MAINTAINER <作者名> <メールアドレス> <br> ===== USER ===== コンテナ内のユーザを指定する。<br> # ユーザをrootにする USER root <br> ===== WORKDIR ===== 作業ディレクトリを追加する。<br> WORKDIR <作業ディレクトリパス> <br> ===== ARG ===== Containerfile内で使用する変数を定義する。 # 変数を定義する場合 ARG <変数名> # 変数を定義して値を代入する場合 ARG <変数名>=<値> <br> ===== ENV ===== 環境変数を定義する。<br> ENV <環境変数名> <値> # または ENV <環境変数名>=<値> <br> ===== ADD ===== イメージにファイルやディレクトリを追加する。<br> # ファイルまたはディレクトリを1つ追加する場合 ADD <ホスト側のファイルまたはディレクトリのパス> <コンテナ側のファイルまたはディレクトリのパス> # ファイルまたはディレクトリを複数追加する場合 ADD <ホスト側のファイルまたはディレクトリのパス 1> <ホスト側のファイルまたはディレクトリのパス 2> ... <コンテナ側のファイルまたはディレクトリのパス> # []で囲むこともできる ADD ["<ホスト側のファイルまたはディレクトリのパス 1>", "<ホスト側のファイルまたはディレクトリのパス 2>" ... "<コンテナ側のファイルまたはディレクトリのパス>"] <br> ===== COPY ===== ホスト側のファイルおよびディレクトリをイメージに複製する。<br> # ファイルまたはディレクトリを1つ追加する場合 COPY <ホスト側のファイルまたはディレクトリのパス> <コンテナ側のファイルまたはディレクトリのパス> # ファイルまたはディレクトリを複数追加する場合 COPY <ホスト側のファイルまたはディレクトリのパス 1> <ホスト側のファイルまたはディレクトリのパス 2> ... <コンテナ側のファイルまたはディレクトリのパス> # []で囲むこともできる COPY ["<ホスト側のファイルまたはディレクトリのパス 1>", "<ホスト側のファイルまたはディレクトリのパス 2>" ... "<コンテナ側のファイルまたはディレクトリのパス>"] <br> ===== EXPOSE ===== コンテナ実行時にリッスンするポート番号を指定する。<br> # ポートを1つ開放する場合 EXPOSE <ポート番号> # ポートを複数開放する場合 EXPOSE <ポート番号 1> <ポート番号 2> ... <br> ===== ENTRYPOINT ===== コンテナの起動時に実行する処理を指定する。<br> # 実行可能コマンドを指定する # 実行可能コマンドは、フルパスを指定しなければならない。 ENTRYPOINT ["<実行可能コマンド>", "<引数 1>", "<引数 2>", "<引数...>"] # シェルで実行するコマンドを指定する : /bin/sh -c "<コマンド> <引数 1> <引数 2> <引数...>" ENTRYPOINT <コマンド> <引数 1> <引数 2> <引数...> <br> ===== RUN ===== RUNには2つのシンタックスがある。<br> # 実行可能コマンドを指定する # 実行可能コマンドは、フルパスを指定しなければならない。 RUN ["<実行可能コマンド>", "<引数 1>", "<引数 2>", "<引数...>"] # シェルで実行するコマンドを指定する : /bin/sh -c "<コマンド> <引数 1> <引数 2> <引数...>" RUN <コマンド> <引数 1> <引数 2> <引数...> <br> ===== RUN mounts ===== コンテナにファイルシステムをマウントする。<br> 現在サポートされているマウントの種類は、bind、cache、secret、tmpfsである。<br> <br> * RUN mountsの全体のオプション ** src / source **: ボリュームおよびbindのマウント元のパスを指定する。 (<u>bindでは必須である</u>) **: <code>from</code>を指定する場合、<code>src</code>は<code>from</code>フィールドのサブパスになる。 ** dst / destination / target **: マウント先の指定する。 ** ro / read-only **: <code>true</code> (デフォルト) または <code>false</code>を指定する。 *: <br> * マウントの種類がbindのみの設定 ** bind-propagation **: <code>shared</code>、<code>slave</code>、<code>private</code>、<code>rshared</code>、<code>rslave</code>、<code>rprivate</code> (デフォルト) ** bind-nonrecursive **: 再帰的なバインドマウントを設定しない。 **: デフォルトでは再帰的である。 ** from **: src / sourceのルートのステージ名またはイメージ名を指定する。 **: デフォルトはビルドコンテキスト。 ** rw / read-write **: マウントへの書き込みを許可する。 *: <br> * マウントの種類がtmpfsのみの設定 ** tmpfs-size **: tmpfsマウントのサイズ (バイト)。 **: Linuxのデフォルトでは無制限である。 ** tmpfs-mode **: tmpfsのファイルモードを8進数で指定する。 **: Linuxのデフォルトは<u>1777</u>である。 ** tmpcopyup **: tmpfsマウントによりシャドウされるパスは、tmpfs自体に再帰的にコピーされる。 *: <br> * マウントの種類がcacheのみの設定 ** id **: 特定のidに対して、個別のキャッシュディレクトリを作成する。 ** mode **: 新しいキャッシュディレクトリのファイルモード (8進数) を指定する。 **: デフォルトは<u>0755</u>である。 ** ro / readonly **: キャッシュの読み取り専用となる。 ** uid **: キャッシュディレクトリのuid。 ** gid **: キャッシュディレクトリのgid。 ** from **: src / sourceのルートのステージ名を指定する。 **: デフォルトはホストキャッシュディレクトリである。 ** rw / read-write **: マウントへの書き込みを許可する。 <br> RUN mounts type=<マウントの種類>,<ホスト側のパス>:<コンテナ側のパス> # マウントの種類はbind、ホスト側のパスは/tmp/sample1、コンテナ側のパスは/tmp/sample2の場合 RUN mounts type=bind,source=/tmp/sample1,destination=/tmp/sample2 # マウントの種類はtmpfs、サイズは512[MB]、コンテナ側のパスは/tmp/directoryの場合 RUN mounts type=tmpfs,tmpfs-size=512M,destination=/tmp/directory # マウントの種類はsecret、IDはmysecret、コンテナ側のsecretのパスは/tmp/secret/mysecretの場合 RUN mounts type=secret,id=mysecret cat /run/secrets/mysecret <br> ===== CMD ===== ContainerfileのCMDは1つのみ指定できる。<br> 複数のCMDが記述されている場合は、最後のCMDのみが有効になる。<br> <br> CMDには3つのシンタックスがある。<br> # 実行可能コマンドを指定する # 実行可能コマンドは、フルパスを指定しなければならない。 # 例: CMD ["/usr/bin/wc","--help"] CMD ["<実行可能コマンド>", "<引数 1>", "<引数 2>", "<引数...>"] # 実行可能ファイルを省略する場合は、ENTRYPOINTにデフォルトの引数を指定する CMD ["<引数 1>", "<引数 2>", "<引数...>"] # シェルで実行するコマンドを指定する : /bin/sh -c "<コマンド> <引数 1> <引数 2> <引数...>" # 例: CMD echo "This is a test." | wc - CMD <コマンド> <引数 1> <引数 2> <引数...> <br><br> == Podman Desktop == ==== Podman Desktopのインストール ==== [https://podman-desktop.io Podman Desktopの公式Webサイト]、または、[https://github.com/containers/podman-desktop/ Github]にアクセスして、Podman Desktopをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf podman-desktop-<バージョン>.tar.gz mv podman-desktop-<バージョン> Podman-Desktop <br> 必要ならば、任意のインストールディレクトリに配置する。<br> mv Podman-Desktop <任意のインストールディレクトリ> <br> Podman Desktopのデスクトップエントリファイルを作成する。<br> vi ~/.local/share/applications/Podman-Desktop.desktop <br> <syntaxhighlight lang="ini"> # ~/.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 </syntaxhighlight> <br> ==== Docker Hubの使用 ==== Docker Hubにログインする。<br> podman login -u <Docker Hubのユーザ名> -v https://docker.io podman login -u <Docker Hubのユーザ名> -v https://index.docker.io/v2/ <br> Podman Desktopを再起動する。<br> <br> 認証情報は、/run/user/$UID/containers/auth.jsonファイルに保存される。<br> <br><br> == ルートレスモード == ==== ルートレスモードとは ==== Podmanはsetuidパッケージが不要であり、一般ユーザとしてコンテナを実行することができる。<br> ルートレスモードで実行する場合、Podmanコンテナはユーザネームスペースを使用して、コンテナ内のrootをPodmanを実行しているユーザに設定する。<br> <br> ルートレスモードのPodmanは、コンテナを実行しているユーザには無い特権は持たず、ロックダウンされたコンテナを実行する。<br> <br> これらの制限の一部は (例えば、<code>--privileged</code>オプションを付加して) 解除できるが、ルートレスコンテナが起動したユーザ以上の権限を持つことはない。<br> 一般ユーザとしてPodmanを実行する時、ホストから/etc/passwdにマウントした場合でも、一般ユーザには権限が無いため変更することはできない。<br> <br> ==== PodmanとDockerの違い ==== DockerとPodmanの違いの1つは、コンテナの扱い方である。<br> Dockerは、コンテナを実行するためにスーパーユーザ権限を必要とする。<br> Podmanは、スーパーユーザ権限無しでコンテナを実行することができる。<br> <br> 例えば、ルートレスモードのPodmanでは、ポート番号が1024番未満のポートでコンテナを起動することはできないため、1024番以上のポートを使用する必要がある。<br> <br> もし、1024番未満のポートでコンテナを作成する必要がある場合は、ルートレスモードを解除してスーパーユーザ権限で実行する。<br> podman machine set --rootful <br> ルートレスモードに戻す場合は、以下に示すコマンドを実行する。<br> podman machine set --rootful=false <br> しかし、Dockerには、コンテナを作成および管理するためDocker Composeが存在する。<br> 幸運なことに、PodmanはDocker CLIをエミュレートできるため、Docker Composeと連携することができる。<br> <br> ==== ルートレスコンテナの保存先 ==== ルートレスコンテナのイメージは、<code>~/.local/share/containers/storage</code>ディレクトリに保存される。<br> ルートレスコンテナの設定ファイルは、<code>~/.config/containers</code>ディレクトリに保存される。<br> <br> ==== firewalldの設定 (ポートフォワード) ==== ルートレスコンテナにおいて、一般ユーザは、ルートレスコンテナのWebサーバをホスト側の80番ポートで公開することができない。<br> (1024番未満のポートを公開することができない)<br> <br> そのため、1024番未満のポートでサービスを公開する場合は、firewalldでポートフォワードを設定して、ポートをマッピングする必要がある。<br> sudo firewall-cmd --permanent --add-forward-port=port=<ホスト側のフォワード先のポート番号>:proto=tcp:toport=<Podmanのコンテナで設定したフォワード先のポート番号> sudo firewall-cmd --permanent --add-port=<ホスト側のフォワード先のポート番号>/tcp sudo firewall-cmd --reload <br><br> == k8sマニフェストとの連携 == Podmanは、k8sマニフェストを作成および実行することも可能である。<br> これは、k8s Podの開発に有効である。<br> <br> ==== k8sマニフェストの作成 ==== k8sマニフェストを作成元となるPodmanのコンテナを実行する。<br> podman container start <コンテナ名 または コンテナID> <br> k8sマニフェストを生成する。<br> podman generate kube <コンテナ名 または コンテナID> > <k8sマニフェストのファイル名>.yml <br> ==== k8s Podの作成 ==== k8sマニフェストを使用して、k8s Podを作成する。<br> kubectl create -f <k8sマニフェストのファイル名>.yml <br> ==== k8sマニフェストの実行 ==== k8sマニフェストの作成元のコンテナを削除する。<br> podman container stop <コンテナ名 または コンテナID> podman container rm <コンテナ名 または コンテナID> <br> k8sマニフェストを実行して、コンテナを実行する。<br> podman play kube <k8sマニフェストのファイル名>.yml <br> k8sマニフェストを作成したコンテナが実行されているかどうかを確認する。<br> podman ps <br><br> == エラー関連 == ==== 実行権限エラー ==== containerfileファイルまたはcontainer-compose.ymlファイルを使用する時、以下に示すようなエラーが出力される場合がある。<br> error checking context: 'no permission 〜' <br> この時、Containerfileファイルまたはcontainer-compose.ymlファイルに実行権限を付加する。<br> chmod 755 containerfile # または container-compose.yml <br> ==== Systemdエラー ==== openSUSEコンテナをPodmanコンテナとして動作する時、以下のようなエラーが出力されてSystemdサービスが起動できない。<br> Failed to connect to bus: No such file or directory. <br> これは、Podmanコンテナを実行する時、initシステムを実行していないからである。<br> <br> <code>systemctl</code>コマンドは、dbusを介してsystemdと通信するプロセスである。<br> openSUSEコンテナでは、dbusとsysvinitがインストールされていないため(dbusやsystemdが動作していない)、<code>systemctl</code>コマンドは失敗する。<br> <br> Podmanコンテナで<code>systemctl</code>を実行するには、その依存関係をインストールして、特殊なコマンドを実行する必要がある。<br> <br> containerfileを作成および使用して解決する手順を、以下に記載する。<br> まず、以下のようなdockerfileを作成する。<br> FROM opensuse/leap:15.3 MAINTAINER Annonymas RUN zypper update -y RUN zypper install -y dbus-1 systemd-sysvinit RUN cp /usr/lib/systemd/system/dbus.service /etc/systemd/system/; \ sed -i 's/OOMScoreAdjust=-900//' /etc/systemd/system/dbus.service VOLUME ["/sys/fs/cgroup", "/run"] CMD ["/sbin/init"] EXPOSE 22 EXPOSE 80 <br> 次に、作成したcontainerfileからPodmanイメージを作成する。<br> podman build -t <イメージ名>:<タグ名> -f <containerfile名> . # イメージ名:タグ名およびDockerfile名(Dockerfile名がdockerfileの場合のみ)は省略できる 例. podman build -t suse153i . <br> Podmanコンテナを実行する。<br> podman run -d --name=<コンテナ名> --hostname <コンテナのホスト名> <ポートマッピングする場合: -p <ホストのポート番号>:<コンテナのポート番号>> --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <イメージ名> 例. podman run -d --name=suse153c --hostname suse153 -p 50080:80 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro suse153i # 開始しているコンテナ内にアクセスする場合 podman exec -it <コンテナ名> /bin/bash 例. podman exec -it suse153c /bin/bash # 停止したコンテナを開始する場合 podman container start <コンテナ名> 例. podman container start suse153c <br> openSUSEコンテナにおいて、<code>systemctl</code>コマンドが実行できるかどうかを確認する。<br> # Podmanコンテナ内に入る podman exec -it <コンテナIDまたはコンテナ名> /bin/bash # systemctlコマンドが実行できるかどうかを確認 systemctl list-units <br> ==== Systemdサービスのサポート ==== [https://registry.opensuse.org/cgi-bin/cooverview openSUSEコンテナリポジトリ]で公開されているコンテナイメージは、containers-systemdパッケージがインストールされている。<br> 例えば、Systemdサービスを使用してNginXコンテナを設定して、自動的に起動するためのSystemdサービスファイルとSysconfigファイルが含まれている。<br> <br><br> __FORCETOC__ [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Web]]
インストール - Podman
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse