Podmanの運用・保守で、よく使うコマンドをコピペできるように。
Podmanのコマンドを、さらっとまとめて置きたいと思います。
ポッドの作り直しでよく使うものや。
バックアップ関係と、ボリューム操作関係は、マイグレーションで必要でして。
自分用で申し訳ありませんが。(説明が不足している事や、知識・認識不足の謝罪
※22.11.13追記:イメージ検索、マシン初期化、ボリュームのマウント関連コマンドを追記しました。運用・保守系コマンドに記事名を変えました。
目次
ポッドやコンテナの作成
最初にポッドをcreateで作成。その際、公開するポート番号を指定しておきます。
その後、必要なコンテナを、–pod=オプションでポッドに紐づけてrunで実行する流れが基本のようです。
次のスクリプトはWordPressの起動例になります。
オプション指定の順番は、個人的に見やすい順番にしています。(悩んだ挙げ句
–pod、–nameを最初に指定。その後-eの環境変数を並べて。最後に-dでデーモン化と使用するイメージのリポジトリ名とタグ名になります。個人的な好みです。
タグの探し方は、次のイメージ検索のコマンドで探せます。
rem WordPress用ポッド作成 Windowsコマンド版
podman pod create --name wp-pod -p 8080:80/tcp
rem Mariadbコンテナ作成
podman run --restart=always ^
--pod=wp-pod ^
--name=wp-db ^
-e MYSQL_ROOT_PASSWORD="myrootpass" ^
-e MYSQL_DATABASE="wp" ^
-e MYSQL_USER="wordpress" ^
-e MYSQL_PASSWORD="w0rdpr3ss" ^
-d docker.io/library/mariadb:latest
rem WordPressコンテナ作成
podman run --restart=always ^
--pod=wp-pod ^
--name=wp-web ^
-e WORDPRESS_DB_NAME="wp" ^
-e WORDPRESS_DB_USER="wordpress" ^
-e WORDPRESS_DB_PASSWORD="w0rdpr3ss" ^
-e WORDPRESS_DB_HOST="127.0.0.1" ^
-d docker.io/library/wordpress:latest
他のポッドやコンテナの作成は、こちらの記事を御覧ください。
イメージ検索
古いバージョンや実装違いのイメージを探したいとき、タグ表示は必須です。
公式やスター付きも探せます。
dockerコマンドと比較したことはありませんが、docker.ioに加えて、quay.ioやRedHat関連のレジストリからイメージを探すことが可能です。
ちなみにquayは波止場や埠頭という意味だそうです(ビーン
rem たとえばnextcloudイメージを探したいとき
podman search nextcloud
rem 詳細欄をすべて表示
podman search --no-trunc nextcloud
rem 公式のNextcloudイメージを探したい場合
podman search --filter=is-official nextcloud
rem 点数(星、スター)、オフィシャルかどうか、互換性も表示
podman search --compatible nextcloud
rem タグ表示
podman search --list-tags nextcloud
詳細はこちらの記事になります。
ポッドの全削除
新たにポッドとコンテナを作り直す場合に使用します。
rem コンテナ全削除
podman container stop --all
podman container rm --all
rem ポッドの全削除
podman pod stop --all
podman pod rm --all
イメージは残りますので、ダウンロード・ビルドしたイメージで即時にコンテナが作成できます。
ポッドを作り直した場合の、コンテナ内のデータですが。
名前付きボリュームが残っていれば、コンテナにマウントすることでデータを復元することが可能です。
匿名ボリュームは消える場合があるため、データを書き戻す必要があります。
マシンの再初期化
基本的にマシンは1つですし、マシンを停止する理由はあまりありません。
sshでコンソールに接続して、Linuxのシェルを使えるのは少し便利です。
rem コンソール
podman machine ssh
rem マシン一覧
podman machine ls
rem マシン停止
podman machine stop
rem マシン起動
podman machine start
一方、コンテナやポッドにエラーが発生した場合、マシンを初期化して直る場合があります。
以下、そのコマンドになります。
rem マシン停止
podman machine stop
rem マシン削除
podman machine rm
rem WSL2シャットダウン
wsl --shutdown
rem WSLベアメタル削除
wsl --list
wsl --unregister podman-machine-default
wsl --list
rem マシン再構築
podman machine init
rem マシン起動
podman machine start
Windows版Podmanの環境再構築について、詳細はこちらになります。
ログ表示
ポッドまたはコンテナのログ表示です。トラブル時は必ず見ます。
ポッドのログの統合表示のほうは、うまく表示されない場合がありますので、コンテナごと表示が基本かもしれません。
ポッド名、コンテナ名の部分は変更してから実行して下さい。
rem ポッドのリアルタイムログ表示
podman pod logs -f nc-pod
rem コンテナのリアルタイムログ表示
podman container logs -f nc-web
ポッドとコンテナの名前の付け方の例はこちらの記事になります。
シェル実行
コンテナ名は適宜変更して下さい。
rem コンテナでシェル実行
podman exec -it nc-web bash
execを使う場合、ボリュームは予めコンテナ起動時にマウントしておく必要があると思います。
よって、別のボリュームにアクセスしたい場合は、runコマンドで別のコンテナを作成します。
ボリュームをマウントした操作
匿名ボリュームのデータをバックアップ・リストアしたり。
名前付きボリュームを作成し、コンテナ起動前に予めデータを入れておいたり。
そのような場合、コマンドをコピペしてちょこちょこ変更して使う感じです。
下記のコマンドは–rmオプションで、都度コンテナを消しています。
複雑な操作をしたい場合は、コンテナを消さず、execで作ったコンテナにアクセスしたほうが良いかもしれません。
rem 匿名ボリューム
rem 別コンテナのマウント先の一覧表示
podman run --rm --volumes-from sv1-pgsql -v .:/backup fedora ls -al /var/lib/postgresql/data
rem 別コンテナのボリュームのバックアップ
rem バックアップ前にコンテナを停止したほうが良さそうです
podman run --rm --volumes-from sv1-pgsql -v .:/backup fedora tar zcvf /backup/pgsql.tar.gz /var/lib/postgresql/data
rem 別コンテナのボリュームのリストア
podman run --rm --volumes-from sv1-pgsql -v .:/backup fedora bash -c "cd / && tar zxvf
rem 名前付きボリューム
rem 名前付きボリュームのマウント先の一覧表示
podman run --rm -v sv1-pgsql-vol:/var/lib/postgresql/data -v .:/backup fedora ls -al /var/lib/postgresql/data
同じディレクトリ(例えば/data/db)のデータを、匿名ボリュームから名前付きボリュームに直接コピーってできるのでしょうか?私には方法がわかりません。
よって、ディレクトリ1つについて、必ず1つのコンテナに1つのボリュームをマウントして操作する必要があると思います。
具体的には、いちどtar.gzファイル等にアーカイブしてから、別のボリュームをマウントして展開する必要があるように思えます。
ボリューム操作の具体的な例はこちらです。
ポッド一覧表示・削除
複数のポッドを同時に運用する場合、stopやstart、rm等はポッド名を指定して実行し、他のポッドの影響が出ないようにします。
rem ポッド一覧
podman pod ls
rem ポッド全停止
podman pod stop --all
rem ポッド全削除 停止してから実行
podman pod rm --all
rem ポッド強制全削除
podman pod rm --force --all
コンテナ一覧表示・削除
コンテナ一覧は、-aオプションを付けないと、止まっているコンテンが表示されないのですね。最近気づきました。
というわけで、コンテナ一覧は-aオプション必須だと思います。
コンテナのstop、startとrmにつきましても、本格的に運用する場合は、コンテナ名を並べて指定する必要があると思います。
rem コンテナ一覧
rem 停止しているコンテナ表示は-aオプションが必要
podman container ls -a
rem コンテナ全停止
podman container stop --all
rem コンテナ全削除
podman container rm --all
rem コンテナ強制全削除
podman container rm --force --all
rem 動いてないコンテナをお掃除
podman container prune
イメージ一覧表示・削除
rem イメージ一覧
podman image ls
rem 使用していないイメージをお掃除
podman image prune
rem イメージ全削除
podman image rm --all
rem イメージ強制全削除
podman image rm --force --all
私は独自のイメージを作った事はあまりありませんので、ダウンロードさせて頂いている状況です。
イメージの作者の皆様ありがとうございます!
イメージをビルドする例はこちらの記事になります。
ボリューム一覧表示・削除
rem イメージ一覧
podman volume ls
rem 不要なボリューム削除
podman volume prune
rem ボリューム全削除
podman volume rm --all
ボリュームは、コンテナからマウントされていて、データが入っている大切な領域かと思いますが。
直接コマンドで操作することはあまりないと思います。
コンテナを消しても、ボリュームが残っていると、コンテナの内容は維持されると思います。主にデータを永続化する目的と、コンテナ間でデータを共有する目的で使用されます。
ボリュームの中のデータをバックアップする場合、コンテナ経由で行うため、ボリュームを直接操作する必要は無さそうです。
匿名ボリュームは、コンテナ起動時に自動的に作成されます。
名前付きボリュームは、明示的に消さなければ消えませんので、ポッドを作り直す場合にデータを持ち越す事が可能です。ポッドを頻繁に作り直したい場合、名前付きボリュームのほうが便利かもしれません。
WSL2のポートフォワード
Windows版の場合、ポッド起動後にポートフォワードを有効にすることで、他のPCからサービスへアクセス可能となります。
※22.11.25修正:IPアドレスを取り出す構文に不具合がありましたので修正しました。不具合の内容:IPアドレスが0で終わる場合、正しく取り出せませんでした。構文に\.を追加しました。
※22.12.8追記:ファイアウォールのルールが無限に追加されてしまうため、ルールが存在するか判定するIF文を追加しました。
rem podmanマシン起動
podman machine start
rem podmanマシンのIPアドレス取得
FOR /F %%i in ('podman.exe machine ssh "cat /proc/net/fib_trie | sed -e 's/^[ \-\|\+]*[ \-]*//' | grep '[\d]*\.' |grep -v -e '0.0.0.0' -e '^127\.[\d]*' -e '\/' -e '\.0$' -e '\.255$'"') DO set IPADR=%%i
rem ポッド起動
set pod=wp-pod
podman pod start %pod%
rem ポートフォワード
set PTNB=8080
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=%PTNB% connectaddress=%IPADR% connectport=%PTNB%
rem 受信ルール
netsh advfirewall firewall show rule name= "TCP %PTNB%" dir=in
IF %ERRORLEVEL% GEQ 1 (
netsh advfirewall firewall add rule name= "TCP %PTNB%" dir=in action=allow protocol=TCP localport=%PTNB%
)
rem 送信ルール
netsh advfirewall firewall show rule name= "TCP %PTNB%" dir=out
IF %ERRORLEVEL% GEQ 1 (
netsh advfirewall firewall add rule name= "TCP %PTNB%" dir=out action=allow protocol=TCP localport=%PTNB%
)
こちらの記事になります。
ポッドのバックアップ・リストア
ポッドとコンテナを作成するためのyamlファイルのほか、イメージ、コンテナ内のボリューム、そしてボリューム以外のデータ等をバックアップしておけば大丈夫かなと思います。
rem wp-podのバックアップ
rem イメージをバックアップ
podman image save -o wordpress-image.tar docker.io/library/wordpress:latest
podman image save -o mariadb-image.tar docker.io/library/mariadb:latest
rem ポッドとコンテナ設定yamlの生成
podman generate kube wp-pod > wp-pod.yaml
rem コンテナのイメージ化と保存
podman container commit wp-web wp-web-image
podman image save -o wp-web-image.tar wp-web-image
podman container commit wp-db wp-db-image
podman image save -o wp-db-image.tar wp-db-image
podman container export --output="wp-db.tar" wp-db
rem wp-podポッドのボリュームバックアップ
podman container stop wp-web wp-db
podman run --rm --volumes-from wp-web -v .:/backup fedora tar zcvf /backup/html.tar.gz /var/www/html
podman run --rm --volumes-from wp-db -v .:/backup fedora tar zcvf /backup/mysql.tar.gz /var/lib/mysql
podman container start wp-web wp-db
※22.11.20追記:データベースコンテナのボリュームをバックアップしていますが、これはリストアできるものではありませんのでご注意下さい。データベースは別途、データをダンプする必要が御座います。
こちらの別記事を御覧ください。
デバッグログオプション
–log-level=debug オプションを付けてコマンドを実行します。
動きが怪しい時、想定した正しい動作をしているかどうか、確認のために使用する感じでしょうか。
rem オプション追加 --log-level=debug
rem 詳細なログ付きで 日本語版PostgreSQLイメージ作成
podman image build --log-level=debug -f Containerfile.txt -t postgres_ja
何か設定が間違っていたりする場合、ヒントが得られるかもしれません。
まあ、完璧に、自分が使うコピペ用の記事でした。
ええ?Podman Desktop使うから、要らないですって?
実際に運用中、何か有意なコマンドがありましたら、また書き足そうと思います。