Podmanを使用した基本的なコンテナ管理
- 概要
コンテナは、単一のホスト上で複数の仮想環境(コンテナ)を同時に実行するための軽量な仮想化方法を提供します。Podmanは、コンテナを管理するためのSLE Microのデフォルトのツールです。
- 目的
この記事では、Podmanについての基本情報を提供し、Podmanを使用してコンテナを管理する方法について説明します。
- 所要時間
この記事の理解には30分ほどを要します。
- 目標
Podman、コンテナイメージ、およびコンテナについて理解します。
- 要件
インストール済みのPodman。
1 コンテナに関する基本 #
コンテナは、単一のホスト上で複数の仮想環境(コンテナ)を同時に実行するための軽量な仮想化方法を提供します。プロセッサが完全なハードウェア環境をシミュレートし、ハイパーバイザーが仮想マシンを制御するXenやKVMなどのテクノロジとは異なり、コンテナはオペレーティングシステムレベルでの仮想化を提供し、カーネルが分離されたコンテナを制御します。
コンテナを使用すると、アプリケーションを自己完結型ユニットに分離できます。
コンテナはネイティブに近いパフォーマンスを提供します。ランタイムに応じて、コンテナはホストカーネルを直接使用できるので、オーバーヘッドを最小限に抑えることができます。
カーネル制御グループを通じてネットワークインタフェースを制御し、コンテナ内のリソースを適用できます。
コンテナはホストシステムのカーネル上で実行されるため、異なるカーネルや異なるカーネルバージョンを使用することはできません。
コンテナのセキュリティはホストシステムに依存します。コンテナ化アプリケーションは、AppArmorまたはSELinuxプロファイルを通じてセキュリティ保護することができます。コンテナのセキュリティ保護は、攻撃対象領域が広いため仮想マシンのセキュリティ保護より困難です。
2 Podmanについて #
PodmanはPod Manager Toolの略称です。Podmanは、コンテナおよびコンテナイメージを使用してアプリケーションを実行および展開できるデーモンレスコンテナエンジンです。Podmanは、コンテナを管理するためのコマンドラインインタフェースを提供します。
Podmanにはデーモンがないため、systemdとの統合が提供されています。これにより、systemdユニット経由でコンテナを制御できます。このようなユニットを既存のコンテナ向けに作成できるほか、システムにコンテナが存在しない場合にコンテナを起動できるユニットを生成することもできます。Podmanはコンテナ内でsystemdを実行できます。
Podmanを使用すると、コンテナをポッドとして編成できます。各ポッドは同じネットワークインタフェースとリソースを共有します。コンテナのグループをポッドに編成する代表的なユースケースとして、データベースを実行するコンテナや、データベースにアクセスするクライアントを備えたコンテナがあります。
2.1 Podmanのインストール #
PodmanはデフォルトでSLE Microに含まれています。ただし、Podmanがない場合は、次の説明に従ってインストールできます。
次のコマンドを実行します。
>
sudo
transactional-update pkg install podman*システムを再起動して、新しいスナップショットで起動します。
3 コンテナイメージの取得 #
コンテナを実行するにはイメージが必要です。イメージは、アプリケーションの実行に必要な依存関係をすべて収めています。イメージレジストリからイメージを取得できます。使用可能なレジストリは/etc/containers/registries.conf
設定ファイルで定義されています。ローカルのイメージレジストリがある場合や他のレジストリを使用する場合は、そのレジストリをこの設定ファイルに追加します。
SLE Microではカスタムイメージを構築するためのツールが提供されていません。したがって、イメージを取得するには、イメージレジストリから取得する以外にありません。
openSUSEレジストリとDocker Hubはデフォルトのインストールでは設定されません。これらのレジストリからコンテナイメージをダウンロードするには、次のようにレジストリを/etc/containers/registries.conf
ファイルに追加する必要があります。
unqualified-search-registries = ["registry.suse.com", "registry.opensuse.org", "docker.io"]
podman pull
コマンドで、イメージレジストリからイメージを取得します。構文は次のとおりです。
#
podman pull[OPTIONS]SOURCE
sourceには、レジストリ名を指定せずにイメージを指定できます。その場合、Podmanは/etc/containers/registries.conf
ファイルに設定されているすべてのレジストリからイメージを取得しようとします。デフォルトのイメージタグはlatest
です。取得したイメージのデフォルトの保存場所は/var/lib/containers/storage/overlay-images/
です。
podman pull
コマンドに指定できるオプションをすべて表示するには次のコマンドを実行します。
#
podman pull --help
Cockpitを使用している場合は、
をクリックして、 メニューでイメージレジストリからイメージを取得することもできます。Podmanでは、次のコマンドを使用して、イメージレジストリまたはレジストリのリストでイメージを検索できます。
#
podman searchIMAGE_NAME
または、skopeoツールを使用して、コンテナイメージとイメージリポジトリを管理できます。詳細については、次のセクションを参照してください。
3.1 skopeo #
skopeoは、コンテナイメージとイメージリポジトリを管理、検査、および署名するためのコマンドラインユーティリティです。skopeoを使用すると、リモートおよびローカルのコンテナレジストリ上にあるコンテナやリポジトリを検査できます。また、異なるストレージバックエンド間でコンテナイメージを簡単にコピーすることもできます。
skopeoは次のレジストリタイプで動作します。
- containers-storage:IMAGE_REFERENCE
ローカルイメージストアにあるイメージ。
- docker://IMAGE_REFERENCE
レジストリ内のイメージ。
skopeoには、イメージとレジストリを管理するためのコマンドがいくつか用意されています。
-
inspect
このコマンドでは、リポジトリマニフェストを取得して、指定したリポジトリで利用可能なタグ、コンテナイメージのラベル、イメージのオペレーティングシステムなどの情報を表示できます。
コマンドの構文は次のとおりです。
>
skopeo inspect REGISTRY_TYPEIMAGE_NAME
使用例は次のとおりです。
>
skopeo inspect docker://registry.suse.com/suse/pcp:latest
{ "Name": "registry.suse.com/suse/pcp", "Digest": "sha256:eee17c009fb8b05e5825a8c9658d972ab13a17541180bd7a1348fccc6e4fc77f", "RepoTags": [ "5", "5-12.54", "5-13.10", ... ], "Created": "2023-06-19T16:59:01.617731565Z", "DockerVersion": "20.10.23-ce", "Labels": { "com.suse.application.pcp.created": "2023-06-19T16:58:29.786850402Z", "com.suse.application.pcp.description": "Performance Co-Pilot (pcp) container image based on the SLE Base Container Image. This container image is not supported when using a container runtime other than podman.", ... ], "Architecture": "amd64", "Os": "linux", "Layers": [ "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e", "sha256:19793da49ce886a67aa62657dc24a105a26d63568ce27de241246bc6cc9bc008", "sha256:403f9ef6c98d4cf277caf3166ca4455817828e33c8b699237bb8eb24cb2b41bf" ], "LayersData": [ { "MIMEType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "Digest": "sha256:a05e4c4d1fc89c7f7aa60829b8631b64873df6041f627eb2b43524e9e010446e", "Size": 47291175, "Annotations": null }, ... ], "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"-
copy
このコマンドでは、レジストリ、コンテナストレージバックエンド、およびローカルディレクトリの間でコンテナイメージをコピーできます。
使用例は次のとおりです。
>
skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
-
delete
後でレジストリのガーベッジコレクタで削除する対象として、イメージにマークを付けます。
>
skopeo delete docker://registry.example.com/example/pause:latest
-
sync
レジストリリポジトリとローカルディレクトリ間でイメージを同期します。
4 コンテナの操作 #
4.1 コンテナの実行 #
コンテナイメージを取得すると、そのイメージに基づいてコンテナを作成できます。podman run
コマンドを使用してイメージのインスタンスを実行できます。コマンドの構文は次のとおりです。
#
podman run [OPTIONS] IMAGE [CONTAINER_NAME]
IMAGEは、transport:pathの形式で指定します。transportを省略すると、デフォルトのdocker
が使用されます。pathで特定のイメージレジストリを参照できます。省略すると、/etc/containers/registries.conf
ファイルで定義したレジストリのイメージが検索されます。sle15
のイメージに基づいてコンテナsles15
を実行する例を次に示します。
#
podman run registry.opensuse.org/suse/templates/images/sle-15-sp4/base/images/suse/sle15 sles15
多く使用するオプションを次に示します。使用できるすべてのオプションを表示するにはコマンドpodman run
--help
を実行します。
-
--detach, -d
コンテナをバックグラウンドで実行します。
-
--env, -e=env
コンテナ内部でのプロセスの起動に使用できる任意の環境変数を使用できるようにします。環境変数を値なしで指定した場合、Podmanはホスト環境に値があるかどうかを確認し、ホストで値が設定されている場合にのみ、変数を設定します。
-
--help
podman run
コマンドのヘルプを出力します。--hostname=
name,-h
コンテナ内部で使用可能なコンテナホスト名を設定します。
-
--pod=
name 既存のポッドでコンテナを実行します。ポッドを作成するには、ポッド名の前に
new:
を付記します。-
--read-only
コンテナのルートファイルシステムを読み込み専用としてマウントします。
-
--systemd=true|false|always
コンテナをsystemdモードで実行します。デフォルトは「true」です。
4.2 コンテナの一覧表示 #
Podmanでpodman ps
コマンドを使用すると、実行中のすべてのコンテナを一覧表示できます。コマンドの一般的な構文は次のとおりです。
#
podman ps[OPTIONS]
表示される情報をコマンドオプションで変更できます。たとえば、--all
オプションを使用すると、実行中のコンテナだけではなく、Podmanで作成したコンテナがすべて表示されます。
podman ps
のオプションをすべて確認するには次のコマンドを実行します。
#
podman ps --help
4.3 コンテナの停止 #
podman run
コマンドが正常に終了すれば、新しいコンテナが起動しています。このコンテナを停止するには次のコマンドを実行します。
#
podman stop[OPTIONS]CONTAINER
単一のコンテナ名またはIDを指定できるほか、スペースで区切って複数のコンテナを指定することもできます。このコマンドには次のオプションを指定できます。
-
--all, -a
実行中のコンテナをすべて停止します。
-
--latest, -l
コンテナ名を指定せずに、最後に作成されたコンテナを停止します。
-
--time, -t=
seconds コンテナを強制的に停止するまで待機する秒数。
podman stop
コマンドに指定できるオプションをすべて表示するには次のコマンドを実行します。
#
podman stop --help
4.4 コンテナの起動 #
作成済みで停止したコンテナを起動するにはpodman start
コマンドを使用します。コマンドの構文は次のとおりです。
#
podman start[OPTIONS]CONTAINER
CONTAINERにはコンテナ名またはコンテナIDを指定できます。
podman
start
で使用できるすべてのオプションを表示するには次のコマンドを実行します。
#
podman start --help
4.4.1 変更したコンテナの実行 #
元のイメージにはない属性を持つ新しいコンテナを実行できます。このような属性を持つコンテナを新しいイメージとして保存するにはpodman commit
コマンドを使用します。
#
podman commit[OPTIONS]CONTAINERIMAGE
CONTAINERはコンテナ名またはコンテナIDです。IMAGEは、新しいイメージの名前です。このイメージ名の先頭がレジストリ名ではない場合、値localhost
が使用されます。
4.5 コンテナの削除 #
ホストから未使用のコンテナを1つ以上削除するには、次のようにpodman rm
コマンドを使用します。
#
podman rm[OPTIONS]CONTAINER
CONTAINERにはコンテナ名またはコンテナIDを指定できます。
指定したコンテナが実行中の場合、このコマンドではそのコンテナが削除されません。実行中のコンテナを削除するには-f
オプションを使用します。
podman rm
のオプションをすべて確認するには次のコマンドを実行します。
#
podman rm --help
停止しているすべてのコンテナを1つのコマンドでホストから削除できます。
#
podman container prune
コマンドを実行する前に、停止している各コンテナが削除対象であることを確認します。この確認を怠ると、一時的に停止されているだけでまだ使用中のコンテナが削除されることがあります。
5 ポッドの操作 #
コンテナはポッドにグループ化できます。ポッド内のコンテナは、ネットワーク、pid、およびIPCネームスペースを共有します。podman pod
コマンドでポッドを管理できます。このセクションでは、ポッドを管理するためのコマンドの概要について説明します。
5.1 ポッドの作成 #
ポッドを作成するにはコマンドpodman pod create
を使用します。コマンドの構文は次のとおりです。
#
podman pod create[OPTIONS]
このコマンドではポッドIDが出力されます。デフォルトでは、ポッドは作成しても起動していません。ポッドを起動するには、ポッドでコンテナを実行するか、5.3項 「ポッドの起動/停止/再起動」の説明に従ってポッドを起動します。
--name
オプションでポッド名を指定しないと、デフォルトのポッド名が割り当てられます。
使用できるすべてのオプションを表示するには次のコマンドを実行します。
#
podman pod create --help
5.2 ポッドの一覧表示 #
次のコマンドを実行すると、すべてのポッドを一覧表示できます。
#
podman pod list
出力は次のようになります。
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 30fba506fecb upbeat_mcclintock Created 19 hours ago 1 4324f40c9651 976a83b4d88b nervous_feynman Running 19 hours ago 2 daa5732ecd02
各ポッドにはINFRA
コンテナがあるので、ポッドのコンテナ数は必ず1以上になります。
5.3 ポッドの起動/停止/再起動 #
デフォルトでは、作成したポッドはrunning
状態ではないので起動する必要があります。次の各コマンドでは、PODはポッド名またはポッドIDです。
ポッドを起動するには次のコマンドを実行します。
#
podman pod start[OPTIONS]POD
使用できるすべてのオプションを表示するには次のコマンドを実行します。
#
podman pod start --help
ポッドを停止するには、次のようにpodman pod stop
を使用します。
#
podman pod stopPOD
ポッドを再起動するには、次のようにpodman pod restart
コマンドを使用します。
#
podman pod restartPOD
5.4 ポッドでのコンテナの管理 #
ポッドに新しいコンテナを追加するには、オプション--pod
を指定してpodman run
コマンドを使用します。コマンドの一般的な構文は次のとおりです。
#
podman run[OPTIONS] --pod POD_NAME IMAGE
podman run
コマンドの詳細については4.1項 「コンテナの実行」を参照してください。
コンテナを最初に実行したときにポッドに追加していなかったコンテナは、現在ポッドにあってもpodman start
コマンドでは起動できません。
コンテナをポッドから削除し、コンテナを実行したままにすることはできません。コンテナそのものがホストから削除されるためです。
起動、再起動、停止などの他のアクションは、ポッドのステータスに影響を及ぼすことなく、特定のコンテナで実行できます。
5.5 ポッドでのプロセスの監視 #
すべてのポッドにあるすべてのコンテナを表示するには次のコマンドを使用します。
#
podman ps -a --pod
このコマンドの出力は次のようになります。
CONTAINER ID IMAGE COMMAND CREATED STATUS [...] 4324f40c9651 k8s.gcr.io/pause:3.2 21 hours ago Created daa5732ecd02 k8s.gcr.io/pause:3.2 22 hours ago Up 3 hours ago e5c8e360c54b localhost/test:latest /bin/bash 3 days ago Exited (137) 3 days ago 82dad15828f7 localhost/opensuse/toolbox /bin/bash 3 days ago Exited (137) 3 days ago 1a23da456b6f docker.io/i386/ubuntu /bin/bash 4 days ago Exited (0) 6 hours ago df890193f651 localhost/opensuse/toolbox /bin/bash 4 days ago Created
最初の2つのレコードは各ポッドのINFRA
コンテナでありk8s.gcr.io/pause:3.2
イメージに基づいています。出力に示された他のコンテナは、どのポッドにも属していないスタンドアロンコンテナです。
5.6 ポッドの削除 #
ポッドは2種類の方法で削除できます。podman pod
rm
コマンドを使用すると、1つまたは複数のポッドを削除できます。podman pod prune
コマンドを使用すると、停止しているすべてのポッドを削除できます。
1つまたは複数のポッドを削除するには、次のようにpodman pod
rm
コマンドを実行します。
#
podman pod rmPOD
PODにはポッド名またはポッドIDを指定できます。
現在停止しているすべてのポッドを削除するにはpodman pod
prune
コマンドを使用します。podman pod prune
コマンドを実行する前に、停止しているすべてのポッドが削除対象であることを確認します。この確認を怠ると、まだ使用中のポッドが削除されることがあります。
6 法的事項 #
Copyright © 2006–2024 SUSE LLC and contributors. All rights reserved.
この文書は、GNUフリー文書ライセンスのバージョン1.2または(オプションとして)バージョン1.3の条項に従って、複製、頒布、および/または改変が許可されています。ただし、この著作権表示およびライセンスは変更せずに記載すること。ライセンスバージョン1.2のコピーは、「GNUフリー文書ライセンス」セクションに含まれています。
SUSEの商標については、https://www.suse.com/company/legal/を参照してください。その他の第三者のすべての商標は、各社の所有に帰属します。商標記号(®、™など)は、SUSEおよび関連会社の商標を示します。アスタリスク(*)は、第三者の商標を示します。
本書のすべての情報は、細心の注意を払って編集されています。しかし、このことは正確性を完全に保証するものではありません。SUSE LLC、その関係者、著者、翻訳者のいずれも誤りまたはその結果に対して一切責任を負いかねます。