podmanでPodを作成してみる
podmanとKubernetes
podmanはコンテナの開発、管理、実行を行うためのエンジンです。 Dockerと同等の機能を持っていますが、podmanではその名前の通りPodの作成ができます。
KuberenetesなどではPod(あるいはDeployment)の形でコンテナを起動することになると思うので、そのあたりとのギャップがなくなるのがいいと個人的に思いました。
以下ではPodの作成やコンテナの追加、削除などの基本的な操作を整理していきます。
podmanにおけるPod周りの基本操作
Pod周りの基本操作のうち以下のコマンドのサブコマンドをいくつか抜粋して紹介します。
Podの作成
Podの作成を行います。
今回は--publish(-p)
オプションでポートフォワードの設定を記述しています。
後でNginxのコンテナをPodに追加するための設定です。
$ podman pod create -p 8080:80 --name nginx-pod => xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # PodのID
作成に成功すると、PodのIDが出力されます。
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へコンテナを参加させることができます。
$ 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ファイルを生成することが可能です。
$ 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
はコンテナのプロセスを終了させずに、コンテナを停止する方法です。
$ 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
はコンテナのプロセスを終了してからコンテナを停止する方法です。
$ 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を間違えると危ないので、停止と削除は別コマンドで行うことをおすすめします。)
$ podman pod rm -f nginx-pod xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # コンテナのID
すべてのPodを削除したい場合は以下の2つの方法があります。
-a
オプションの使用podman pod prune
の使用
$ podman pod rm -a nginx-pod $ podman pod prune
最後に
podmanという名前の通りPodが作れるのは便利ですね。 コンテナをKubernetesなどでホストすることを考えると、本番に近い形で複数のコンテナの連携を試せるのは便利だと思いました。