3 イメージ、コンテナおよびポッドの操作
Podmanは、コンテナの実行やコンテナの作成に使用するイメージの取得のために、Oracle Container Runtime for Dockerと同じ方法で使用できます。次の情報では、レジストリからローカルのイメージ記憶域にコンテナ・イメージをプルする方法、ローカル記憶域のコンテナ・イメージを管理する方法、そのイメージに基づいてコンテナを実行する方法、ホスト・システムで作成したコンテナを管理する方法について説明します。
多くの場面で、PodmanはOracle Container Runtime for Dockerのドロップイン置換として使用できます。Podmanは、Open Container Initiative (OCI)仕様に準拠したイメージを使用して、そのイメージに基づいてコンテナを実行できます。ほとんどのPodmanコマンドは、Docker CLIで使用可能な同等のコマンドに直接対応付けられています。
PodmanとDockerの主な違いは、Docker Engineはサービスとしてホストで実行され、そのサービスですべてのアクションが実行されますが、Podmanはスタンドアロン・ランタイムとして各操作が独立するように実行されることです。この相違点は、イメージとコンテナの操作に関するセキュリティ・モデルが変化するため重要です。
Podmanの操作はシステムの特定のユーザーとして実行しているサービス・デーモンに依存しないため、Dockerよりも高度な分離が実現されます。つまり、Podmanを標準ユーザーとして実行することも、rootユーザーとして実行することもできます。
Podmanは、ユーザー・ネームスペースを優先します。つまり、単一のホスト上の複数のユーザーが、競合が発生する可能性を心配せずにそれぞれに独自のコンテナとローカル・イメージ・ストアを実行できるということです。ユーザーのネームスペース内で実行中のコンテナは、ホスト・システム上のユーザーが使用できる権限に制限されるため、PodmanはDockerよりも多くのセキュリティを提供すると考えられています。
標準ユーザーとしてPodmanを実行するときには、rootユーザーとしてPodmanを実行するのではなく、いくつかの重要な違いがあります。このような違いは、ユーザー・タイプごとに使用可能な権限に基づきます。たとえば、標準ユーザーとしてPodmanを実行しているときにはネットワーク機能が制限されます。このモードでは、ほとんどのネットワーク操作がポート・マッピングとポート転送のみを使用して実現されます。これは、rootユーザーとしてPodmanを実行するようにお薦めしているわけではありません。標準ユーザーとして作業する場合には、いくつかの制限が適用される可能性があるということです。ある程度は、標準ユーザーの場合に発生する多くの問題は、ポッド内でコンテナのグループを実行することで軽減できます。ネットワークおよびPodmanの詳細は、「Podman用ネットワークの構成」を参照してください。ポッドの詳細は、「ポッドの管理」を参照してください。
一般に、ここに示した手順は、標準ユーザーとしてPodmanを実行しているか、rootユーザーとしてPodmanを実行しているかに関係なく同様に適用されます。
Podmanを使用したコマンドの実行
インストールしたバージョンのPodmanで使用可能なコマンドのリストは、podman -h
コマンドを使用して確認できます。たとえば、そのリストには次のコマンドが含まれている可能性があります。
- attach
-
実行中のコンテナのシェルにアタッチします
- auto-update
-
自動更新を有効にしてコンテナを自動更新します
- build
-
Containerfileからイメージを構築します
- commit
-
編集済コンテナに基づいてイメージを作成します
- container
-
既存のコンテナを管理します
- cp
-
コンテナとホスト・ファイル・システムの間でファイルおよびフォルダをコピーします
- create
-
コンテナを作成しますが開始しません
- diff
-
コンテナのファイル・システムに対する変更内容を表示します
- events
-
実行中のコンテナのPodmanイベント・ログを表示します
- exec
-
指定した実行中のコンテナでプロセスを実行します
- export
-
コンテナのファイル・システムとコンテンツを圧縮アーカイブにエクスポートします
- generate
-
systemdユニット・ファイルとポッドYAMLファイルを生成します
- healthcheck
-
既存のコンテナにヘルスチェックを実行します
- history
-
指定したイメージの履歴を確認します
- image
-
既存のイメージを管理します
- images
-
ホスト・システムに存在するイメージをリスト表示します
- import
-
コンテナ・ファイル・システムを作成するための圧縮アーカイブをインポートします
- info
-
Podmanのシステム情報を表示します
- init
-
1つ以上のコンテナを初期化します
- inspect
-
コンテナまたはイメージの既存の構成値を表示します
- kill
-
事前定義されたシグナルで実行中のコンテナを停止します
- load
-
コンテナ・アーカイブ・ファイルからイメージをロードします
- login
-
コンテナ・レジストリにログインします
- logout
-
コンテナ・レジストリからログアウトします
- logs
-
コンテナのログを確認します
- manifest
-
マニフェストのリストとイメージの索引を作成および編集します
- mount
-
実行中のコンテナのrootファイル・システムをマウントします
- network
-
コンテナにアクセスできるネットワークを管理します
- pause
-
1つ以上のコンテナのすべてのプロセスを一時停止します
- play
-
ポッドを開始します
- pod
-
ポッドを作成および管理します
- port
-
コンテナのネットワーク・ポート・マッピングをリスト表示します
- ps
-
コンテナをリスト表示します
- pull
-
コンテナ・レジストリからイメージをプルします
- push
-
コンテナ・レジストリにイメージをプッシュします
- restart
-
1つ以上のコンテナを再開します
- rm
-
1つ以上のコンテナを削除します
- rmi
-
ホスト・システムのローカル記憶域から1つ以上のイメージを削除します
- run
-
新しいコンテナで1つのコマンドを実行します
- save
-
圧縮アーカイブにイメージを保存します
- search
-
コンテナ・レジストリからイメージを検索します
- start
-
1つ以上のコンテナを開始します
- stats
-
コンテナのリソース使用状況統計のリアルタイム・ストリームを表示します
- stop
-
1つ以上のコンテナを停止します
- system
-
Podman構成の設定を管理します
- tag
-
ホスト・システムのローカル記憶域内のイメージに別の名前を追加します
- top
-
コンテナの実行中プロセスを表示します
- unmount
-
実行中のコンテナのrootファイル・システムをアンマウントします
- unpause
-
1つ以上のコンテナのすべてのプロセスを再開します
- unshare
-
指定のユーザーとしてコマンドを実行します
- untag
-
ホスト・システムのローカル記憶域内のイメージからセカンダリ名を削除します
- version
-
Podmanのバージョン情報を表示します
- volume
-
コンテナ記憶域ボリュームを管理します
- wait
-
指定の条件が満たされるまで、1つ以上のコンテナでプロセスをブロックします
このリストに示した各コマンドは、podman-command(1)
というパターンに従うマニュアル・ページにリンクされています。たとえば、attach
コマンドに関する情報を取得する場合は、podman-attach(1)
マニュアル・ページを参照してください。Podmanで使用可能なすべてのドキュメントの完全なリストは、podman(1)
マニュアル・ページを参照してください。
コンテナ・イメージの操作
コンテナ・イメージとは、コンテナの生成に使用する読取り専用テンプレートのことです。このイメージには、サービスまたはアプリケーションの実行に必要なすべての要件が含まれています。イメージのスコープは、限定的に設定できます。たとえば、Webサーバー・アプリケーションなどの単一のサービスをホストするように設定できます。また、イメージは基本的なOS環境(最小限のOracle Linuxリリースなど)を十分に含められる広範囲なものにすることもできます。
イメージは、同じイメージの異なるバージョンを識別できるようにタグ付けできます。多くの場合、Podmanユーザーがイメージの最新バージョンを簡単に識別できるように、イメージにはデフォルトのタグlatest
が含まれることがあります。Oracle Linuxイメージではlatest
タグを使用しないことに注意してください。詳細は、「Oracle Linuxコンテナ・イメージのタグ付け規則」を参照してください。
多くの場合、イメージはコンテナ・レジストリでホストされます。Podmanのインスタンスは特定のイメージ・バージョンを取得するために、このレジストリにHTTP/Sでアクセスできます。レジストリの詳細は、「コンテナ・レジストリの使用」を参照してください。
場合によっては、既存のイメージの変更や独自のイメージの作成が必要になることがあります。これは、Buildahユーティリティを使用して実行できます。詳細は、「Buildahを使用したイメージの構築」を参照してください。
使用可能なレジストリ内のイメージの検索
構成済レジストリからイメージを検索するには、次のようにpodman searchコマンドを使用します。
podman search oraclelinux
Podmanで使用するためにコンテナ・レジストリを構成する方法の詳細は、「コンテナ・レジストリの使用」を参照してください
レジストリからのイメージのプル
イメージが見つかったら、podman pullコマンドを使用してイメージのコピーをダウンロードします。イメージをプルするときには、次のようにしてイメージ参照を指定します。
podman pull registry.host/repository/imagename:tag
-
registry.hostは、イメージがホストされているレジストリの解決可能なホスト名です。通常、レジストリ・ホストは必須ですが、すでにpodman構成内でレジストリがリストされている場合は、この値を指定する必要はありません。
-
repositoryはオプションで、イメージの格納方法とレジストリへの格納方法によって異なります。
-
ダウンロードするイメージを指定する場合は、imagenameが必須です。
-
イメージのバージョンを表すtagは常に指定する必要があります。多くのツールは、タグが指定されていない場合にデフォルトで
latest
タグを使用しますが、これはエラーにつながることがあり、現在は不適切な方法とみなされています。タグの詳細とlatest
タグが信頼できない理由は、「Oracle Linuxコンテナ・イメージのタグ付け規則」を参照してください。
次の例は、Oracle Container RegistryからOracle Linux 7のslimイメージをプルする方法を示しています。
podman pull container-registry.oracle.com/os/oraclelinux:7-slim
Trying to pull container-registry.oracle.com/os/oraclelinux:7-slim...
Getting image source signatures
Copying blob 50ab38810635 done
Copying config d788eca028 done
Writing manifest to image destination
Storing signatures
d788eca028a0f49b6bc70b251c8535b16ee5bd94e0ab375ca8f3a923e6ce4281
Oracle Container RegistryはデフォルトでPodman用に構成されているため、このコマンドは次のように指定しても同じになります。
podman pull os/oraclelinux:7-slim
一般的に使用される一部のイメージ名のレジストリおよびリポジトリへのショートカットは、/etc/containers/registries.conf.d/000-shortnames.conf
に格納されます。次のショートカットを使用すると、検索するレジストリまたはリポジトリを知らなくても簡単にイメージをプルできます。次に例を示します。
podman pull oraclelinux:7-slim
イメージは、ローカルのコンテナ・イメージ・ストアにダウンロードされます。この記憶域の詳細は、「Podman用記憶域の構成」を参照してください。
イメージの調査
ダウンロードの完了後に次のコマンドを実行すると、コンテナ・イメージのデフォルトの構成設定とメタデータを確認できます。
podman inspect container-registry.oracle.com/os/oraclelinux:7-slim
[
{
"Id": "6a34bf5396690a3c0ea1d6914f32fae9860bca03c68e7253cfd6d5d11551e2d2",
"Digest": "sha256:e63584e0060861cd5301a9fc924b087f32ba28c380126b32ed4874d52bf02051",
"RepoTags": [
"container-registry.oracle.com/os/oraclelinux:7-slim"
],
"RepoDigests": [
"container-registry.oracle.com/os/oraclelinux@sha256:d7ae060ba190...690de5aa442b8ff8ce46d53895",
"container-registry.oracle.com/os/oraclelinux@sha256:e63584e00608...32ba226b32ed4874d52bf02051"
],
"Parent": "",
"Comment": "",
"Created": "2022-08-24T19:35:43.028869456Z",
"Config": {
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
]
},
"Version": "20.10.12",
"Author": "",
"Architecture": "amd64",
"Os": "linux",
"Size": 139573259,
"VirtualSize": 139573259,
"GraphDriver": {
"Name": "overlay",
"Data": {
"UpperDir": "/home/opc/.local/share/containers/storage/overlay/bcf2a1ad6472a891de95b...5fb/diff",
"WorkDir": "/home/opc/.local/share/containers/storage/overlay/bcf2a1ad6472a891de95b5...5fb/work"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:bcf2a1ad6472a891de95b5132d013c064a07ec9995cb61b0cc0f8d4a4ea855fb"
]
},
"Labels": null,
"Annotations": {},
"ManifestType": "application/vnd.docker.distribution.manifest.v2+json",
"User": "",
"History": [
{
"created": "2022-08-24T19:35:42.419825447Z",
"created_by": "/bin/sh -c #(nop) ADD file:adf7ebc1d65494dba22f4f...d6e9964f936343e6d in / "
},
{
"created": "2022-08-24T19:35:43.028869456Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/bin/bash\"]",
"empty_layer": true
}
],
"NamesHistory": [
"container-registry.oracle.com/os/oraclelinux:7-slim"
]
}
]
コンテナの管理
コンテナは、実行しているイメージのインスタンスです。各コンテナは開始点としてイメージを使用し、作成時または実行時に指定されたパラメータを使用してランタイムにイメージをロードします。
コンテナはネームスペースを共有し、相互の通信およびホスト・システムとの通信のために共有ポート・マッピングにアクセスできます。Podmanは、ポッドの概念をランタイム環境に導入しています。ポッドを使用するとコンテナのグループを分離できるため、論理アプリケーションをプロビジョニングするために連携する一連のサービスを簡単に管理できます。詳細は、「ポッドの管理」を参照してください。
コンテナの作成
既存のイメージからコンテナを作成する場合は、podman createコマンドを使用できます。
podman create -d --name oracle oraclelinux:7-slim
まだローカル・システムにイメージが存在していない場合、Podmanはリモート・レジストリから一致するイメージを検索して、そのイメージを自動的にプルします。
コンテナの作成時には、特定のポッドに属するようにするかどうか、特定のネットワークまたはポート・マッピングを使用する必要があるかどうかなどのオプションも指定できます。詳細は、podman help createを実行してください。豊富なオプションは、コンテナに多様なランタイム機能を適用するために使用できます。
コンテナの実行
podman runコマンドに--rmを指定して使用することで、プロビジョニングされたコンテナで単一のコマンドを実行して単一のステップで破棄します。
podman run --rm oraclelinux:7-slim cat /etc/oracle-release
Oracle Linux Server release 7.9
また、-itフラグを使用すると、単一のステップでコンテナを作成して接続することもできます。-iフラグはコンテナを対話型にし、-tフラグはローカル・ターミナルをコンテナに接続します。このフラグの組合せは、一般にpodman runコマンドの一部として指定したシェルを実行するときに同時に使用します。
podman run --name=oracleshell -it oraclelinux:7-slim /bin/bash
[root@dcbe94cd0301 /]#
コンテナは、exitと入力して切断すると、その直後に停止します。コンテナを再開して再接続するには、podmand startコマンドを実行します。
podman start -ai oracleshell
また、-dフラグを含めることで、バックグラウンド・デーモンとして継続的に実行するPodmanコンテナを作成することもできます。次に例を示します。
podman run -d --name=oracledaemon oraclelinux:7-slim /bin/bash -c 'yum install -y httpd && httpd -Dforeground'
まだ存在していないコンテナを実行すると、自動的にコンテナが作成されます。コンテナが使用するイメージがローカルでは使用できない場合、Podmanはリモート・レジストリから一致するイメージを検索して、そのイメージを自動的にプルします。
ノート:
コンテナがプライマリ・プロセス(PID 1)としてシェルを実行し、それをデタッチする場合は、--stop-signal=SIGHUP
コマンド・オプションを指定して実行し、コンテナを停止したときにシェルが正常に停止されるようにします。次に例を示します。
podman run --stop-signal SIGHUP --name myol9 oraclelinux:9
多くのシェルが、コンテナを停止するときにデフォルトのSIGTERMシグナルを無視します。正しい停止シグナルが使用されていない場合、コンテナの停止時に、コンテナは次のエラーを返すことがあります。
WARN[0010] StopSignal SIGTERM failed to stop container myol9 in 10 seconds, resorting to SIGKILL
コンテナでのFIPSモードの有効化
コンテナをFIPSモードで実行するには、まずOracle Linuxホスト・システムでFIPSモードを有効にする必要があります。
インストール可能なFIPS検証済暗号化モジュールがあるOracle Linux 8のリリースの詳細は、『Oracle Linux 8: システム・セキュリティの強化』を参照してください。Oracle Linux 9でのFIPSの詳細は、『Oracle Linux 9: Oracle Linux 9 FIPSモードのインストールおよび構成』を参照してください。
ノート:
Oracleは、slim-fips
タグを使用してFIPS準拠のコンテナ・イメージを提供します。FIPS準拠のタグが付いたコンテナ・イメージには、準拠した暗号化パッケージ・バージョンおよびコンテナFIPSモードに必要な初期イメージ設定が含まれています。これらのイメージを使用する場合、FIPSモードのコンテナを構成するために追加のステップを実行する必要はありません。詳細は、「slimタグ」を参照してください。
Oracle Linux 7コンテナの場合:
Oracle Linux 7コンテナでFIPSモードを有効にするには、dracut-fips
パッケージをインストールするか、/etc/system-fips
をホストからマウントします。Podmanコンテナ内にホスト・ファイルおよびディレクトリをマウントする方法の詳細は、「コンテナ・マウントの設定」を参照してください。
Oracle Linux 8およびOracle Linux 9コンテナの場合:
Oracle Linux 8またはOracle Linux 9ホストでFIPSモードを有効にした場合、PodmanはOracle Linux 8またはOracle Linux 9コンテナを自動的にFIPSモードで実行します。
コンテナのリスト表示と監視
実行中のすべてのPodmanコンテナのリストは、podman psコマンドを使用して表示できます。-aフラグを使用することで、停止および一時停止されているコンテナも表示します。
podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a430d30612d container-registry.oracle.com/os/oraclelinux:7-slim /bin/bash -c yum... 20 seconds ago Up 19 seconds ago oracledaemon
dcbe94cd0301 container-registry.oracle.com/os/oraclelinux:7-slim /bin/bash 58 seconds ago Exited (0) 29 seconds ago oracleshell
726d97e9bfbd container-registry.oracle.com/os/oraclelinux:7-slim top 3 days ago Created oracle
すでにアクションを実行したコンテナによって生成されたログを確認するには、podman logsコマンドを使用します。
podman logs oracledaemon
サンプル・コマンドでは、oracledaemonはコンテナのIDまたは名前のいずれかです。
実行中のコンテナのハードウェア・リソース使用状況統計を確認するには、podman statsコマンドを使用します。
podman stats oracledaemon
ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS
c4e296d0c78e oracledaemon 4.25% 33.33MB / 29.22GB 0.11% 2.412kB / 1.536kB -- / -- 3
ポッドの管理
Podmanは、コンテナ・ランタイムのコンテキストでポッドの概念を導入しています。この概念はKubernetesから採用したもので、Oracle Container Runtime for Dockerでは使用できません。
ポッドとは、リソースを共有できるように単一のネームスペースにグループ化したコンテナのコレクションのことです。たとえば、コンテナ間の相互通信および相互作用のためにローカル・ネットワークを共有します。ポッドを使用すると、完全なアプリケーションをデプロイするために必要な一連のサービスをグループ化できます。
多くの点で、ポッドは各コンテナ内のサービスが実行される仮想ホストと似た動作をします。そのため、各コンテナは同じホストで実行されているかのように、それぞれのコンテナのサービスに相互にアクセスできます。この方法でコンテナを実行すると、ネットワークに関連する複雑さが大幅に解消され、アプリケーション自体のサービスのみが使用するためのポートの外部公開を簡単に制限できるようになります。
最後に、ポッド内でコンテナを実行することで、アトミックな操作を使用してアプリケーション環境全体を簡単に設定および破棄できます。ポッドを使用することで、サービス・ラッパーを作成して、起動時にアプリケーションのコンテナのセットを自動的に開始できます。詳細は、「Podmanサービスの操作」を参照してください。
ポッドの作成と管理
ポッドの概念は、Kubernetesポッドから導出されます。Podmanポッドは、Kubernetes環境で作成およびデプロイできる最小のコンピュート・ユニットです。これらのポッドには、Podmanがポッド内のすべてのコンテナに接続できるように、インフラ・コンテナが含まれています。Podmanは、ポッド自体の操作に干渉することなく、コンテナの停止など、ポッド内のコンテナを管理できます。
ポッドの作成には、podman pod createコマンドを使用します。--nameパラメータを追加して、判読可能な識別子をポッドに指定します。
podman pod create --name oraclepod
ポッド内のサービスが相互に接続するときに特定のホスト名を使用する必要がある場合は、--hostnameオプションも設定できます。
ポッドは、コンテナの初回実行時に自動的に作成することもできます。詳細は、「ポッド内でのコンテナの使用」を参照してください。
使用可能なポッドと実行中のポッドをすべてリスト表示するには、podman pod psコマンドまたはpodman pod listコマンドを使用します。
podman pod list
ポッドを削除するには、rmコマンドを使用します。
podman pod rm oraclepod
ポッドの削除は、ポッド内のすべてのコンテナが、インフラストラクチャ・コンテナを除いて削除されている場合にのみ可能です。デフォルトでは、インフラストラクチャ・コンテナはポッドごとに作成されるため、通常、ポッドにはポッド自体を削除することでのみ削除できる1つ以上のコンテナが含まれます。ポッド内のコンテナを確認する場合は、podman pod inspectコマンドを使用できます。
ポッド内でのコンテナの使用
コンテナをポッドにアタッチするには、コンテナの実行時に--podフラグを使用します。
podman run -d --pod oraclepod nginx:alpine
podman run --pod oraclepod -it --rm oraclelinux:7-slim curl http://localhost:80
前の例では、nginx
イメージを使用するコンテナが実行され、oraclepodという名前のポッドに接続されます。2番目のoraclelinux
イメージを使用するコンテナが開始され、同じポッドに接続されます。2番目のコンテナでcurlコマンドを実行して、ポート80のlocalhost
で実行しているWebサービスにアクセスします。どちらのコンテナも標準ユーザーとして実行していますが、ポート・マッピングを必要とすることなくポッド内の予約済ポートを使用できます。さらに、どちらのコンテナもlocalhost
ネットワーク・ネームスペースを使用でき、同じホストで実行されているかのように相互にアクセスできます。この例では、ポッドを使用することで、異なるコンテナ内で実行中のサービスが複雑なネットワークを必要とせずに相互にアクセスし連携することが容易になる方法を示しています。
まだポッドが存在していない場合は、podman runコマンドに--podオプションを使用して、ポッド名にする判読可能な名前の前にnew:オプションを追加することでポッドを直接作成できます。
podman run -d --pod new:oraclepod nginx:alpine
ホスト上のすべてのコンテナと、コンテナがアタッチされているポッドを、--podまたは-pフラグをpodman ps -aコマンドに含めて確認します。
podman ps -ap
コンテナはポッド全体に影響を与えることなく通常どおりに開始および停止できますが、podman pod startコマンドおよびpodman pod stopコマンドを使用すると、同じポッド内に存在しているすべてのコンテナを同時に開始または停止することもできます。次に例を示します。
podman pod stop oraclepod
podman pod start oraclepod
ポッドの現在のステータスを確認するには、podman pod psコマンドを使用します。
podman pod ps