Podman Volumeとか使ってみる

PodmanやDockerでは、コンテナを削除した場合、コンテナ内に保存したファイルなどのデータはすべて消えてしまいます。一時的なデータであれば、コンテナと一緒に削除しても問題ないですが、コンテナ-ホスト間やコンテナ間で共有しているデータがある場合は、データを保護する必要があります。

このような時は、Podman Volumeを利用してコンテナ外にデータを保存して永続化させることが可能になります。他にもホストのディレクトリをコンテナに共有することで、コンテナ外にデータを保存して永続化させることも可能です。

この記事では、Podman Volumeの基本的な利用方法及びコンテナにボリュームをバインドする方法について解説しています。

なお、Podmanの概要や基本的な使い方は、こちらで解説しています。

Podman Volumeとか使ってみる

Podman Volumeは、Podmanエンジンで管理され、コンテナにバインドすることが可能なディレクトリです。Podman Volumeを利用することでデータを永続化し、コンテナ間で共有することができます。

Podman Volumeに保存されたデータは、ホストサーバ上に保存されているため、作成したPodman Volume自体を削除しない限りは、データが消失することはありません。

Podman Volumeのイメージ図

ここからは、「podman-volume01」という名前のPodman Volumeを作成し、AlmaLinuxのコンテナにバインドする手順について解説していきます。

Podman Volumeを作成する

Podman Volumeの作成は、podman volume createコマンドを使います。

$ podman volume create podman-volume01
podman-volume01

$ podman volume ls
DRIVER      VOLUME NAME
local       podman-volume01

作成されたボリュームの詳細は、podman volume inspectコマンドを使います。

$ podman volume inspect podman-volume01
[
    {
        "Name": "podman-volume01",
        "Driver": "local",
        "Mountpoint": "/home/testuser/.local/share/containers/storage/volumes/podman-volume01/_data",
        "CreatedAt": "2023-05-13T18:39:01.178828706Z",
        "Labels": {},
        "Scope": "local",
        "Options": {}
    }
]

ボリュームの作成日時やマウントポイント(=データの格納場所)などの情報を確認することができます。

Podman Volumeをコンテナにバインドする

まずは、AlmaLinuxのOSコンテナイメージを取得します。コンテナイメージの取得は、podman pullコマンドを使います。

podman imagesコマンドで、ローカルに保存されたコンテナイメージの一覧が表示されます。

$ podman pull docker.io/library/almalinux:latest

$ podman images
REPOSITORY                   TAG         IMAGE ID      CREATED       SIZE
docker.io/library/almalinux  latest      7ba003a70874  20 hours ago  190 MB

AlmaLinuxのOSイメージをコンテナ起動する際に、作成した「podman-volume01」をバインドしてみます。

コンテナの起動は、podman runコマンドを使用します。-vオプションでバインドするPodman Volumeの名前とコンテナ内のマウント先を指定します。

稼働中のコンテナの一覧表示は、podman psコマンドを使用します。

$ podman run -it -d -v podman-volume01:/Vol1 --rm --name alma_test01 almalinux:latest
19565dc7b3e8c94aeefa0a24645db7bf651ac7b48a42bb74a08f05ba4788a04c

$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
19565dc7b3e8  docker.io/library/almalinux:latest  /bin/bash   48 seconds ago  Up 48 seconds ago              alma_test01

起動された「alma_test01」コンテナにログインします。コンテナのログインは、podman execコマンドを使用します。

$ podman exec -it alma_test01 /bin/bash

[root@19565dc7b3e8 /]# ls
Vol1  bin  etc   lib    media  opt   root  sbin  sys  usr
afs   dev  home  lib64  mnt    proc  run   srv   tmp  var
[root@19565dc7b3e8 /]# cd Vol1
[root@19565dc7b3e8 Vol1]# touch aaa.txt
[root@19565dc7b3e8 Vol1]# ls -l
total 0
-rw-r--r-- 1 root root 0 May 13 19:17 aaa.txt

AlmaLinuxに/Vol1が作成され、このディレクトリ内にファイルを作成できることが確認できました。

このディレクトリは、podman volume inspectで確認したMountpointがマウントされています。ホスト側からも確認してみます。

$ cd /home/testuser/.local/share/containers/storage/volumes/podman-volume01/_data

$ ls -l
合計 0
-rw-r--r-- 1 testuser testuser 0  5月 13 19:17 aaa.txt

コンテナ上で作成したファイルが、Podman VolumeのMountpointが指しているディレクトリ内からも確認することができました。

ここで注目すべきことは、コンテナ上のファイルの所有者とグループがrootであるのに対して、ホスト上のファイルの所有者とグループがtestuserになっていることです。

これは、コンテナがルートレスモードで起動されており、ユーザ名前空間によって置換(マッピング)されていることを意味しています。つまり、コンテナのrootユーザは、ホストのtestuserと同じだということなのです。

次にコンテナ間で同一のPodman Volumeを共有できるか確認します。「alma_test02」という新しいコンテナに「podman-volume01」をバインドしてみます。

$ podman run -it -d -v podman-volume01:/Vol1 --rm --name alma_test02 almalinux:latest

$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
19565dc7b3e8  docker.io/library/almalinux:latest  /bin/bash   14 minutes ago  Up 14 minutes ago              alma_test01
0f23e4f31f9c  docker.io/library/almalinux:latest  /bin/bash   6 seconds ago   Up 6 seconds ago               alma_test02

$ podman exec -it alma_test02 /bin/bash

[root@0f23e4f31f9c /]# ls
Vol1  bin  etc   lib    media  opt   root  sbin  sys  usr
afs   dev  home  lib64  mnt    proc  run   srv   tmp  var
[root@0f23e4f31f9c /]# cd Vol1
[root@0f23e4f31f9c Vol1]# ls -l
total 0
-rw-r--r-- 1 root root 0 May 13 19:17 aaa.txt

両方のコンテナから同一のファイルが見えています。これで、Podman Volumeのデータの永続化と共有について確認することができました。

ホストのディレクトリをコンテナにバインドする

次に、以下のようなディレクトリをホスト上に作成して、AlmaLinuxのコンテナにバインドしてみます。

ホスト上のディレクトリバインドのイメージ図

podman runコマンドの-vオプションでバインドするホスト上のディレクトリのパスとコンテナ内のマウント先を指定します。

$ mkdir Host_Vol1

$ cd Host_Vol1/

$ pwd
/home/testuser/Podman_test/Host_Vol1

$ podman run -it -d -v /home/testuser/Podman_test/Host_Vol1:/Vol1 --rm --name alma_test03 almalinux:latest
c43c021c96562a5cc0644b3e545796f6e9cbfa5fff1cf58aab3e7e143a343657

$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
19565dc7b3e8  docker.io/library/almalinux:latest  /bin/bash   30 minutes ago  Up 30 minutes ago              alma_test01
0f23e4f31f9c  docker.io/library/almalinux:latest  /bin/bash   16 minutes ago  Up 16 minutes ago              alma_test02
c43c021c9656  docker.io/library/almalinux:latest  /bin/bash   5 seconds ago   Up 5 seconds ago               alma_test03

起動した「alma_test03」のコンテナにログインします。

$ podman exec -it alma_test03 /bin/bash

[root@c43c021c9656 /]# ls
Vol1  bin  etc   lib    media  opt   root  sbin  sys  usr
afs   dev  home  lib64  mnt    proc  run   srv   tmp  var
[root@c43c021c9656 /]# cd Vol1
[root@c43c021c9656 Vol1]# touch bbb.txt
[root@c43c021c9656 Vol1]# ls -l
total 0
-rw-r--r-- 1 root root 0 May 13 19:49 bbb.txt

AlmaLinuxに/Vol1が作成され、このディレクトリ内にファイルを作成できることが確認できました。

ホストからディレクトリを確認します。

$ cd /home/testuser/Podman_test/Host_Vol1

$ ls -l
合計 0
-rw-r--r-- 1 testuser testuser 0  5月 13 19:49 bbb.txt

こちらも、コンテナがルートレスモードで起動されているため、ユーザ名前空間によって置換(マッピング)されています。

次にコンテナ間で同一のPodman Volumeを共有できるか確認します。「alma_test04」という新しいコンテナにホスト上の同一ディレクトリをバインドしてみます。

$ podman run -it -d -v /home/testuser/Podman_test/Host_Vol1:/Vol1 --rm --name alma_test04 almalinux:latest
e79a18cc130bda9421431a75c3de3d0b1ca451590f6a9fc131505f0dc34428fc

$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
19565dc7b3e8  docker.io/library/almalinux:latest  /bin/bash   44 minutes ago  Up 44 minutes ago              alma_test01
0f23e4f31f9c  docker.io/library/almalinux:latest  /bin/bash   30 minutes ago  Up 30 minutes ago              alma_test02
c43c021c9656  docker.io/library/almalinux:latest  /bin/bash   14 minutes ago  Up 14 minutes ago              alma_test03
e79a18cc130b  docker.io/library/almalinux:latest  /bin/bash   9 seconds ago   Up 8 seconds ago               alma_test04

作成したコンテナにログインします。

$ podman exec -it alma_test04 /bin/bash

[root@e79a18cc130b /]# ls
Vol1  bin  etc   lib    media  opt   root  sbin  sys  usr
afs   dev  home  lib64  mnt    proc  run   srv   tmp  var
[root@e79a18cc130b /]# cd Vol1
[root@e79a18cc130b Vol1]# ls -l
total 0
-rw-r--r-- 1 root root 0 May 13 19:49 bbb.txt

両方のコンテナから同一のファイルが見えています。これで、ホスト上の任意に作成されたディレクトリのデータの永続化と共有が確認できました。

Podman Volumeを削除する

最後に、作成したPodman Volumeを削除します。

コンテナにバインドされているボリュームは、コンテナ起動中は削除できないため、コンテナを停止します。Podman Volumeをバインドしているコンテナは「alma_test01」と「alma_test02」ですので、この2つのコンテナを停止します。

$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED            STATUS                PORTS       NAMES
19565dc7b3e8  docker.io/library/almalinux:latest  /bin/bash   About an hour ago  Up About an hour ago              alma_test01
0f23e4f31f9c  docker.io/library/almalinux:latest  /bin/bash   47 minutes ago     Up 47 minutes ago                 alma_test02
c43c021c9656  docker.io/library/almalinux:latest  /bin/bash   30 minutes ago     Up 30 minutes ago                 alma_test03
e79a18cc130b  docker.io/library/almalinux:latest  /bin/bash   16 minutes ago     Up 16 minutes ago                 alma_test04

$ podman stop 19565dc7b3e8 0f23e4f31f9c
0f23e4f31f9c
19565dc7b3e8

$ podman ps
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
c43c021c9656  docker.io/library/almalinux:latest  /bin/bash   31 minutes ago  Up 31 minutes ago              alma_test03
e79a18cc130b  docker.io/library/almalinux:latest  /bin/bash   18 minutes ago  Up 18 minutes ago              alma_test04

Podman Volumeの削除は、podman volume rmコマンドを使用します。

$ podman volume ls
DRIVER      VOLUME NAME
local       podman-volume01

$ podman volume rm podman-volume01
podman-volume01

$ podman volume ls

Podman Volumeを削除すると、データはすべて消失しますので注意してください。

まとめ

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

今回はPodman Volumeの作成方法とコンテナへのボリュームのバインド方法について解説しました。

この解説で登場したPodman Volumeコマンドは、以下の表のとおりです。

Podman Volumeコマンド概要
podman volume createPodman Volumeを作成する
podman volume lsPodman Volumeの一覧を表示する
podman volume inspectPodman Volumeの作成日時やホストサーバ上のデータ保存場所などの詳細情報を表示する
podman volume rm指定したPodman Volumeを削除する
podman volumeコマンドの概要

Podman Volumeやホスト上のディレクトリを利用したデータの永続化とコンテナ間のデータ共有は、コンテナ管理の基本事項ですので、しっかりと理解しておきましょう。

参考になれば幸いです。

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

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

前の記事

RHEL8でPodmanをやってみる
Podman

次の記事

Podman Networkをやってみる