目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / Podmanを使用した基本的なコンテナ管理

Podmanを使用した基本的なコンテナ管理

発行日: 12/11/2024
概要

コンテナは、単一のホスト上で複数の仮想環境(コンテナ)を同時に実行するための軽量な仮想化方法を提供します。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がない場合は、次の説明に従ってインストールできます。

  1. 次のコマンドを実行します。

    > sudo transactional-update pkg install podman*
  2. システムを再起動して、新しいスナップショットで起動します。

3 コンテナイメージの取得

コンテナを実行するにはイメージが必要です。イメージは、アプリケーションの実行に必要な依存関係をすべて収めています。イメージレジストリからイメージを取得できます。使用可能なレジストリは/etc/containers/registries.conf設定ファイルで定義されています。ローカルのイメージレジストリがある場合や他のレジストリを使用する場合は、そのレジストリをこの設定ファイルに追加します。

重要
重要: SLE Microにイメージを構築するためのツールがない

SLE Microではカスタムイメージを構築するためのツールが提供されていません。したがって、イメージを取得するには、イメージレジストリから取得する以外にありません。

注記
注記: openSUSEレジストリとDocker Hubはデフォルトで有効になっていない

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を使用したイメージの取得

Cockpitを使用している場合は、+新規イメージの取得をクリックして、Podmanコンテナメニューでイメージレジストリからイメージを取得することもできます。

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コマンドを実行する前に、停止しているすべてのポッドが削除対象であることを確認します。この確認を怠ると、まだ使用中のポッドが削除されることがあります。