hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

コンテナイメージのレジストリ検索方法(Podman編)



1 はじめに

以下の項目について、コンテナに関する記事を作成しました。

2 検証環境

ホストのAlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

3 レジストリリポジトリについて

レジストリは、コンテナイメージを保存し配布する場所です。レジストリの中には複数のリポジトリがあり、それぞれのリポジトリでコンテナイメージを管理します。

レジストリ 概要
registry.access.redhat.com Red Hat社が提供するレジストリです。レジストリを利用するさい、認証は不要です
registry.redhat.io Red Hat社が提供するレジストリです。レジストリを利用するさい、認証が必要です。あらかじめRedHatのアカウントを持っている必要があります。Red Hat社 の配布するコンテナーイメージは registry.redhat.io に移行しつつあるようです
registry.connect.redhat.com Red Hat社が提供するサードパーティ製品のレジストリです。レジストリを利用するさい、認証が必要です。あらかじめRedHatのアカウントを持っている必要があります
docker.io Docker社が提供するレジストリです
quay.io CoreOSによって開発されました。CoreOSは後にRed Hatによって買収され、現在はRed Hatが運営されています

Red Hat コンテナーレジストリーの認証 - Red Hat Customer Portal

4 イメージの名前(短縮名およびFQIN)について

コンテナのイメージ名は以下の呼び方があります。

名前 概要
FQIN(Fully Qualified Image Name) レジストリ名/リポジトリ名/イメージ名で指定する名前です
短縮名 イメージ名で指定する名前です

短縮名は以下のファイルに定義されています。例えば、短縮名 "almalinux" は、FQINでは "docker.io/library/almalinux" となります。

[root@server ~]# cat /etc/containers/registries.conf.d/000-shortnames.conf
[aliases]
  # almalinux
  "almalinux" = "docker.io/library/almalinux"
  "almalinux-minimal" = "docker.io/library/almalinux-minimal"
-snip-

短縮名(almalinux)を使ってイメージをダウンロードしてみます。ダウンロード中の様子を確認すると、1行目で短縮名をFQINに変換している旨が表示されているのがわかります。そして、2行目でFQINを指定してイメージをダウンロードしていることがわかります。

[root@server ~]# podman pull almalinux
Resolved "almalinux" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/almalinux:latest...
Getting image source signatures
Copying blob 5f50a3278457 skipped: already exists
Copying config ac7ec62599 done   |
Writing manifest to image destination
ac7ec6259981906060844582e873ea43f41c6045fdbd8969d22bb6f0ec044219

ダウンロードしたイメージを確認すると、イメージの名前が FQIN であることがわかります。

[root@server ~]# podman images
REPOSITORY                   TAG         IMAGE ID      CREATED      SIZE
docker.io/library/almalinux  latest      ac7ec6259981  3 weeks ago  191 MB

registries.conf の注意事項には、短縮名を使用すると偽装されたイメージをダウンロードする可能性があることが述べられています。そのため、短縮名ではなくFQINの使用が推奨されています。さらに、イメージをハッシュ値でダウンロードすることで、偽装されたイメージではなく、意図したイメージを確実にダウンロードすることができます。

[root@server ~]# cat /etc/containers/registries.conf
# NOTE: RISK OF USING UNQUALIFIED IMAGE NAMES
# We recommend always using fully qualified image names including the registry
# server (full dns name), namespace, image name, and tag
# (e.g., registry.redhat.io/ubi8/ubi:latest). Pulling by digest (i.e.,
# quay.io/repository/name@digest) further eliminates the ambiguity of tags.
# When using short names, there is always an inherent risk that the image being
# pulled could be spoofed. For example, a user wants to pull an image named
-snip

5 レジストリの検索について

Podmanには、イメージの格納場所を検索する際のデフォルトのレジストリが定義されています。ただし、この定義はPodmanをパッケージ化したディストリビューションによって異なります。Podman infoコマンドを使用すると、以下の3つのレジストリがイメージの検索対象であることがわかります。

[root@server ~]# podman info
-snip-
registries:
  search:
  - registry.access.redhat.com
  - registry.redhat.io
  - docker.io

jqコマンドを使用して、Podmanに設定されているレジストリのリストを表示してみます。

[root@server ~]# podman info --format json | jq '.registries'
{
  "search": [
    "registry.access.redhat.com",
    "registry.redhat.io",
    "docker.io"
  ]
}

なお、デフォルトで検索するレジストリは、registries.confに定義されていることが確認できます。

[root@server ~]# cat /etc/containers/registries.conf
-snip-
unqualified-search-registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"]

6 認証が必要なレジストリからイメージをダウンロードする方法

registry.redhat.ioからイメージをダウンロードする場合、ID/パスワードによるユーザ認証が必要になります。

6.1 アカウントの作成

以下のページにアクセスしてアカウントを作成します。ここで作成したアカウントは、registry.redhat.ioとregistry.connect.redhat.comの両方に使用できます。
https://sso.redhat.com/auth/realms/redhat-external/login-actions/registration?client_id=customer-portal&tab_id=c1freLsJpuA

6.2 イメージのダウンロード

レジストリ(registry.redhat.io)に存在するrsyslogイメージを検索してみます。この中から、rhel9リポジトリのrsyslogイメージをダウンロードしてみます(下記1行目のイメージ)。

[root@server ~]# podman search registry.redhat.io/rsyslog
NAME                                                          DESCRIPTION
registry.redhat.io/rhel9/rsyslog                              rhcc_registry.access.redhat.com_rhel9/rsyslo...
registry.redhat.io/rhel7/rsyslog                              A containerized version of the rsyslog utili...
registry.redhat.io/rhel8/rsyslog                              Rocket Fast System For Log Processing (rsysl...
registry.redhat.io/rhosp-rhel8/openstack-rsyslog              openstack-rsyslog
registry.redhat.io/rhosp-beta/openstack-rsyslog               openstack-rsyslog
registry.redhat.io/rhosp-rhel8/openstack-rsyslog-base         openstack-rsyslog-base
registry.redhat.io/rhosp-dev-preview/openstack-rsyslog-rhel9  Red Hat Red Hat OpenStack image for openstac...
registry.redhat.io/rhosp-rhel9/openstack-rsyslog              rhcc_registry.access.redhat.com_rhosp-rhel9/...
registry.redhat.io/rhoso-beta/openstack-rsyslog-rhel9         Red Hat Red Hat OpenStack Services on OpenSh...

rhel9のリポジトリからrsyslogイメージをダウンロードしようとしましたが、レジストリ(registry.redhat.io)にログインしていないため、認証に失敗し、イメージをダウンロードできませんでした。

[root@server ~]# podman pull registry.redhat.io/rhel9/rsyslog
Trying to pull registry.redhat.io/rhel9/rsyslog:latest...
Error: initializing source docker://registry.redhat.io/rhel9/rsyslog:latest: unable to retrieve auth token: invalid username/password: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication

レジストリ(registry.redhat.io)にログインします。

[root@server ~]# podman login registry.redhat.io
Username: test_user
Password:
Login Succeeded!

rhel9リポジトリからrsyslogイメージをダウンロードします。今回は、イメージをダウンロードすることができました。

[root@server ~]# podman pull registry.redhat.io/rhel9/rsyslog
Trying to pull registry.redhat.io/rhel9/rsyslog:latest...
Getting image source signatures
Checking if image destination supports signatures
Copying blob 7de73bed2a9f done   |
Copying blob edab65b863ae done   |
Copying config e3197b3b88 done   |
Writing manifest to image destination
Storing signatures
e3197b3b884c5cd6b32a39801f1c21965cbbee63adc46df86ec8a56553a20f14

ダウンロードしたイメージを確認します。rhel9リポジトリからrsyslogイメージの最新版がダウンロードされたことが確認できます。

[root@server ~]# podman images rsyslog
REPOSITORY                        TAG         IMAGE ID      CREATED      SIZE
registry.redhat.io/rhel9/rsyslog  latest      e3197b3b884c  2 weeks ago  243 MB

レジストリ(registry.redhat.io)からログアウトします。

[root@server ~]# podman logout registry.redhat.io
Removed login credentials for registry.redhat.io

Y 参考図書

今回の記事執筆にあたり参考にした図書は以下のものです。

単行本


Docker実践ガイド 第3版 (impress top gear)

電子書籍



Software Design (ソフトウェアデザイン) 2023年11月号 [雑誌]


Docker実践ガイド 第3版 impress top gearシリーズ