Podman Volumeとか使ってみる
PodmanやDockerでは、コンテナを削除した場合、コンテナ内に保存したファイルなどのデータはすべて消えてしまいます。一時的なデータであれば、コンテナと一緒に削除しても問題ないですが、コンテナ-ホスト間やコンテナ間で共有しているデータがある場合は、データを保護する必要があります。
このような時は、Podman Volumeを利用してコンテナ外にデータを保存して永続化させることが可能になります。他にもホストのディレクトリをコンテナに共有することで、コンテナ外にデータを保存して永続化させることも可能です。
この記事では、Podman Volumeの基本的な利用方法及びコンテナにボリュームをバインドする方法について解説しています。
なお、Podmanの概要や基本的な使い方は、こちらで解説しています。
目次
Podman Volumeとか使ってみる
Podman Volumeは、Podmanエンジンで管理され、コンテナにバインドすることが可能なディレクトリです。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 create | Podman Volumeを作成する |
podman volume ls | Podman Volumeの一覧を表示する |
podman volume inspect | Podman Volumeの作成日時やホストサーバ上のデータ保存場所などの詳細情報を表示する |
podman volume rm | 指定したPodman Volumeを削除する |
Podman Volumeやホスト上のディレクトリを利用したデータの永続化とコンテナ間のデータ共有は、コンテナ管理の基本事項ですので、しっかりと理解しておきましょう。
参考になれば幸いです。
システムのお悩みについてご相談ください
SOHOのシステム運用管理に関するお悩みごとについて、なんでもお気兼ねなくご相談ください。
現役システムエンジニアのスタッフが、ボランティアでご相談にご対応させていただきます。