Podman Quadlet
Docker Compose や Pod などのようにpodmanコマンドをまとめて systemd unitsで管理できるもの。
systemd start や systemd stop で簡単に自動起動ができるあれ。
kubernetes pod, container, volume, network などの設定が可能、build, image など自動更新っぽいことも可能
systemd で自動起動なんかできたりするのが Composeとの違いか
rootless でも利用可能
kube Play Unit を作ると簡単
旧
podman generate systemd
などを廃止
とりあえず手書き?
自動生成ではなくなっているので自動に近いものはPodかな
pod を作ってcontainer を封入すると Container Quadletを作るより簡単
バージョン
Podman v4.4.0 から利用可能らしい RaspberryPi OSはまだ v4.7.0 からは generate systemd が非推奨でこちらを使うのが主流 か?
何
systemd っぽい設定ファイル
拡張子
.build ビルド用
.container コンテナ用
.kube Kubernetes Pod (Kubernetes YAML)用
.network ネットワーク設定
.volume VOLUME設定
Quadlet の詳細
どこ
/etc/containers/systemd/
/usr/share/containers/systemd/
userless では別の場所
$HOME/.config/containers/systemd/
なんかに置くといい
順番に作ってみる?
簡単なのはKubePlay Unit
Container Unit
$ podman run -d -p 1234:1234 -e aaa=bbb -v /source:/dest image
のコマンドを Quadlet でファイルに記述するには
code:test.container
ContainerName=名
Image=xxxxx
PublishPort=1234:1234
Exec=sh -c "sss"
Pod=test.pod
Environment=aaa=bbb
Network=test.network
Volume=/source:/dest
Restart=always
Image があればいい
ContainerName で名をつける
PublishPort は公開ポート
Exec を付けると podman exec 相当か?
Network 拡張子 .network で指定することもできる
Volumeのsource を .volume の拡張子付きにすればそのファイルのVolumeを参照する
Restart=always 異常終了などで再起動するよ?
Pod Unit
Podを生成するUnit
PodはKubernetesで使える単位で Containerをいくつかまとめておけるもの
podman pod create に相当する機能
$ podman pod create -p 1234:1234 test
コンテナのYAMLファイルがある場合は Pod Unit ではなく Kube Play Unit を使用する
作る場合はPortをPod側で指定して他をコンテナ側で指定する
code:test.pod
PodName=test
Network=host
PublishPort=1234:1234
Volume=/source:/dest
NetworkやVolumeが指定できる
Kube Play Unit
podなどのKubernetes YAML を元にしたKubernentes っぽいもの
YAMLファイルはコンテナまたはPod のname, id を指定して生成する
$ podman kube generate podname -f pod.yaml
$ podman generate kube podname -f pod.yaml
コンテナ名を指定してもPodとして出力できる
Kube Play Unit は podman kube play 相当の機能
$ podman kube play pod.yaml
code:test.kube
Description=いろいろ
Before=local-fs.target
Yaml=/xxxx/pod.yaml
PublishPort=80:80
Restart=always
WantedBy=multi-user.target default.target
Install のように systemd っぽいことも書かないといけないのかもしれない
Yaml とPublishPort程度を書き換えればよいので大量生産も簡単
pod.yaml を同じフォルダに入れなければいけないというわけではない
VOLUME
VOLUME を用意する?
podman volume create 相当
code:test.volume
Image=xxx
VolumeName=volume
User=root
Group=root
Label=org.test.Key=value
Image を指定できたりいろいろ
ネットワーク
code:test.network
Subnet=172.16.0.0/24
Gateway=172.16.0.1
IPRange=172.16.0.0/28
Label=org.test.Key=value
仮想ネットワークなどの構成
Build unit
code:test.build
Arch=aarch64
File=/path/to/Containerfile
Label=
Network=
Volume=
ビルド用の設定もあり
Image unit
imageを取得するためだけのもの
debug
/usr/lib/systemd/system-generators/podman-system-generator --user --dryrun
code:sh
# systemctl daemon-reload
# systemctl start test.service
enableは不要
とりあえずよし?
rootの場合
$ cp test.kube /etc/containers/systemd
$ /usr/lib/systemd/system-generators/podman-system-generator -dryrun
$ systemctl daemon-reload
$ systemctl start test
userの場合
$ mkdir -p ~/.config/containers/systemd
$ cp test.kube ~/.config/containers/systemd
$ /usr/lib/systemd/system-generators/podman-system-generator -user -dryrun
$ systemctl --user daemon-reload
$ systemctl --user start test