こんにちは。サイオステクノロジー OSS サポート担当 山本 です。
今回は podman の 2つの “tag” について見ていきます。
前回のレジストリに関連する要素で、覚えておくとコンテナを使ったアプリケーション開発などに役立つはずです。
■実験用のコンテナイメージの作成
今回もレジストリを使用します。
レジストリの準備方法については少し長いので、前回の記事を参照してください。
今回の記事は前回の続きとして操作することを前提とします。
■実験用のコンテナイメージを作る
例によって、quay.io の httpd コンテナイメージをベースにテスト用のコンテナとコンテナイメージを作っていきます。
以前も案内している手順なので細かい説明は省きます。
コンテナを「tag-test-base」という名前を付けて起動して
[ ~]$ podman run -dt -p 8080:8443/tcp --name tag-test-base quay.io/centos7/httpd-24-centos7
コンテナの内部でコマンドを実行して適当にコンテンツを作って
[ ~]$ podman exec -it tag-test-base /bin/bash bash-4.2$ bash-4.2$ echo -e "This is test page." > /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 is test page. [ ~]$
ここで一旦、”podman commit” と “podman push” で作成したコンテナをコンテナイメージに保存し、レジストリにアップロードします。
レジストリに保存するコンテナイメージは「(レジストリのホスト名):(ポート番号)」で始まる名前にすることと、レジストリにログインすることは前回お話ししたとおりです。
今回のコンテナイメージ名は「(ホスト名):5000/test/tag-test」にしてみます。
[ ~]$ podman commit tag-test-base (ホスト名):5000/test/tag-test Getting image source signatures : Writing manifest to image destination Storing signatures 3b25dac35f1313315af6eda0075a5eeeb648ca9dbbbbb959c651ed814aae5913 [ ~]$ [ ~]$ podman login (ホスト名):5000 Username: (ユーザ名) Password: (パスワード) Login Succeeded! [ ~]$ [ ~]$ podman push (ホスト名):5000/test/tag-test Getting image source signatures : Writing manifest to image destination Storing signatures [ ~]$
ここまでは以前と同じ内容です。
■”podman tag” を使って別名のコンテナイメージを保存する
ではタグを使う…前に、コンテナイメージの内容が変わっていなければ違いを確認できないので、先のコンテナ「tag-test-base」の内容を少し変更しておきます。
確認用に作った「test_content.html」の内容を変更し、「test_content_1.html」を追加で作ります。
作ったら “podman commit” でコンテナイメージに変更を反映します。(ここでは “podman push” はしません)
[ ~]$ podman exec -it tag-test-base /bin/bash bash-4.2$ bash-4.2$ echo -e "1111111111" >> /opt/rh/httpd24/root/var/www/html/test_content.html bash-4.2$ bash-4.2$ echo -e "1111111111" > /opt/rh/httpd24/root/var/www/html/test_content_1.html bash-4.2$ bash-4.2$ exit [ ~]$ [ ~]$ podman commit tag-test-base (ホスト名):5000/test/tag-test Getting image source signatures : Writing manifest to image destination Storing signatures 3b25dac35f1313315af6eda0075a5eeeb648ca9dbbbbb959c651ed814aae5913 [ ~]$
それでは “podman tag” コマンドでコンテナイメージにタグをつけてみます。
“podman tag” コマンドの使い方は以下のような形です。
podman tag (元になるコンテナイメージ名) (新しいコンテナイメージ名)
これを使って、先に保存したコンテナイメージ「(ホスト名):5000/test/tag-test」に新しく「(ホスト名):5000/test/tag-test:1111」という名前をつけてみます。
[ ~]$ podman tag (ホスト名):5000/test/tag-test (ホスト名):5000/test/tag-test:1111 [ ~]$
上記のように “podman tag” を実行した後、”podman images” でローカルのコンテナイメージを確認すると、保存したはずの名前「(ホスト名):5000/test/tag-test:1111」ではなく、以下のように「TAG」だけ異なる同名イメージがある状態になっているはずです。
[ ~]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE (ホスト名)/test/tag-test latest db8283b924ff 2 minutes ago 356 MB (ホスト名)/test/tag-test 1111 db8283b924ff 2 minutes ago 356 MB : [ ~]$
このようにコンテナイメージ名の末尾に「:(TAG名)」をつけることで、コンテナイメージの「TAG」を変更することができます。
“podman push” で TAG を変更したコンテナイメージをアップロードする場合も、コンテナイメージ名の末尾に「:(TAG名)」をつければ OK です。試しにアップロードしてみましょう。
[ ~]$ podman push (ホスト名):5000/test/tag-test:1111 Getting image source signatures : Writing manifest to image destination Storing signatures [ ~]$
なお、(レジストリ側の実装にもよりますが) 前回使ったレジストリ内のコンテナイメージ一覧を確認する以下のコマンドは TAG が表示されず、TAG の異なる同名コンテナイメージをアップロードしても一覧には追加されません。
[ ~]$ curl --basic -u (ユーザ名):(パスワード) https://(ホスト名):5000/v2/_catalog {"repositories":["test/tag-test","test/test_image"]} [ ~]$
(こちらもレジストリ側の実装にもよりますが) そのコンテナイメージにどのような TAG があるのかは、”podman search –list-tags” コマンドで確認することができます。
これらの性質は、レジストリ内のコンテナイメージを整理するのに役立つでしょう。
[ ~]$ podman search --list-tags (ホスト名):5000/test/tag-test NAME TAG (ホスト名):5000/test/tag-test latest (ホスト名):5000/test/tag-test 1111 [ ~]$
■アップロードしたコンテナイメージを確認する
ここまでの手順でアップロードした2つの TAG の異なる同名コンテナイメージをダウンロード・実行する手順と、それぞれがアップロードしたとおりの内容になっているかを、別の環境を用意して確認してみましょう。
■TAG なしのコンテナイメージの確認
まずは最初にアップロードした、特に TAG を付けていないコンテナイメージをダウンロードします。
前回お話ししたとおり、”podman pull” でダウンロードしてから “podman run” を実行しましょう。
[ ~]$ podman pull (ホスト名):5000/test/tag-test Trying to pull (ホスト名):5000/test/tag-test:latest... Getting image source signatures : [ ~]$ [ ~]$ podman run -dt -p 8080:8443/tcp --name tag-test-0 (ホスト名):5000/test/tag-test de76b9dac573b92da2ae35fbbb2be325dd2600cccb8771395d32356ef264d360 [ ~]$
実行したら、作成・編集した各コンテンツの確認をしてみます。
こちらの TAG を付けていないほうをアップロードした時点では “test_content.html” は1行のみで、”test_content_1.html” は作成していませんでした。
それぞれのコンテンツを確認すると、”test_content.html” は1行のみで、”test_content_1.html” はエラーを返す、と確かに保存した時点の内容が表示されることが確認できるはずです。
[ ~]$ curl -k https://localhost:8080/test_content.html This is test page. [ ~]$ [ ~]$ curl -k https://localhost:8080/test_content_1.html404 Not Found Not Found
The requested URL was not found on this server.
[ ~]$
■TAG を付けたほうのコンテナイメージの確認
続いて、TAG を設定してアップロードしたほうを確認してみます。
こちらも “podman pull” と “podman run” でダウンロード・実行を行いましょう。
TAG を設定したコンテナイメージのダウンロード・実行には、アップロードした際と同様にコンテナイメージ名の末尾に「:(TAG名)」をつければ OK です。
(あと、先に起動したコンテナとポートがかぶらないようにします。)
[ ~]$ podman pull (ホスト名):5000/test/tag-test:1111 Trying to pull (ホスト名):5000/test/tag-test:1111... Getting image source signatures : [ ~]$ [ ~]$ podman run -dt -p 8081:8443/tcp --name tag-test-1 (ホスト名):5000/test/tag-test:1111 1ed52437352117f7ae5d65a49f766737bf3f38e839dbdcd7b09e2c8054740d00 [ ~]$
こちらの各コンテンツも確認してみると、TAG を付けていないコンテナイメージをアップロードしてから、TAG を付けたコンテナイメージを作成するまでの間に行なった変更が反映されていることが確認できるはずです。
[ ~]$ curl -k https://localhost:8081/test_content.html This is test page. 1111111111 [ ~]$ [ ~]$ curl -k https://localhost:8081/test_content_1.html 1111111111 [ ~]$
このように、TAG の異なるコンテナイメージはそれぞれの内容を保持することができます。
■”podman tag” コマンドを使わなくても…
「TAG」は “podman commit” でコンテナイメージを保存する時にもつけることができます。
こちらも試してみましょう。
まずは後の確認のため、「tag-test-base」の内容を更に少し変更します。
確認用に作った「test_content.html」の内容を変更し、「test_content_2.html」を追加で作ります。
[ ~]$ podman exec -it tag-test-base /bin/bash bash-4.2$ bash-4.2$ echo -e "2222222222" >> /opt/rh/httpd24/root/var/www/html/test_content.html bash-4.2$ bash-4.2$ echo -e "2222222222" > /opt/rh/httpd24/root/var/www/html/test_content_2.html bash-4.2$ bash-4.2$ exit [ ~]$そうしたらそのまま "podman commit" をします。ここでコンテナイメージ名の末尾に「:(TAG名)」をつけるのを忘れずに。
今回は「(ホスト名):5000/test/tag-test:2222」としてみましょう。[ ~]$ podman commit tag-test-base (ホスト名):5000/test/tag-test:2222 Getting image source signatures : Writing manifest to image destination Storing signatures d322afca0a5f19f7137b3ec21e2e310129720f55c7e2bb93f0f4f1b355a4f26d [ ~]$"podman images" でローカルイメージを確認すると、きちんと TAG が 2222 の新しいイメージが追加されているはずです。
[ ~]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE (ホスト名):5000/test/tag-test 2222 d322afca0a5f 37 seconds ago 356 MB (ホスト名):5000/test/tag-test latest db8283b924ff 2 hours ago 356 MB (ホスト名):5000/test/tag-test 1111 db8283b924ff 2 hours ago 356 MB : [ ~]$このイメージも "podman push" します。やり方は先と同じで、コンテナイメージ名の末尾に「:(TAG名)」をつけるようにします。
[ ~]$ podman push (ホスト名):5000/test/tag-test:2222 Getting image source signatures : Writing manifest to image destination Storing signatures [ ~]$別環境からこの "tag-test:2222" を pull して実行・確認、あるいは "podman search --list-tags" でレジストリの保存内容を確認すると、この方法でもきちんと TAG を付けて保存できていることが確認できます。
[ ~]$ podman pull (ホスト名):5000/test/tag-test:2222 Trying to pull (ホスト名):5000/test/tag-test:2222... Getting image source signatures : [ ~]$ [ ~]$ podman run -dt -p 8082:8443/tcp --name tag-test-2 (ホスト名):5000/test/tag-test:2222 36a6161855eb1cf7b63357aacb0ccc4c83aca1f52dfae46860f7120c42f5711c [ ~]$ [ ~]$ curl -k https://localhost:8082/test_content.html This is test page. 1111111111 2222222222 [ ~]$ [ ~]$ curl -k https://localhost:8082/test_content_1.html 1111111111 [ ~]$ [ ~]$ curl -k https://localhost:8082/test_content_2.html 2222222222 [ ~]$[ ~]$ podman search --list-tags (ホスト名):5000/test/tag-test NAME TAG (ホスト名):5000/test/tag-test latest (ホスト名):5000/test/tag-test 1111 (ホスト名):5000/test/tag-test 2222 [ ~]$■最後に
今回は "podman tag" コマンドとレジストリの TAG について見てみました。
試してみるとなんとなくわかるかと思いますが、最初にお話ししたとおりこれらは同じような名前ですが別物です。
"podman tag" コマンドはコンテナイメージに新しい名前をつけるのに使うコマンドで、
例えば "podman pull" コマンドでコンテナイメージをダウンロードした直後に、誤って名前を変えずにアップロードしてしまうことを避けるためなどに名前を変えてから運用したいという場合などに使えるかと思います。対してレジストリの TAG はレジストリに保存するコンテナイメージの整理に一役買う機能で、
コンテナで開発したアプリケーションなどを複数バージョンにわたって纏めて管理したい場合などに使えるはずです。これらの機能は、例えばコンテナを用いたアプリケーション開発などを行う際に非常に強力な武器となってくれるはずです。
余談ですが、前回の記事を見てもらえばわかるかと思いますが、(レジストリの設定次第ではありますが) 基本的に同名・同一 TAG のコンテナイメージを "podman push" すると、その名前・TAG を持つコンテナイメージはレジストリ上で上書きされます。
このため、TAG を活用する場合には予めきちんと TAG のネーミングポリシーなどを決めておきましょう。(他の回)
わからないなりに理解したい Podman ① ~ 何をするもの?
わからないなりに理解したい Podman ② ~ コンテナを書き換える
わからないなりに理解したい Podman ③ ~ 可搬性とは?
わからないなりに理解したい Podman ④ ~ 可搬性とは?その2
(今回) わからないなりに理解したい Podman ⑤ ~ レジストリと TAG
わからないなりに理解したい Podman ⑥ ~ Pod って何だ?
わからないなりに理解したい Podman ⑦ ~ Pod の可搬性