わからないなりに理解したい Podman ③ ~ 可搬性とは?

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回はコンテナ最大の強みの一つと言われる、”可搬性”…要は「別の環境にコンテナって単位で簡単に移せますよ」なところの手段のうち一例を、少しやってみたいと思います。
ここで紹介するのは、ファイルを介した方法です。

■コンテナの状態をコンテナイメージに反映する

コンテナを別の環境に移す場合、以前少しお話しした “コンテナイメージ” の形で移します。
実行中のコンテナで行なった変更はコンテナの元になったコンテナイメージには直接は反映されないため、コンテナイメージ側に変更を反映する手順が必要です。

今回はまず、実行中のコンテナを元にコンテナイメージを作成する方法を見ていきます。
(前回紹介した ContainerFile と “podman build” コマンドを使うと ContainerFile の内容に応じたコンテナイメージができるため、ここの手順の代わりにそちらの方法を使用しても問題ありません。)

■実験用のコンテナを作る

今回のテスト用に、quay.io の httpd コンテナイメージをベースに適当なコンテンツを追加したコンテナを作ります。
以前も案内している手順なので細かい説明は省きます。

コンテナを「test-container-base」という名前を付けて起動して

[ ~]$ podman run -dt -p 8080:8443/tcp --name test-container-base quay.io/centos7/httpd-24-centos7

コンテナの内部でコマンドを実行して適当にコンテンツを作って

[ ~]$ podman exec -it test-container-base /bin/bash
bash-4.2$
bash-4.2$ cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/opt/rh/httpd24/root/var/www/html"
    # access content that does not live under the DocumentRoot.
bash-4.2$
bash-4.2$ echo -e "This content was created manually.\n Made with bash in Container." > /opt/rh/httpd24/root/var/www/html/test_content.html
bash-4.2$
bash-4.2$ exit
[ ~]$ 

作成した「test_content.html」がちゃんと curl で見れるかを確認します。

[ ~]$ curl -k https://localhost:8080/test_content.html
This content was created manually.
 Made with bash in Container.
[ ~]$

ここまでは問題ありませんね。
この記事ではこの「test_content.html」があることを確認基準として使います。

■実行中のコンテナを元にしたコンテナイメージを作成する

先ほどのコンテナをコンテナイメージにしてみましょう。
必要なコマンドは以下です。

podman commit コンテナ名/ID コンテナイメージ名(リポジトリ名)

早速実行…する前に、
“podman images” コマンドで現在保存されているコンテナイメージの一覧を確認しておきます。
合わせて、”podman ps” コマンドで実行中のコンテナの情報も確認しておきましょう。

[ ~]$ podman images
REPOSITORY                        TAG         IMAGE ID      CREATED      SIZE
quay.io/centos7/httpd-24-centos7  latest      e5efe143390e  2 weeks ago  358 MB
[ ~]$
[ ~]$ podman ps
CONTAINER ID  IMAGE                                    COMMAND               CREATED         STATUS             PORTS                   NAMES
7bbd5c1895a2  quay.io/centos7/httpd-24-centos7:latest  /usr/bin/run-http...  16 minutes ago  Up 16 minutes ago  0.0.0.0:8080->8443/tcp  test-container-base
[ ~]$

では改めて “podman commit” コマンドを実行してみましょう。
コンテナ名は先の手順でつけた「test-container-base」を指定。コンテナイメージには今回は「localhost/test_image」という名前を付けてみます。

[ ~]$ podman commit test-container-base localhost/test_image
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
5f82e9bbc0072571d95cddce299b0e2cc897c6c7339608cbc2956b32e1c2262a
[ ~]$

その後、再度 “podman images” コマンドで保存されているコンテナイメージを確認してみると、指定したとおり「localhost/test_image」という名前の新しいコンテナイメージができているはずです。

[ ~]$ podman images
REPOSITORY                        TAG         IMAGE ID      CREATED         SIZE
localhost/test_image              latest      5f82e9bbc007  11 seconds ago  358 MB
quay.io/centos7/httpd-24-centos7  latest      e5efe143390e  2 weeks ago     358 MB
[ ~]$

新しくできたコンテナイメージ「localhost/test_image」を元に新しくコンテナを作成してみると、確かに最初から元のコンテナで作成した “test_content.html” が存在しており、コンテナの情報をコンテナイメージに保存できていることが確認できます。

[ ~]$ podman run -dt -p 8082:8443/tcp --name test-container-from-image localhost/test_image
d88d4ffc12e9a151b703577fdcec838ed22fce31f5ef32da27552273333a6817
[ ~]$ curl -k https://localhost:8082/test_content.html
This content was created manually.
 Made with bash in Container.
[ ~]$

■コンテナイメージをファイルに書き出してみる

続いて、コンテナイメージをファイルに書き出します
これもコマンド一つで OK です。

podman save -o 出力先パス コンテナイメージ名(リポジトリ名)

例えば、イメージ「localhost/test_image」を「test_image.tar」に書き出すなら以下のように実行します。

[ ~]$ podman save -o test_image.tar localhost/test_image
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
[ ~]$ ls
test_image.tar
[ ~]$

このように、指定した名前のファイルに書き出すことができます。

■別環境でコンテナイメージをファイルから復元してみる

最後に、先の手順で作成したファイルからコンテナイメージが読み込めることを確認します。
読み込みも以下のようなコマンド一つで行うことができます。

podman load -i ファイルパス

確認用にもう一つテスト環境を作成し、その環境に何らかの方法…例えば scp コマンドなどで、作成したファイル「test_image.tar」を転送します。

[ ~]$ scp test_image.tar (転送先のホスト):test_image.tar
test_image.tar              100%  342MB  75.5MB/s   00:04
[ ~]$

ここから先の手順は新しく作成した、もう片方のテスト環境で行ないます。
とりあえずファイルの転送ができていることを確認し、合わせて podman のインストールがまだなら、インストールもしましょう。

[ ~]$ ls
test_image.tar
[ ~]$
[ ~]$ sudo dnf module enable -y container-tools:rhel8
 :
[ ~]$ sudo dnf module install -y container-tools:rhel8
 :

コンテナイメージの読み込み前に、この環境に保存されているコンテナイメージを確認しておきます。
今回は新しく作った環境なので、保存されたコンテナイメージはありません。

[ ~]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE
[ ~]$

“podman load” コマンドでファイルからコンテナイメージを読み込んでみます

[ ~]$ podman load -i test_image.tar
Getting image source signatures
 :
Writing manifest to image destination
Storing signatures
Loaded image(s): localhost/test_image:latest
[ ~]$

その後、改めてコンテナイメージを確認してみると…

[ ~]$ podman images
REPOSITORY            TAG         IMAGE ID      CREATED         SIZE
localhost/test_image  latest      5f82e9bbc007  56 minutes ago  358 MB
[ ~]$

ちゃんとファイルに保存した「localhost/test_image」が読み込めていることが確認できると思います。
勿論、このコンテナイメージから作成されたコンテナには、最初から「test_content.html」があることも確認できるはずです。

[ ~]$ podman run -dt -p 8080:8443/tcp --name test-container-from-image localhost/test_image
4f61d6786d53fc05ed628ae2b98bf05d6e8f3cee1d677dd9ac676a0c6978c83e
[ ~]$ curl -k https://localhost:8080/test_content.html
This content was created manually.
 Made with bash in Container.
[ ~]$

■最後に

今回はファイルを介してコンテナイメージを別の環境へ移す方法について見てきました。
これもまた簡単にできることをなんとなく感じられたかと思います。

このように、かなり手軽に別環境へ “コンテナ” を移せることこそがコンテナ最大の強みの一つと言われますが、逆に見れば「単一の環境だけで動かしていれば問題ないしバックアップなども不要」と言い切れるのであれば、コンテナの可搬性についての利便性はあまり実感できないかもしれません。

このコンテナの可搬性を活用するメリットとして考えられることは、わかりやすそうなところでは…
例えば、コンテナという単位でアプリケーションなどを別環境へ移せるため、移行する必要のあるファイルを探したりする手間がなく、必要ファイルの移し忘れでうまく動かない…という事態を避けやすいことが考えられるでしょうか。
また、以前少しお話ししたとおりコンテナは隔離空間なので、移行先の環境に影響を受けにくいことも考えられます。

今回とは別の方法でのコンテナの移行手段については、また別の機会があれば紹介したいと思います。

(他の回)
わからないなりに理解したい Podman ① ~ 何をするもの?
わからないなりに理解したい Podman ② ~ コンテナを書き換える
(今回)わからないなりに理解したい Podman ③ ~ 可搬性とは?
わからないなりに理解したい Podman ④ ~ 可搬性とは?その2
わからないなりに理解したい Podman ⑤ ~ レジストリと TAG
わからないなりに理解したい Podman ⑥ ~ Pod って何だ?
わからないなりに理解したい Podman ⑦ ~ Pod の可搬性

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です