📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の55版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
コンテナとは、Linuxシステム上で実行される、互いに隔離されたプロセス群のことである。<br> | |||
また、ソフトウェアプロセスやマイクロサービスをパッケージ化して、あらゆるコンピューティング環境で実行可能にするソフトウェアソリューションである。<br> | |||
<br> | |||
コンテナは、1つのプロセス・グループがシステム上の他のプロセスに干渉しないようにする。<br> | |||
<br> | <br> | ||
コンテナに含まれるファイルには、アプリケーションコード、環境変数、設定コード、バイナリプログラム、ソフトウェアの依存関係、ライブラリ等がある。<br> | コンテナに含まれるファイルには、アプリケーションコード、環境変数、設定コード、バイナリプログラム、ソフトウェアの依存関係、ライブラリ等がある。<br> | ||
| 7行目: | 10行目: | ||
このイメージは、クラウド、オンプレミスのデータシステム、ローカルシステム等、あらゆるプラットフォームにデプロイされる。<br> | このイメージは、クラウド、オンプレミスのデータシステム、ローカルシステム等、あらゆるプラットフォームにデプロイされる。<br> | ||
<br> | <br> | ||
Podman (Pod | また、不正なプロセスがシステム・リソースを独占することはできず、他のプロセスがタスクを実行するのを妨げることもできる。<br> | ||
悪意のあるコンテナであったとしても、他のコンテナを攻撃したり、データを盗んだり、サービス拒否攻撃を引き起こしたりすることもできない。<br> | |||
<br> | |||
コンテナの最終的な目標は、同じライブラリの異なるバージョンを必要とするアプリケーションと競合しないように、<br> | |||
共有ライブラリの独自のバージョンでアプリケーションをインストールできるようにすることある。<br> | |||
その代わり、コンテナによってアプリケーションは仮想化された環境に住むことができ、あたかもシステム全体を所有しているかのような印象を与えることができる。<br> | |||
<br> | |||
Podman (Pod Manager) は、Open Container Initiatives (OCI) のコンテナイメージを開発、管理、本番環境で実行する時に使用するコンテナエンジンである。<br> | |||
Podmanプロジェクトは、Podmanを<u>Linuxシステム上でOCIコンテナを開発、管理、実行するためのデーモンレス・コンテナ・エンジン</u>と説明している。<br> | |||
<br> | |||
OCIは、コンテナフォーマットとランタイムに関するOSレベルの仮想化ソフトウェアコンテナのオープンなガバナンス構造を実装するために設計された。<br> | OCIは、コンテナフォーマットとランタイムに関するOSレベルの仮想化ソフトウェアコンテナのオープンなガバナンス構造を実装するために設計された。<br> | ||
<br> | <br> | ||
Podmanコンテナは、スーパユーザ / 非スーパーユーザのいずれでも実行可能である。<br> | Podmanコンテナは、スーパユーザ / 非スーパーユーザのいずれでも実行可能である。<br> | ||
<br> | |||
PodmanはDockerと同じコマンドラインでDockerができることのほとんど全てを行うことができるため、Docker = Podmanという単純な行のエイリアスで要約されることが多い。<br> | |||
しかし、Podmanはそれ以上のことができる。<br> | |||
<br> | |||
Dockerを理解することはPodmanを理解する上で重要ではないが役立つこともある。<br> | |||
<br><br> | |||
== コンテナ・オーケストレータ / コンテナ・エンジン / コンテナ・ランタイム == | |||
コンテナの世界では、コンテナ・オーケストレータ、コンテナ・エンジン、コンテナ・ランタイムといった用語が同じ意味で用いられることがよくある。<br> | |||
<br> | |||
==== コンテナ・オーケストレータ ==== | |||
コンテナを複数の異なるマシンやノードにオーケストレートするソフトウェアプロジェクトや製品のことである。<br> | |||
これらのオーケストレータは、コンテナを実行するためにコンテナエンジンと通信する。<br> | |||
<br> | |||
主要なコンテナ・オーケストレータはKubernetesで、元々はDockerデーモンのコンテナ・エンジンと通信するように設計されていたが、<br> | |||
Kubernetesはコンテナ・エンジンとして主にCRI-Oまたはcontainerdを使用しているため、Dockerを使用することは時代遅れになりつつある。<br> | |||
<br> | |||
CRI-Oとcontainerdは、オーケストレーションされたKubernetesコンテナを実行するために構築されている。<br> | |||
<br> | |||
Docker SwarmおよびApache Mesosも、コンテナ・オーケストレータである。<br> | |||
<br> | |||
==== コンテナ・エンジン ==== | |||
主に、コンテナ化されたアプリケーションを単一のローカル・ノードで実行するように構成するために使用される。<br> | |||
ユーザ、管理者、開発者が直接起動できる。<br> | |||
<br> | |||
また、ブート時にSystemdユニットファイルから起動したり、Kubernetesのようなコンテナ・オーケストレータから起動することもできる。<br> | |||
<br> | |||
前述したように、CRI-Oとcontainerdは、Kubernetesがコンテナをローカルで管理するために使用するコンテナエンジンである。<br> | |||
一般的に、ユーザが直接使用することは想定されていない。<br> | |||
<br> | |||
DockerとPodmanは、コンテナ化されたアプリケーションを1台のマシンで開発、管理、実行するためにユーザが使用する主要なコンテナエンジンである。<br> | |||
<br> | |||
PodmanがKubernetesのコンテナ起動に使われることはほとんどない。<br> | |||
<br> | |||
Buildahもコンテナエンジンの1つであるが、コンテナイメージの構築にしか使用されない。<br> | |||
<br> | |||
==== Open Container Initiative (OCI) コンテナ・ランタイム ==== | |||
Linuxカーネルの様々な部分を設定して、最後にコンテナ化されたアプリケーションを起動する。<br> | |||
最も一般的に使用される2つのコンテナ・ランタイムは、runcとcrunである。<br> | |||
<br> | |||
KataとgVisorも、コンテナ・ランタイムである。<br> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>Open Container Initiative (OCI) は、コンテナフォーマットとランタイムに関するオープンな業界標準を作成することを主な目的とした標準化団体である。</u><br> | |||
<u>詳細を知りたい場合は、https://opencontainers.org を参照すること。</u><br> | |||
<br> | |||
下図は、オープンソース・コンテナ・プロジェクトがどのカテゴリーに当てはまるかを示している。<br> | |||
[[ファイル:Container 1.png|中央]] | |||
<br><br> | <br><br> | ||
| 67行目: | 127行目: | ||
まず、[https://github.com/containers/gvisor-tap-vsock/ gvproxyのGithub]にアクセスして、gvproxyをダウンロードする。<br> | まず、[https://github.com/containers/gvisor-tap-vsock/ gvproxyのGithub]にアクセスして、gvproxyをダウンロードする。<br> | ||
ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。<br> | ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。<br> | ||
# ファイル名を変更 | |||
mv gvproxy-linux-<アーキテクチャ名> gvproxy | mv gvproxy-linux-<アーキテクチャ名> gvproxy | ||
sudo mkdir -p /usr/libexec/podman または sudo mkdir -p /usr/local/libexec/podman | |||
# 実行権限を付加 (非スーパーユーザでも実行できるようにする) | |||
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 | sudo mv gvproxy /usr/local/libexec/podman | ||
<br> | <br> | ||
| 94行目: | 168行目: | ||
<br> | <br> | ||
conmonのビルドに必要なライブラリをインストールする。<br> | conmonのビルドに必要なライブラリをインストールする。<br> | ||
# RHEL | |||
sudo dnf install meson ninja glib2-devel glibc-devel libseccomp-devel | |||
# SUSE | # SUSE | ||
sudo zypper install meson ninja glib2-devel libseccomp-devel | sudo zypper install meson ninja glib2-devel glibc-devel libseccomp-devel systemd-devel | ||
<br> | <br> | ||
[https://github.com/containers/conmon conmonのGithub]にアクセスして、ソースコードをダウンロードする。<br> | [https://github.com/containers/conmon conmonのGithub]にアクセスして、ソースコードをダウンロードする。<br> | ||
| 118行目: | 195行目: | ||
最新バージョンのcrun /runcがシステムにインストールされていることが期待される。<br> | 最新バージョンのcrun /runcがシステムにインストールされていることが期待される。<br> | ||
crun /runcは、Podmanによりその1つがデフォルトのランタイムとしてピックアップされる。(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> | <br> | ||
[https://github.com/opencontainers/runc/ crun /runcのGithub]にアクセスして、ソースコードをダウンロードする。<br> | [https://github.com/opencontainers/runc/ crun /runcのGithub]にアクセスして、ソースコードをダウンロードする。<br> | ||
| 129行目: | 210行目: | ||
<br> | <br> | ||
crun /runcをビルドおよびインストールする。<br> | crun /runcをビルドおよびインストールする。<br> | ||
# AppArmor, SECcompを有効にする場合 | |||
make BUILDTAGS="apparmor seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) | |||
# SELinux, SECcompを有効にする場合 | # SELinux, SECcompを有効にする場合 | ||
make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) | make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) | ||
| 137行目: | 221行目: | ||
make PREFIX=<Podmanのインストールディレクトリ> install | make PREFIX=<Podmanのインストールディレクトリ> install | ||
<br> | <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ネットワークの設定 ===== | ===== CNIネットワークの設定 ===== | ||
<u>※注意</u><br> | <u>※注意</u><br> | ||
| 214行目: | 345行目: | ||
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock | export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
===== catatonitのインストール ===== | |||
catatonitは、PodmanやDocker等のコンテナランタイムが、コンテナ内のプロセスを正しく管理するために使う補助的なツールである。<br> | |||
ポッドは、Kubernetes等のオーケストレーションツールで使用される複数のコンテナを1つにまとめた単位であるが、ポッド自体の作成や管理はKubernetesの制御プレーンやAPIサーバが行う。<br> | |||
<br> | |||
catatonitは、コンテナのinitプロセスとして使用される小さなプログラムである。<br> | |||
Podmanや他のコンテナランタイムでは、コンテナ内でプロセスが正しく動作および終了するためにinitプロセスを使用することが一般的である。<br> | |||
catatonitはそのための軽量な選択肢の1つであり、特にリソースの少ない環境やシンプルなコンテナイメージでの使用に適している。<br> | |||
<br> | |||
コンテナのinitプロセスは、コンテナ内で最初に実行されるプロセスであり、次のような役割を果たす。<br> | |||
* 孤児プロセスの回収 | |||
*: コンテナ内で起動されたプロセスが終了した時、その親プロセスが終了している場合、プロセスが孤児化される。 | |||
*: initプロセスはこれらの孤児プロセスを回収して、適切に終了させる。 | |||
*: <br> | |||
* シグナルの管理 | |||
*: catatonitは、コンテナに送信されるシグナルをキャッチして、適切にハンドリングする。 | |||
*: これにより、コンテナ内で実行中のプロセスがシグナルを受信できるようにする。 | |||
*: <br> | |||
* リソースのクリーンアップ | |||
*: コンテナが終了する時、catatonitはシステムリソースを適切にクリーンアップする。 | |||
<br> | |||
[https://github.com/openSUSE/catatonit catatonitのGithub]にアクセスして、ソースコードをダウンロードする。<br> | |||
ダウンロードしたファイルを解凍する。<br> | |||
tar xf catatonit.tar.xz | |||
cd catatonit | |||
<br> | |||
または、<code>git clone</code>コマンドを実行してソースコードをダウンロードすることもできる。<br> | |||
git clone https://github.com/openSUSE/catatonit.git | |||
cd catatonit | |||
<br> | |||
catatonitをビルドおよびインストールする。<br> | |||
./autogen.sh | |||
mkdir build && cd build | |||
../configure --prefix=<Podmanのインストールディレクトリ> | |||
make -J $(nproc) | |||
make install | |||
<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に関連するディレクトリ == | |||
Podmanに関連するディレクトリを以下に示す。<br> | |||
これらのディレクトリは、Podmanとその関連ツール (Podman Desktop) によって使用されており、rootlessモードで実行する時にユーザのホームディレクトリ配下に作成される。<br> | |||
<br> | |||
* ~/.local/share/containers/storage | |||
*: Podmanが使用するメインのストレージディレクトリである。 | |||
*: コンテナイメージ、コンテナ、ボリューム等のデータが格納される。 | |||
* ~/.local/share/containers/podman-desktop | |||
*: Podman Desktopアプリケーションが使用するディレクトリである。 | |||
*: GUIベースのPodman管理ツールの設定やデータが保存される。 | |||
* ~/.local/share/containers/cache | |||
*: Podmanのキャッシュディレクトリである。 | |||
*: イメージレイヤーのキャッシュやその他の一時的なデータが保存される。 | |||
*: キャッシュを使用することにより、同じイメージの再ダウンロードを避け、操作を高速化する。 | |||
<br><br> | <br><br> | ||
| 234行目: | 503行目: | ||
export DOCKER_HOST="unix://<Podmanソケットファイルのパス>" | export DOCKER_HOST="unix://<Podmanソケットファイルのパス>" | ||
</syntaxhighlight> | </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> | <br> | ||
==== Linux仮想マシンの初期化 ==== | ==== Linux仮想マシンの作成と開始 ==== | ||
===== Linux仮想マシン (Podman Machine) とは ===== | |||
Podman Machineを理解するには、まず、Podmanのアーキテクチャについて知る必要がある。<br> | |||
<br> | |||
Linuxでは、Podmanはデフォルトでrootless (非特権) モードで動作できるため、直接コンテナが実行できる。<br> | |||
<u>Linuxでは、以下に示すようなLinuxカーネルの機能 (コンテナ実行に必要な機能が最初から利用可能) を直接利用できるできるため、</u><br> | |||
<u>Podman Machineは不要であり、podman run等のコマンドが直接実行できる。</u><br> | |||
* namespaces | |||
* cgroups | |||
* SELinux / AppArmor等 | |||
<br> | |||
Windows / MacOSでは、Linuxコンテナをネイティブに実行できないため、仮想マシンを介してLinux環境を用意する必要があるため、仮想マシン (VM) が必要になる。<br> | |||
この仮想マシンを<u>Podman Machine</u>と呼ぶ。<br> | |||
<br> | |||
podman machineコマンドの役割を以下に示す。<br> | |||
* Windows / MacOS環境で必要な仮想マシンを起動すること。 | |||
* 仮想マシン内でPodmanデーモンを開始すること。 | |||
* ホストOSからコンテナを操作できるような環境を準備すること。 | |||
<br> | |||
podman machineコマンドを実行せずにpodman runコマンド等が使用できる環境は、以下の通りである。<br> | |||
* ホストOSがLinux | |||
* Podman Machineが自動的に設定・起動されている状態 | |||
<br> | |||
===== Linux仮想マシンの初期化 ===== | |||
コンテナが実行される新しいLinux仮想マシンを初期化する。<br> | コンテナが実行される新しいLinux仮想マシンを初期化する。<br> | ||
VMにアクセスするためのSSHキーが自動的に生成されて、VM内のスーパーユーザアカウントとユーザアカウントへのシステム接続が追加される。<br> | VMにアクセスするためのSSHキーが自動的に生成されて、VM内のスーパーユーザアカウントとユーザアカウントへのシステム接続が追加される。<br> | ||
| 244行目: | 617行目: | ||
一般的なFedora CoreOSのアップグレードは14日ごとに行われるが、自動アップデートのZincataはPodmanマシンでは無効になっている。<br> | 一般的なFedora CoreOSのアップグレードは14日ごとに行われるが、自動アップデートのZincataはPodmanマシンでは無効になっている。<br> | ||
<br> | <br> | ||
もし、LinuxホストでPodman Machineを作成した場合は、~/.local/share/containers/podman/machineディレクトリに初期ファイルが生成される。<br> | |||
これは、2[GB]程度の容量が必要なため、Linux上ではPodman Machineは不要であることから削除することを推奨する。<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> | Linux仮想マシンを開始する。<br> | ||
podman machine start | podman machine start | ||
| 284行目: | 674行目: | ||
<br><br> | <br><br> | ||
== | == Podmanのデータ保存場所と設定 == | ||
==== Linux環境でのデフォルト保存場所 ==== | |||
Podmanのイメージやコンテナの保存場所は、実行モードによって異なる。<br> | |||
* rootlessモード (非rootユーザとして実行) | |||
*: ~/.local/share/containers | |||
== | * rootモード (root権限で実行) | ||
*: /var/lib/containers | |||
<br> | <br> | ||
==== Windows環境での保存場所 ==== | |||
Windowsでは、WSL2ベースのPodman Machineを使用するため、データはWSL2内に保存される。<br> | |||
* WSL2ディストリビューション内 | |||
*: \\wsl$\podman-machine-default\ | |||
==== | |||
<br> | |||
* | |||
*: | |||
*: <br> | *: <br> | ||
* | *: 具体的なパスの例 (VM内部) | ||
*: | *: /var/lib/containers | ||
*: | *: ~/.local/share/containers | ||
<br> | <br> | ||
ホスト側からのアクセスとしては、<u>\\wsl$\podman-machine-default\home\user\.local\share\containers</u> となる。<br> | |||
<br> | <br> | ||
==== Podmanの設定ファイル ==== | |||
===== storage.conf : ストレージ保存場所の設定 ===== | |||
このファイルは、イメージやコンテナの物理的な保存場所 (graphroot) を設定する。<br> | |||
<br> | <br> | ||
* rootlessモード | |||
*: ~/.config/containers/storage.conf | |||
* rootモード | |||
*: /etc/containers/storage.conf | |||
<br> | <br> | ||
===== containers.conf : コンテナ動作の設定 ===== | |||
このファイルは、コンテナの実行時動作 (デフォルトネットワーク、リソース制限、ヘルパーバイナリ等) を設定する。<br> | |||
<br> | <br> | ||
* rootlessモード | |||
*: ~/.config/containers/containers.conf | |||
* rootモード | |||
*: /etc/containers/containers.conf | |||
<br> | <br> | ||
==== デフォルト保存場所の変更方法 ==== | |||
==== | ===== 方法 1 : storage.confの編集 ===== | ||
storage.confファイルを編集して、保存場所を変更する。<br> | |||
<br> | <br> | ||
* rootlessモード | |||
*: ~/.config/containers/storage.conf | |||
* rootモード | |||
*: /etc/containers/storage.conf | |||
<br> | <br> | ||
<syntaxhighlight lang="toml"> | |||
=== | [storage] | ||
driver = "overlay" | |||
graphroot = "/path/to/new/location" # イメージとコンテナの保存先 | |||
runroot = "/path/to/run/location" # 実行時データの保存先 | |||
</syntaxhighlight> | |||
<br> | <br> | ||
===== 方法 2 : 環境変数の使用 ===== | |||
一時的に保存場所を変更する場合は、環境変数を設定する。<br> | |||
設定変更後は、Podmanを再起動、または、新規コンテナで変更が反映される。<br> | |||
<br> | <br> | ||
== | <syntaxhighlight lang="bash"> | ||
export CONTAINERS_STORAGE_CONF=/path/to/custom/storage.conf | |||
</syntaxhighlight> | |||
< | |||
<br> | <br> | ||
==== Podman Machine環境での変更 ==== | |||
Podman Machine (WSL2やVM等) を使用している場合、保存場所の変更方法が異なる。<br> | |||
<br> | <br> | ||
===== VM内の保存場所を変更する場合 ===== | |||
Podman MachineにSSH接続する。<br> | |||
podman machine ssh | |||
==== | |||
<br> | <br> | ||
VM内でstorage.confを編集する。<br> | |||
# rootlessモードの場合 | |||
vi ~/.config/containers/storage.conf | |||
# | # rootモードの場合 | ||
sudo vi /etc/containers/storage.conf | |||
<br> | <br> | ||
==== | ===== Podman Machine自体のディスクイメージ保存場所 ===== | ||
Podman Machine自体の仮想ディスクイメージは、以下に示す場所に保存されている。<br> | |||
ディスクイメージの保存場所を変更することも可能であるが、Podman Machineの再作成が必要になる場合がある。<br> | |||
<br> | <br> | ||
* | * Linux | ||
*: ~/.local/share/containers/podman/machine/ | |||
* Windows | |||
*: %USERPROFILE%\.local\share\containers\podman\machine\ | |||
* | |||
*: | |||
<br><br> | <br><br> | ||
== | == Podmanの動作確認 == | ||
Podmanの動作を確認するため、テストイメージをダウンロードして実行する。<br> | |||
podman run hello-world | |||
<br><br> | <br><br> | ||
| 735行目: | 824行目: | ||
しかし、Dockerには、コンテナを作成および管理するためDocker Composeが存在する。<br> | しかし、Dockerには、コンテナを作成および管理するためDocker Composeが存在する。<br> | ||
幸運なことに、PodmanはDocker CLIをエミュレートできるため、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> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Web]] | [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]][[カテゴリ:Web]][[カテゴリ:コンテナ]] | ||