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で再現することができます。
Docker Composeは、複数のコンテナを定義して実行するツールであり、YAMLファイルに定義した内容に従って、コンテナの生成や起動、停止を簡単なコマンドで実行できます。
同様に、PodmanのPODも、YAMLファイルに定義した内容に従って複数のコンテナを生成、起動、停止できます。
しかし、docker-composeは直接コンテナを取り扱うのに対して、Podmanの場合は、コンテナをPODと呼ばれるコンテナグループにまとめて取り扱う点が異なります。
今回は、PODの中にNGINXのコンテナを1つ配置した簡単な構成を作成していきます。
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のシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。