Podman - コマンド
概要
Podmanコマンドは、Linuxコンテナを管理するためのコマンドラインツールである。
Podmanコマンドを駆使することにより、コンテナの作成、管理、操作等が可能となる。
また、Podmanはルートレスでも動作するため、セキュリティ面でも優れたオプションである。
BuildahやSkopeo等などのOSSツールを使用して、Podmanコンテナを検索、実行、ビルドすることもできる。
PodmanコマンドとDockerコマンドの違い
Podmanは、Dockerのコマンドラインインターフェース (CLI) と高い互換性がある。
多くの場合、dockerをpodmanに置き換えるだけで同じコマンドが機能する。
しかし、いくつかのコマンドやオプションは存在しない、または、動作が異なる場合がある。
これらの違いを除けば、基本的にはDockerとPodmanのコマンドは非常に類似しており、PodmanはDockerのCLIと高い互換性を持つように設計されている。
そのため、DockerからPodmanに移行する時にコマンドの使用方法を大きく変更する必要はほとんどない。
- コンテナとイメージの一覧表示
- Dockerではdocker psとdocker imagesで、それぞれ実行中のコンテナとイメージの一覧を表示する。
- Podmanにおいても、podman psとpodman imagesで同様のことができるが、podman container listやpodman image listもサポートされている。
- ログの取得
- Dockerでコンテナのログを取得する場合、docker logsを使用する。
- Podmanにおいても、podman logsを使用するが、ログの形式や一部のオプションが異なる場合がある。
- ネットワーク関連
- Dockerにはdocker networkコマンドがあり、カスタムネットワークの作成や管理が可能である。
- Podmanではpodman networkコマンドがこれに対応するが、ネットワークの管理方法や利用可能な機能が異なる場合がある。
- デーモン関連
- Dockerはデーモン (dockerd) を使用しているため、docker systemコマンドでデーモンの状態を管理する。
- Podmanはデーモンレスであるため、podman systemコマンドは、主にシステム全体の情報を提供する。
- Docker Compose
- Docker Composeはdocker-composeコマンドを使用してマルチコンテナのアプリケーションを管理する。
- Podmanでは、同様の機能を提供するためにpodman-composeが使用されるが、これも独自のツールであり、完全に同一の機能をサポートしているわけではない。
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/
認証情報は、/run/user/$UID/containers/auth.jsonファイルに保存される。
Docker Hubにログインすることにより、PodmanコマンドでDocker Hubからイメージを検索およびダウンロードすることができる。
イメージの検索
Quay (デフォルト) および他のWebサイト (登録している場合) からイメージを検索およびダウンロードする。
podman search <イメージ名>
イメージのダウンロード
podman pull <イメージ名> # 例: Ubuntuの公式イメージをダウンロード podman pull ubuntu # 例: Docker HubからApache2のイメージをダウンロード podman pull docker.io/httpd:latest
ダウンロードしたイメージの一覧の表示
podman images
イメージの削除
podman image rm <イメージID>
Podmanイメージを全て削除する。
podman image rm -f $(podman images -q)
コンテナの削除
podman container rm <コンテナID>
Podmanコンテナを全て削除する。
podman container rm -f $(podman container ps -a -q)
コンテナの作成
-d
または--detach
- コンテナをバックグラウンドで実行して、コンテナIDを表示する。
-i
または--interactive
- アタッチされていない場合でも、STDINを開く。
-t
または--tty
- コンテナに擬似TTYを割り当てる。
# コンテナを作成して、フォアグラウンドで起動 podman run --name <コンテナ名> <イメージ名> #-d
オプションを付加して、コンテナをバックグラウンドで起動 #-t
オプションを付加して、コンテナに擬似ttyを割り当てる podman run -dt --name <コンテナ名> <イメージ名> # 例: イメージ名はopensuse、コンテナ名はsuse01として起動 podman run -dit --name suse01 opensuse /bin/bash # 例: イメージ名はhttpd、コンテナ名はwwwとして起動 # また、コンテナ内の80番ポートをホスト側の8080番にポートフォワーディングしている podman run -dt -p 8080:80 --name www httpd
コンテナのプロセス確認
# 動作中のコンテナのみ表示 podman ps # 全てのコンテナを表示 podman ps -a または podman ps --all
コンテナの起動
podman start <コンテナ名> または podman start <コンテナID>
停止中のコンテナをインタラクティブに実行することもできる。
-a
オプション- コンテナにアタッチすることを指定する。
- これにより、コンテナの標準入力、標準出力、標準エラー出力がホストのターミナルに接続される。
-i
オプション- インタラクティブモードを有効にする。
- これにより、コンテナの標準入力に対してコマンドを入力できる。
podman start -ai <コンテナ名> または podman start -ai <コンテナID>
コンテナの再起動
podman restart <コンテナ名> または podman restart <コンテナID>
コンテナの停止
コンテナが停止している時は、STATUSでExitedとなる。
podman stop <コンテナ名> または podman stop <コンテナID>
コンテナのログ確認
例えば、コンテナが起動せずに失敗する (exited) する場合、ログを確認する。
podman logs <コンテナID>
コンテナに名前を付ける
podman commit <コンテナID> <任意のコンテナ名>
コマンドの実行
起動中のコンテナにコマンドを実行する。
コンテナ内で追加のタスクを実行したり、シェルを起動する場合等に使用する。
execは複数の異なるコマンドを同時に実行できる。
メインプロセスとは独立して動作して、execで起動したプロセスが終了してもコンテナは継続して実行される。
これは、デバッグやメンテナンス作業に便利である。
podman exec -it <コンテナ名> <コンテナ内で実行可能なコマンド> # 例: コンテナ名 suse01, コマンド /bin/bash を実行する podman exec -it suse01 /bin/bash
コンテナにアタッチ
起動中のコンテナにアタッチする。
(実行中のコンテナのメインプロセスに接続する)
attachは、1つのプロセスにのみ接続できる。
コンテナの標準入力、標準出力、標準エラー出力にアクセスすることができる。
ただし、コンテナのメインプロセスが終了すると、コンテナも停止することに注意する。
一般的に、既に実行中のコンテナの出力を監視、または、対話的に操作する場合等に使用する。
podman attach <コンテナ名> # 例: 標準入力を無効にしてアタッチする # コンテナの出力のみを見る場合に有用である podman attach --no-stdin my_container # 例: デタッチするためのキーの組み合わせを指定する # デフォルトは、[Ctrl] + [P]キー および [Ctrl] + [Q]キーである podman attach --detach-keys="ctrl-d" my_container # 例: 最後に起動したコンテナにアタッチする podman attach --latest
コンテナとホスト間のファイルコピー
ホストからコンテナにファイルをコピーする。
podman cp <ホストのファイルパス> <コンテナ名>:<コンテナ内の保存先のパス> # または podman cp <ホストのファイルパス> <コンテナID>:<コンテナ内の保存先のパス> # 例: podman cp sample.txt my_suse:/tmp # コンテナを実行 podman exec -it my_suse /bin/bash # cd /tmp && lsコマンドを実行してファイルを確認
コンテナからホストにファイルをコピーする。
podman cp <コンテナ名>:<コンテナ内のファイルパス> <ホストの保存先のパス> # または podman cp <コンテナID>:<コンテナ内のファイルパス> <ホストの保存先のパス> # 例: podman cp my_suse:/tmp/sample.txt ~/Downloads
ボリュームのマウント
コンテナにボリュームをマウントする。
-v
オプションの代わりに--mount
オプションを付加することが推奨されている。
--mount
オプションは、キーバリュー形式で各要素が指定できる。
podman container run -it --mount type=<volume, bind, tmpfsのいずれかを指定>,src=<ボリューム名>,dst=<コンテナ内のパス> <コンテナ名/イメージ名:タグ名>
--rm
オプションを付加することにより、匿名ボリュームの場合はコンテナ停止と同時にボリュームも破棄される。
名前付きボリュームの場合は、--rm
オプションを付加しても、ボリュームは破棄されない。
mountオプションで指定できる種類 | 説明 |
---|---|
type | volume 、bind 、tmpfs を指定する。
|
src | source と記述することもできる。匿名ボリュームの場合は、省略する。 名前付きボリュームの場合は、その名前を記述する。 バインドマウントの場合は、ホスト側のディレクトリを指定する。 |
dst | destination 、target と記述することもできる。コンテナ側のディレクトリを指定する。 |
source
または src
は両方とも使用できる。
また、target
、または、dst
は両方とも使用できる。
匿名ボリューム
ホスト側に/var/lib/podman/volumesディレクトリ内 (Podmanが管理する領域) に自動的にボリュームが確保されて、指定したコンテナ内のディレクトリと共有される。
識別のためにハッシュ値 (ランダムなID) が自動的に振られており、同一のネットワークからそのハッシュ値でアクセスすることができる。
ただし、コンテナ削除後もデータは保持されるが、特定が難しい。
podman container run --mount type=volume,dst=<コンテナ側のディレクトリパス 例: /tmp/sample> <コンテナ名/イメージ名:タグ名>
名前付きボリューム
名前付きボリュームは、明示的に名前を付けて管理できる。
これは、複数のコンテナ間でデータ共有が容易であり、コンテナ削除後もデータを容易に特定・再利用可能である。
匿名ボリュームと同様、ホスト側には/var/lib/podman/volumesディレクトリ内に領域が確保されて、指定したコンテナ内のディレクトリと共有される。
ホスト名を指定するため、同一のネットワークからそのホスト名でアクセスすることができる。
podman container run --mount type=volume,src=<ボリューム名>,dst=<ホスト名>:<コンテナ側のディレクトリパス 例: /tmp/sample> <コンテナ名/イメージ名:タグ名>
また、名前付きボリュームは、事前作成することも可能である。
podman volume create <ボリューム名>
バインドマウント
バインドマウントは、ホストの特定のディレクトリやファイルを直接コンテナにマウントする。
バインドマウントを行う場合、ホスト側のパスは絶対パスである必要がある。
また、ホスト側のファイルシステムに直接依存する。
ホスト側のカレントディレクトリ内にある指定したディレクトリとコンテナ側の指定したディレクトリが共有される。
podman container run --mount \ type=bind,src=<ホスト側のディレクトリパス 例: $PWD/host-sample>,dst=<コンテナ側のディレクトリパス 例: /tmp/container-sample> <コンテナ名/イメージ名:タグ名>
ホスト側がSELinuxを使用している場合は、ボリュームのマウントに:Z
オプションを付加する必要がある。
これは、Podmanにボリュームのコンテンツをコンテナ内のラベルと一致するようにラベルを変更するよう指示するものである。
podman run -d --rm -v /<ホスト側のディレクトリのパス 1>/:/<コンテナ側のディレクトリのパス 1>:Z -v /<ホスト側のディレクトリのパス 2>/:/<コンテナ側のディレクトリのパス 2>:Z
また、読み取り専用にすることもできる。
podman container run --mount \ type=bind,src=<ホスト側のディレクトリパス 例: $PWD/hoge>,dst=<コンテナ側のディレクトリパス 例: /tmp/piyo>,readonly <コンテナ名/イメージ名:タグ名>
ボリュームの確認
ボリュームの一覧表示を行う。
podman volume ls
ボリュームの詳細を確認する。
podman volume inspect <ボリューム名>
ボリュームを作成する。
podman volume create <ボリューム名>
ボリュームを削除する。
podman volume rm <ボリューム名>
マウントの使い分け
- 匿名ボリューム
- 一時的なデータ保存
- コンテナ個別のデータ管理
- 名前付きボリューム
- データベース等の永続化が必要なデータ
- 複数コンテナ間でのデータを共有する場合
- バックアップが必要なデータ
- バインドマウント
- 開発環境でのソースコードの共有
- ホスト側の特定ファイルへのアクセスが必要な場合
ボリュームのアンマウント
podman volume umount <ボリューム名>
特定のコンテナにマウントされているボリュームをアンマウントする。
podman volume umount <コンテナID>
ボリュームの削除
podman volume rm <ボリューム名>
使用されていないボリュームを削除する。
podman volume prune
ボリュームを全て削除する。
podman volume rm $(podman volume ls -q)
セキュリティオプション
podman run --security-opt <オプション> -d <イメージ名>
AppArmorプロファイルの作成手順を、以下に示す。
- カスタムAppArmorプロファイルの作成
- AppArmorプロファイルは、任意のプログラムが必要とする全てのファイルアクセス許可を明示的に許可する必要がある。
- プロファイルの保存と読み込み
- 作成したAppArmorプロファイルをホストPCに保存して、AppArmorに読み込ませる。
- 一般的に、/etc/apparmor.dディレクトリにプロファイルを配置して、
apparmor_parser
コマンドでプロファイルを読み込むことで行う。
- Podmanコンテナの起動時にプロファイルを指定する
- コンテナを起動する際に、
--security-opt
オプションを付加して、カスタムAppArmorプロファイルを指定する。 - 例: my_php_fpm_profileという名前のプロファイルを適用する場合
podman run --security-opt apparmor=<AppArmorプロファイル名> -d <イメージ名>
- コンテナを起動する際に、
コンテナのバックアップ
コンテナをイメージ化してバックアップする。
- コンテナを新しいメージとして作成する。
podman commit <コンテナID> <任意のイメージ名>
- 作成したイメージをファイルとして保存する。
podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar
バックアップしたコンテナの復元
podman load -i <バックアップしたファイル名>.tar
正常に復元されているかどうかを確認する。
podman images
Podmanに関するプロセスを全て終了する
pkill
コマンドは、Linuxの基本コマンドであり、プロセスの名前や他の属性に基づいてプロセスを終了するために使用する。
これにより、podmanという名前のプロセス (Podmanが起動しているプロセス) を全て終了することができる。
pkill podman
例えば、問題が発生した場合や特定の操作が必要な場合、全てのPodmanプロセスを終了させる手段として使用されることがある。
ただし、注意が必要であり、実行中のコンテナが強制的に停止される可能性がある点に留意する必要がある。
Podmanのストレージ
コンテナ内で発生したデータは同じコンテナ内のどこかに書き込まれるが、コンテナを破棄すると同時に削除される。
コンテナを破棄してもデータは保存する場合、または、他のコンテナで再利用する場合は、コンテナ外にデータ保存領域を作成する機能を提供している。
- ボリューム
- Podmanの管理下でストレージ領域を確保する。
- ルートレスモードのデフォルトでは、~/.local/share/containersディレクトリである。
- 名前付きボリュームと匿名ボリュームがあり、名前付きの場合はホスト内で名前解決できるため簡単にアクセスすることができる。
- 匿名ボリュームは任意のハッシュ値が振られる。
- 他のプロセスからはアクセスできないため安全に使用できる。
- バインドマウント
- ホスト側のディレクトリをコンテナ内のディレクトリと共有する。
- tmpfs
- メモリ上に一時的なストレージ領域を確保する。
- 使用用途としては、機密性の高い情報を一時的にマウントする場合等がある。
-v
オプション、VOLUME
、volumes
で指定する場合に関しても、基本的には上記のいずれかを扱っている。