はじめに
この記事はDocker経験者がPodmanを使ってみる記事です。主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)誤りなどがあれば書き直していく予定です。
なお、Podmanの始め方については以下の記事を参考にしてください。
Podってなんですか?
Podとは簡単に説明するとコンテナのグループです。コンテナが集まっている単位とも言えるでしょう。Kubernetesを使ったことがある人であれば、Kubernetes Podを思い浮かべていただけたらとピンとくるかと思います。Red Hat公式では以下のように説明されています。
Pod はそれぞれ、1 つのインフラコンテナと任意の数の通常のコンテナで構成されます。インフラコンテナは、Pod の実行を継続し、コンテナをホストから分離するユーザー名前空間を維持します。他のコンテナにはそれぞれ、プロセスを追跡し、停止したコンテナ (一部のリソースがまだ使用中であるために環境から取り除くことができない、機能していないコンテナ) を監視するためのモニターがあります。
とはいえ、Docker経験者だとPodを扱ったことがないのでピンとこないですよね?ということで実際に触ってみましょう。
セットアップ
まずはVMを作成します。(通信回線によっては時間がかかるのでしばらく待ちましょう。)
podman machine init
VMが作成できましたら起動します。以下のコマンドを実行します。
podman machine start
これで準備完了です。
空のPodを作成する
今回はRed Hatさんのサイトを参考にPodmanでPodを作成してみます。
Podという単位でコンテナを管理したいのでPodを作成します。
podman pod create --name mypod
実行結果
c6fe279bb8a44ad608f3ae19a4739e3ea0403d6df5528859ad79b5d64f20551c
podman ps
のときと同じようにPodにもステータスを確認するコマンドがあります。以下のコマンドを実行します。
podman pod ps
実行結果
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
c6fe279bb8a4 mypod Created 31 seconds ago 09ea3039b4b6 1
podman pod create
を実行したときのハッシュ値とPOD ID
が部分的に一致しているのがわかります。正常にCreateできています。
INFRA ID
や# OF
など見慣れないものがありますが、ここではいったんそういうものだと理解して次にいきましょう。
なお、この段階でPodの中にはすでにコンテナがひとつ起動しています。
Pod内でコンテナを起動する
公式サイトの手順通り、myubi
というコンテナをPod内で実行します。
podman run -dt --name myubi --pod mypod registry.access.redhat.com/ubi9/ubi /bin/bash
Podの中身を確認します。
podman ps -a --pod
実行結果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME
2a005f3e784a localhost/podman-pause:5.1.1-1717459200 24 seconds ago Up 3 seconds c78744cc6190-infra c78744cc6190 mypod
2c1884686564 registry.access.redhat.com/ubi9/ubi:latest /bin/bash 2 seconds ago Up 3 seconds myubi c78744cc6190 mypod
POD ID
となっているc78744cc6190
を見ると2つのコンテナが同じPodに所属していることがわかります。
Podの状態を確認する
コンテナを複数起動したら、コンテナの状態を知りたくなりますよね?
ということでCPUの状態などを調査できるコマンドを実行します。
podman pod top mypod
もしくは以下のコマンドで確認できます。
podman pod stats -a --no-stream
Podの情報を表示する
Dockerを使ったことがある人ならDockerのコンテナの詳細情報を取得したことがあると思います。
Podにも詳細情報を取得するコマンドがあります。以下のコマンドを実行します。
podman pod inspect mypod
実行結果
[
{
"Id": "c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121",
"Name": "mypod",
"Created": "2024-06-17T20:10:37.330296261+09:00",
"CreateCommand": [
"podman",
"pod",
"create",
"--name",
"mypod"
],
"ExitPolicy": "continue",
"State": "Running",
"Hostname": "",
"CreateCgroup": true,
"CgroupParent": "user.slice",
"CgroupPath": "user.slice/user-480217440.slice/user@480217440.service/user.slice/user-libpod_pod_c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121.slice",
"CreateInfra": true,
"InfraContainerID": "2a005f3e784abf2cb711439fb2f920869d8b10dbe688ebc75c684362d466b276",
"InfraConfig": {
"PortBindings": {},
"HostNetwork": false,
"StaticIP": "",
"StaticMAC": "",
"NoManageResolvConf": false,
"DNSServer": null,
"DNSSearch": null,
"DNSOption": null,
"NoManageHosts": false,
"HostAdd": null,
"Networks": [
"podman"
],
"NetworkOptions": null,
"pid_ns": "private",
"userns": "host",
"uts_ns": "private"
},
"SharedNamespaces": [
"ipc",
"net",
"uts"
],
"NumContainers": 2,
"Containers": [
{
"Id": "2a005f3e784abf2cb711439fb2f920869d8b10dbe688ebc75c684362d466b276",
"Name": "c78744cc6190-infra",
"State": "running"
},
{
"Id": "2c188468656437ed302fe8bb8b0ac16efcfd248a02cab9aeb3a1d770a4142e43",
"Name": "myubi",
"State": "running"
}
],
"LockNumber": 0
}
]
CreateCommand
という項目を見ると起動時のコマンドが閲覧できます。また、State
を参照するとRunning
となっているため、Podが実行されているとわかります。
片付け
おわりにPodを停止して削除します。まずはPodを停止するために以下のコマンドを実行します。
podman pod stop mypod
実行結果
c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121
上記の値はpodman pod inspect mypod
のId
と一致します。
[
{
"Id":"c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121"
}
]
次にPodを削除します。
podman pod rm mypod
実行結果
c78744cc619057076aade40948908ffe112a2585fc026b951951707a4ea25121
rmした際にもstopと同じ時の値が表示されます。
最後にPOD ID
とCONTAINER ID
を確認しておわります。
POD ID
を確認します。
podman pod ps
CONTAINER ID
を確認します。
podman ps -a --pod
まとめ
Podmanを使うことでPodを管理できました。まだ慣れていないところもあるため、今回は公式とほぼ同じ手順で実行しました。うまく使いこなせるようになるとKubernetes、とくにPodの使い方を学習できるのでKubernetesをやるまえの準備になると個人的には思いました。
公式チュートリアルの第11章にはコンテナ間通信についても書いてあってとても勉強になります。
またの機会に取り組みたいです。