PodmanのPodってなんだ

Podmanには、コンテナを管理するための「Pod」と呼ばれる概念が存在します。Podは、複数のコンテナをまとめて運用管理する機能を提供し、Kubernetesにおいて最小の管理単位として位置づけられています。

Podmanは、KubernetesのYAMLファイルを使用してPodを作成することが可能です。これは、Dockerで使用されるdocker-composeと非常に類似した機能を提供しており、Podmanコンテナの運用管理を大幅に便利にしてくれます。

ただし、PodmanはKubernetesのPodを直接作成することはできません。その代わりに、Podを再現するためにpodman play kubeコマンドを使用する機能が組み込まれています。これらの機能を活用することで、Podmanを使用してPodの運用管理が可能になります。

この記事では、Podmanを使用してPodを作成し、コンテナを運用する方法について詳しく説明しています。

PodmanのPodってなんだ

Podとは、複数のコンテナをまとめて運用管理することができる仕組みです。podman play kubeコマンドを利用することで、KubernetesのPodをPodmanで再現することができます。

Podman PODのイメージ図

Docker Composeは、複数のコンテナを定義して実行するツールであり、YAMLファイルに定義した内容に従って、コンテナの生成や起動、停止を簡単なコマンドで実行できます。

同様に、PodmanのPODも、YAMLファイルに定義した内容に従って複数のコンテナを生成、起動、停止できます。

しかし、docker-composeは直接コンテナを取り扱うのに対して、Podmanの場合は、コンテナをPODと呼ばれるコンテナグループにまとめて取り扱う点が異なります。

今回は、PODの中にNGINXのコンテナを1つ配置した簡単な構成を作成していきます。

PODの作成イメージ

PODを作成する

PodmanでPODの作成は、podman create podコマンドを利用します。

$ podman pod create -p 8080:80 nginx_pod
4725c62c2df811c848493e7ab11a3647377608b0ac5230de0b693b82a94443d1

$ podman pod ls
POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
4725c62c2df8  nginx_pod   Created     30 seconds ago  3a8fb3bd0f20  1

作成されたすべてのPODには、infra-containerが自動的に作成されます。PODのポートやカーネル空間名前などは、このinfra-containerで管理されます。「# OF CONTAINERS」が1になっているのは、POD内にinfra-containerが組み込まれていることを示しています。

このPODには、NGINXで利用するポート番号を設定しておきます。

PODにコンテナを追加する

NGINXのコンテナイメージをpullします。

$ podman pull nginx

Resolved "nginx" as an alias (/var/cache/containers/short-name-aliases.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob e398db710407 done
Copying blob 85c41ebe6d66 done
Copying blob 6f837de2f887 done
Copying blob 8f28d06e2e2e done
Copying blob 578acb154839 done
Copying blob 7170a263b582 done
Copying blob c1dfc7e1671e done
Copying config c20060033e done
Writing manifest to image destination
Storing signatures
c20060033e06f882b0fbe2db7d974d72e0887a3be5e554efdb0dcf8d53512647

$ podman images
REPOSITORY               TAG               IMAGE ID      CREATED         SIZE
localhost/podman-pause   4.4.1-1686839996  2e3b165afbdd  10 minutes ago  735 kB
docker.io/library/nginx  latest            c20060033e06  2 days ago      191 MB

次に、作成したPOD内でNGINXのコンテナを起動します。

$ podman run -d --pod nginx_pod nginx:latest
4c38c0456a5a2a69ad820519d4a56feab755212d95e4ec522ef8d84b67e47549

$ podman pod ls
POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS
4725c62c2df8  nginx_pod   Running     4 minutes ago  3a8fb3bd0f20  2

POD内にコンテナが追加され、NGINXが起動されました。curlコマンドで確認します。

$ curl http://localhost:8080/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

htmlが返ってきたので、NGINXが正しく起動していることが確認できました。

PODのYAMLファイルを作成する

NGINXが起動しているPODのYAMLファイルを生成します。YAMLファイルの生成は、podman generate kubeコマンドを利用します。

$ podman generate kube -f ./nginx_pod.yaml nginx_pod

$ ls
nginx_pod.yaml

$ cat nginx_pod.yaml
# 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-11-03T07:39:23Z"
  labels:
    app: nginxpod
  name: nginx_pod
spec:
  containers:
  - args:
    - nginx
    - -g
    - daemon off;
    image: docker.io/library/nginx:latest
    name: vibranthawking
    ports:
    - containerPort: 80
      hostPort: 8080
    resources: {}
  hostname: nginx_pod
  restartPolicy: Never
status: {}

YAMLファイルが作成できましたので、実行中のPODを停止させて一旦削除します。

$ podman pod stop nginx_pod
4725c62c2df811c848493e7ab11a3647377608b0ac5230de0b693b82a94443d1

$ podman pod ls
POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
4725c62c2df8  nginx_pod   Exited      23 minutes ago  3a8fb3bd0f20  2

$ podman pod rm nginx_pod
4725c62c2df811c848493e7ab11a3647377608b0ac5230de0b693b82a94443d1

$podman pod ls
POD ID      NAME        STATUS      CREATED     INFRA ID    # OF CONTAINERS

YAMLファイルでPODを再生する

YAMLファイルを利用して、PODを再生します。

NGINXに外部ネットワークからアクセスできるようにするため、macvlanを利用します。macvlanは、podman network create コマンドを利用して作成します。

$ podman network create --driver macvlan --subnet=192.168.11.0/24 --gateway=192.168.11.254 -o parent=eth0 test_macvlan

$ podman network ls
NETWORK ID    NAME          DRIVER
2f259bab93aa  podman        bridge
bb4e29995085  test_macvlan  macvlan

macvlanネットワークのIPアドレスを割り当てPODを再生します。PODの再生は、podman play kubeコマンドを利用します。

$ podman kube play --net test_macvlan --ip 192.168.11.200 nginx_pod.yaml
WARN[0000] No more static macs left using a random one
Pod:
f9b129d69a5d1638afc644a6d7c0d5cd53e268a8e37b3604be46701b77c2b95c
Container:
c8996dc3bb53d31b2f0a883d62753543045a8c5ca3cecb6e1df9625afb8e35ff

$ podman pod ls
POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
f9b129d69a5d  nginx_pod   Running     34 seconds ago  40cf821902cc  2

PODが起動されたので、外部ネットワークからNGINXにアクセスしてみます。

ブラウザ表示

外部ネットワークからアクセス可能なNGINXをPODで起動することができました。

PODの停止/起動

PODの停止は、podman pod stopコマンド利用します。

$ podman pod stop nginx_pod
f9b129d69a5d1638afc644a6d7c0d5cd53e268a8e37b3604be46701b77c2b95c

$ podman pod ls
POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
f9b129d69a5d  nginx_pod   Exited      15 minutes ago  40cf821902cc  2

PODの起動は、podman pod startコマンド利用します。

$ podman pod start nginx_pod
f9b129d69a5d1638afc644a6d7c0d5cd53e268a8e37b3604be46701b77c2b95c

$ podman pod ls
POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
f9b129d69a5d  nginx_pod   Running     17 minutes ago  40cf821902cc  2

まとめ

いかがでしたでしょうか。

今回は、NGINXコンテナをPodmanのPOD内で起動させる方法と、YAMLファイルを使ったPODの再生方法について解説しました。

PODを活用することで、docker-composeと同じようなコンテナ運用管理を行うことができます。また、ホストコンピュータをリーブーとした場合でもPODが削除されることはなく、PODを起動するだけでサービスを速やかに開始させることが可能です。

YAMLファイルを利用することで、PODの複製についても簡単にでき、macvlanと一緒に利用することで、同一ホスト内に異なるIPアドレスを持つWebサーバを複数立ち上げることも簡単に行えます。

大規模なコンテナ仮想化プラットフォームの運用管理では、Kubernetesなどのコンテナオーケストレーションツールを利用しますが、小規模なシステムであれば、PodmanのPODでも十分だとおもいます。

開発環境や運用環境の構築でPodmanの利用を考えている方の参考になれば幸いです。

システムのお悩みについてご相談ください

本サイトの掲載内容に関するお問い合わせは、こちらから承ります。
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。