この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
podmanとKubernetes
podmanはコンテナの開発、管理、実行を行うためのエンジンです。 Dockerと同等の機能を持っていますが、podmanではその名前の通りPodの作成ができます。
KuberenetesなどではPod(あるいはDeployment)の形でコンテナを起動することになると思うので、そのあたりとのギャップがなくなるのがいいと個人的に思いました。
以下ではPodの作成やコンテナの追加、削除などの基本的な操作を整理していきます。
podmanにおけるPod周りの基本操作
Pod周りの基本操作のうち以下のコマンドのサブコマンドをいくつか抜粋して紹介します。
Podの作成
Podの作成を行います。
今回は--publish(-p)
オプションでポートフォワードの設定を記述しています。
後でNginxのコンテナをPodに追加するための設定です。
Podの作成
$ podman pod create -p 8080:80 --name nginx-pod
=> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PodのID
作成に成功すると、PodのIDが出力されます。
Podの一覧
以下のようにPodの一覧が表示されます。
Podの一覧
$ podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
xxxxxxxxxxxx nginx-pod Created x minutes ago yyyyyyyyyyyy 1
まだ何もコンテナを追加してないのに、コンテナ数が1となっているのはネットワークの管理を行うコンテナが内部的に立ち上がっているためです。
これはpodman pod inspect nginx-pod
の結果を確認するとわかります。
Podへのコンテナの追加
podmanではコンテナの起動時にPodを指定することで、そのPodへコンテナを参加させることができます。
Podへのコンテナの追加
$ podman run -dt --pod nginx-pod --name nginx docker.io/library/nginx:1.23.3-alpine
=> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
正しく、起動しているか確認してみます。
追加後の動作確認
$ podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
xxxxxxxxxxxx nginx-pod Running x minutes ago yyyyyyyyyyyy 2
$ curl -I http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.23.3
Date: Mon, 27 Feb 2023 08:15:59 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 13 Dec 2022 18:23:05 GMT
Connection: keep-alive
ETag: "6398c309-267"
Accept-Ranges: bytes
Pod内のコンテナの数も2つになり、ステータスもRunning
になっています。
cURLのレスポンスも正しく返ってきていますね。
ログの確認
コンテナのログを確認してみます。
--container(-c)
オプションを指定することで、特定のコンテナに限った出力ができます。
ログの確認
$ podman pod logs -c nginx nginx-pod
=> 2023-02-27T17:10:49+09:00 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
...(中略)
2023-02-27T17:15:59+09:00 10.88.0.2 - - [27/Feb/2023:08:15:59 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.85.0" "-"
cURLでのアクセスも出力されていますね。
KubernetesのYAMLファイルを生成する
podmanでは作成したPodからKubernetesで使用するオブジェクトが宣言されたYAMLファイルを生成することが可能です。
YAMLファイルの生成
$ podman generate kube nginx-pod
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.4.1
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-02-27T08:30:42Z"
labels:
app: nginx-pod
name: nginx-pod
spec:
containers:
- args:
- nginx
- -g
- daemon off;
image: docker.io/library/nginx:1.23.3-alpine
name: nginx
ports:
- containerPort: 80
hostPort: 8080
resources: {}
tty: true
hostname: nginx-pod
restartPolicy: Never
status: {}
生成されたものをそのまま本番環境に持っていくのは、依存する他のリソース(VolumeやSecretなど...)との兼ね合いから難しいかと思います。 ただ、これをベースに変更していけば、最初にコンテナの設定を書く手間は省けるかと思います。
Podの停止
Pod内のコンテナを停止するには大きく分けて以下の2つのコマンドがあります。
podman pod pause
podman pod stop
pause
podman pod pause
はコンテナのプロセスを終了させずに、コンテナを停止する方法です。
Pod内のコンテナの停止(pause)
$ podman pod pause nginx-pod
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
$ podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
xxxxxxxxxxxx nginx-pod Paused x minutes ago yyyyyyyyyyyy 2
$ podman pod unpause nginx-pod
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
stop
podman pod stop
はコンテナのプロセスを終了してからコンテナを停止する方法です。
Pod内のコンテナの停止(stop)
$ podman pod stop nginx-pod
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
$ podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
xxxxxxxxxxxx nginx-pod Exited x minutes ago yyyyyyyyyyyy 2
$ podman pod start nginx-pod
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
Podの削除
最後にPodを削除して終わりにします。
Podを削除するにはPodが停止(ステータスがExited)している必要があります。
ですが、-f
オプションを指定することでPodの停止と削除を一緒に行えます。(Podを間違えると危ないので、停止と削除は別コマンドで行うことをおすすめします。)
Pod内のコンテナの削除
$ podman pod rm -f nginx-pod
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
すべてのPodを削除したい場合は以下の2つの方法があります。
-a
オプションの使用podman pod prune
の使用
Pod内のコンテナの削除(全て)
$ podman pod rm -a nginx-pod
$ podman pod prune
最後に
podmanという名前の通りPodが作れるのは便利ですね。 コンテナをKubernetesなどでホストすることを考えると、本番に近い形で複数のコンテナの連携を試せるのは便利だと思いました。