こんにちは。サイオステクノロジー 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 の可搬性