podmanでPodを作成してみる

Dokcer以外のコンテナエンジンの一つであるpodmanですが、名前の表すとおりKuberenetesなどで使用するPodと近いものが作成できます。 サイドカーコンテナなどの複数のコンテナが連携するようなものを試したいときにpodmanは便利なんじゃないでしょうか?
2023.02.27

この記事は公開されてから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などでホストすることを考えると、本番に近い形で複数のコンテナの連携を試せるのは便利だと思いました。