わからないなりに理解したい Podman ④ ~ 可搬性とは?その2

★★★ Live配信告知 ★★★
◆◇世界一わかりみの深いクラウドネイティブ on Azure◆◇
6/22(金) 12:00~ 第14回:世界一わかりみの深いAzure Bot Service 〜AIによるFAQチャットボット構築〜
今回はAzure Cognitive Service for LanguageというAzureのAIサービスを用いて、FAQチャットボットの構築方法についてわかりみ深く説明します。
◆◇PS Live配信◆◇
5/20(金) 17:00~ アウトプットはイイぞ 〜人生折り返し地点からの情報発信で学びが楽しくなった話〜
2020年にMicrosoft MVP for Azure を受賞した武井が人生を変えたアウトプットについてそのノウハウをお伝えします。

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

前回に引き続き、今回も Podman を使ってコンテナの可搬性…「コンテナ単位で別環境に簡単に移せるぞ!」というところを見ていきます。

前回はコンテナイメージをファイルに書き出して、そのファイルを使って別環境にコンテナを移す、という方法をやってみました。
この方法は特に事前準備が必要なく、ファイル形式でコンテナイメージを残しておけるなどのメリットも考えられますが、頻繁にコンテナの更新を別環境へ移したい場合や複数の環境にコンテナを移したい場合にはちょっと面倒になりそうです。
(それでもコンテナを使わないで同じようなことをするよりはラクだとは思いますが…)

今回はわざわざファイルをやりとりしなくても、各環境の Podman コマンドだけでコンテナイメージをやりとりできる方法レジストリを試してみます。

■レジストリを用意する

そもそも “レジストリ” って何者?というところを最初に大雑把に言ってしまうと、コンテナイメージ置き場だと思っておけばいい…はずです。
このレジストリには Podman コマンドを使ってコンテナイメージを保存したり、逆に Podman コマンドでレジストリに保存されているコンテナイメージを入手することができるため、予めレジストリを用意しておくことでコンテナイメージのやり取りがより簡単にできるようになります。

今回は自前のレジストリを用意して試してみようと思います。

■必要パッケージのインストール

まずは必要となるパッケージをインストールします。

■認証情報の作成

今回の手順で使用するディレクトリを纏めて作成します。

続いて、htpasswd コマンドでレジストリにアクセスするためのユーザ名/パスワードを作成します。

■証明書の準備

今回は自己署名証明書を使用します。
検証用や内部用であれば、各項目は特に設定しなくても問題はないでしょう。
(自前のレジストリを公開することはまずないと思いますが、レジストリを公開するのであれば自己署名証明書ではなく正規の証明書を用意したほうがよいでしょう。)

自己署名証明書を作成したら、この証明書を信頼する証明書として扱うようにします。

■レジストリの起動

先に用意した認証情報と証明書を使ったレジストリを起動します。
と言っても、公開されているレジストリのコンテナイメージを使えばコマンド一つで OK です。

これでレジストリが起動できました。
うまくいっていれば、先の手順で htpasswd で設定したユーザ名/パスワードを使って以下のような curl コマンドを実行すると、{“repositories”:[]} と返ってくるはずです。

■レジストリにコンテナイメージを置いてみる

レジストリが用意できたら、このレジストリを使ってコンテナイメージをやり取りしてみましょう。
まずは配置の方法からです。

■実験用のコンテナイメージを作る

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

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

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

作成した「test_content.html」が curl で見れるかを確認します。
この先ではこの「test_content.html」の内容を確認基準として使います。

続いて、”podman commit” コマンドで作成したコンテナ「test-container-base」をコンテナイメージに保存します。
この時、コンテナイメージ名の最初の “/” の前には必ずレジストリのホスト名 (とポート番号) を入れてください
今回は先の手順で 5000 番ポートを使ってレジストリを起動したので、「(ホスト名):5000/test/test_image」という名前のコンテナイメージにしています。

最後に “podman images” コマンドでコンテナイメージが作れていることを確認しましょう。

■コンテナイメージをアップロードする

では、作成したコンテナイメージをアップロードしてみましょう。
まずは、“podman login” コマンドでレジストリにアクセスできる状態にします。
ユーザ名とパスワードは先の手順で htpasswd で設定したユーザ名/パスワードです。

ログインに成功したら、あとは先に作成したレジストリのホスト名で始まる名前を持つコンテナイメージを指定して、“podman push” コマンドを実行するだけです。

これでレジストリにコンテナイメージをアップロードできました。
先の手順で使った curl コマンドを改めて実行してみると、コンテナイメージ名から先頭のレジストリのホスト名 (とポート番号) を抜いた「test/test_image」が追加されていることが確認できるはずです。

■レジストリからコンテナイメージを入手する

続いて、別の環境を用意してレジストリからコンテナイメージを入手してみましょう。
firewall 等を使用している場合は、レジストリの環境と通信できるよう予めうまいこと設定しておいてください。

■別環境での前準備

まず、podman が未インストールであればインストールします。

続いて、レジストリで使用している証明書を信頼する証明書として扱うようにします。
今回の手順では自己署名証明書を使っているため、openssl コマンドを使って以下のような手順で実施できます。

■コンテナイメージをダウンロードしてみる

レジストリからコンテナイメージをダウンロードしてみましょう。
その前に念のため、保存されているイメージ一覧を確認しておきます。

ダウンロードも “podman pull” コマンドでダウンロードしたいコンテナイメージ名を指定するだけです。
コンテナイメージ名はレジストリのホスト名 (とポート番号) を含めて入力します。
また、こちらも予め “podman login” でレジストリにアクセスできる状態にしておく必要があります。
一気にやってみましょう。

これだけで OK です。改めて保存されたコンテナイメージを確認すると、レジストリからダウンロードしたコンテナイメージが追加されているはずです。

また、このコンテナイメージを使ってコンテナを起動してみると、基となったコンテナで作成したコンテンツがちゃんとあることも確認できるはずです。

■別環境側からもアップロードしてみる

念のため、別環境側からもアップロードしてみましょう。
まず変更をアップロードできたことを確認する目印として、起動したコンテナのコンテンツに適当な内容を追加してみます。

続いて、”podman commit” で先頭部分がレジストリのホスト名 (とポート番号) を持つコンテナイメージを作成します。
今回はダウンロードしたコンテナイメージと同じ名前を設定しています。
コンテナイメージを作成できたら、あとは “podman push” するだけです。(もしレジストリからログアウトしている場合、再度 “podman login” する必要があります。)
最初に podman push した手順と全く同じ手順ですね。

最後に、元の環境のほうでレジストリに保存されたイメージが更新されているか確認しましょう。
“podman pull” でコンテナイメージをダウンロードしてコンテナを実行し、別環境で書き換えたコンテンツの内容が反映されていることを確認してみましょう。

■最後に

今回はレジストリについて見てきました。
「コンテナイメージ置き場」っぽいかなぁ、というところをなんとなく感じてもらえたかと思います。

最初の準備こそ必要になりますが、一度準備をしてしまえば
“podman push” (と “podman commit”) でコンテナイメージをアップロードし、
“podman pull” でダウンロードする、
という非常に手間の少ない方法でコンテナイメージが共有できるようになります。
ここまで見ると、コンテナの “可搬性” という強みをなんとなく理解できた気になります…よね。

以前にも少しお話ししましたが、一連の記事で使わせてもらっている quay.io や docker.io もレジストリです。
これらのように特にログイン操作をせずともコンテナイメージのダウンロードなら自由にできるレジストリや、今回のやり方のようにログイン操作が必要でコンテナイメージのアップロードなども可能なレジストリなどのような、レジストリ自体をサービスとして提供する団体・サービスなども存在しています。
レジストリを使いたい場合、今回のような自前でレジストリを用意するも含めて用途に合わせて使い分けるとよいと思います。
各レジストリサービスの使い方や規約などについては、そのレジストリサービス側の情報を参照してください。

ちょっとした余談ですが、これまでの記事で見てきたように “podman run” だけでもローカルに指定したコンテナイメージがない場合にはコンテナイメージのダウンロードを試みてくれます。
一方で、今回のように別環境から更新されたコンテナイメージへの変更を確実に反映するためには “podman pull” が必要となるため、状況や目的によって使い分けましょう。

次回はもう少し、レジストリ関連のお話にする予定です。

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





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


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

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

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

Be the first to comment

Leave a Reply

Your email address will not be published.


*