ウェブサイト検索

RHEL 8 で Podman と Skopeo を使用してコンテナを管理する方法


開発者がこれまで直面した課題の 1 つは、複数のコンピューティング環境間でアプリケーションを確実に実行できるようにすることでした。多くの場合、アプリケーションは期待どおりに実行されなかったり、エラーが発生して完全に失敗したりしました。そこでコンテナという概念が生まれました。

コンテナイメージとは何ですか?

コンテナ イメージは、分離された環境で実行される実行可能コードが付属する静的ファイルです。コンテナー イメージは、システム ライブラリ、依存関係、およびアプリケーションがさまざまな環境で実行するために必要なその他のプラットフォーム設定で構成されます。

Red Hat Linux は、必要な docker コマンドを使用して Linux コンテナを直接操作するために活用できる一連の便利なコンテナ ツールを提供します。これらには次のものが含まれます。

  • Podman – これは、root モードまたは rootless モードで OCI コンテナを実行および管理するための、デーモンのないコンテナ エンジンです。 PodmanDocker に似ており、Docker がデーモンである点を除いて同じコマンド オプションがあります。 podman を使用すると、Docker を使用する場合とほぼ同じ方法でコンテナ イメージをプル、実行、管理できます。 Podman には多くの高度な機能が備わっており、システムと完全に統合されており、root ユーザーを必要としないコンテナの実行を含むユーザー名前空間サポートを提供します。
  • Skopeo: これは、コンテナ イメージをあるレジストリから別のレジストリにコピーするために使用されるコマンドライン ツールです。 Skopeo を使用すると、特定のホストとの間でイメージをコピーしたり、別のコンテナ レジストリや環境にイメージをコピーしたりできます。イメージのコピーとは別に、これを使用してさまざまなレジストリからのイメージを検査したり、署名を使用してイメージを作成および検証したりできます。
  • Buildah: これは、Docker ファイルを使用してコンテナのOCI イメージを作成および管理するために使用されるコマンドライン ツールのセットです。

この記事では、podmanSkopeo を使用したコンテナの管理に焦点を当てます。

リモート レジストリからのコンテナ イメージの検索

podman search コマンドを使用すると、選択したリモート レジストリでコンテナ イメージを検索できます。レジストリのデフォルトのリストは、/etc/containers/ ディレクトリにある registries.conf ファイルで定義されています。

レジストリは 3 つのセクションで定義されます。

  • [registries.search] – このセクションでは、podman がコンテナ イメージを検索できるデフォルトのレジストリを指定します。要求されたイメージを registry.access.redhat.comregistry.redhat.io、および docker.io レジストリで検索します。

  • [registries.insecure] – このセクションでは、TLS 暗号化を実装していないレジストリ、つまり安全でないレジストリを指定します。デフォルトでは、エントリは指定されていません。

  • [registries.block] – ローカル システムから指定されたレジストリへのアクセスをブロックまたは拒否します。デフォルトでは、エントリは指定されていません。

通常の (非 root) ユーザーとして podman コマンドを実行すると、ホーム ディレクトリ ($HOME/.config) 上に独自の registries.conf ファイルを定義できます。 /containers/registries.conf) を使用して、システム全体の設定をオーバーライドします。

レジストリを指定する際のルール

レジストリを指定するときは、次の点に注意してください。

  • すべてのレジストリは一重引用符で囲む必要があります。
  • レジストリは、ホスト名または IP アドレスを使用して指定できます。
  • 複数のレジストリを指定する場合は、カンマで区切る必要があります。
  • レジストリが非標準ポート (安全な場合は TCP ポート 443、安全でない場合は 80 のいずれか) を使用する場合は、レジストリ名と一緒にポート番号を指定する必要があります。 registry.example.com:5566

構文を使用してレジストリでコンテナ イメージを検索するには、次の手順を実行します。

podman search registry/container_image

たとえば、registry.redhat.io レジストリで Redis イメージを検索するには、次のコマンドを実行します。

podman search registry.redhat.io/redis

MariaDB コンテナ イメージを検索するには、次のコマンドを実行します。

podman search registry.redhat.io/mariadb

コンテナー イメージの詳細な説明を取得するには、取得した結果からコンテナー イメージの名前の前に --no-trunc オプションを使用します。たとえば、次に示すように、MariaDB コンテナ イメージの詳細な説明を取得しようとします。

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

コンテナイメージのプル

リモート レジストリからコンテナ イメージをプルまたは取得するには、何よりもまず認証する必要があります。たとえば、MariaDB コンテナ イメージを取得するには、まず Redhat レジストリにログインします。

podman login

ユーザー名とパスワードを入力し、キーボードの「ENTER」を押します。すべてがうまくいけば、レジストリへのログインが成功したことを示す確認メッセージが表示されます。

Login Succeeded!

これで、次の構文を使用してイメージをプルできるようになります。

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

<registry> は、TCP <port> 上のコンテナ イメージのリポジトリを提供するリモート ホストまたはレジストリを指します。 <namespace><name> は、レジストリの <namespace> に基づいてコンテナ イメージを集合的に指定します。最後に、<tag> オプションでコンテナ イメージのバージョンを指定します。何も指定されていない場合は、デフォルトのタグ (latest) が使用されます。

信頼できるレジストリ、つまり暗号化を提供し、匿名ユーザーがランダムな名前でアカウントを作成できないようにするレジストリを追加することを常にお勧めします。

MariaDB イメージをプルするには、次のコマンドを実行します。

podman pull registry.redhat.io/rhel8/mariadb-103
  • <registry> – registry.redhat.io
  • <namespace> – rhel8
  • <name> – MariaDB
  • <タグ> – 103

以降のコンテナー イメージのプルでは、すでに認証されているため、さらにログインする必要はありません。 Redis コンテナ イメージをプルするには、次のコマンドを実行するだけです。

podman pull registry.redhat.io/rhscl/redis-5-rhel7

コンテナイメージの一覧表示

イメージの取得が完了したら、podman Images コマンドを実行して、ホスト上に現在存在するイメージを表示できます。

podman images

コンテナイメージの検査

コンテナーを実行する前に、イメージを調べて、それが何をするのかを理解することを常にお勧めします。 podman Inspection コマンドは、OS やアーキテクチャなど、コンテナに関する大量のメタデータを出力します。

イメージを検査するには、podman Inspection コマンドの後にイメージ ID またはリポジトリを実行します。

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

以下の例では、MariaDB コンテナを検査しています。

podman inspect registry.redhat.io/rhel8/mariadb-103

コンテナーの特定のメタデータを取得するには、 --format オプションに続いてメタデータとコンテナー ID (イメージ ID または名前) を渡します。

以下の例では、「ラベル」セクションに該当する RHEL 8 ベース コンテナのアーキテクチャと説明に関する情報を取得しています。

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

別のレジストリのリモート イメージを検査するには、skopeo Inspection コマンドを使用します。以下の例では、Docker でホストされている RHEL 8 init イメージを検査しています。

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

コンテナイメージのタグ付け

お気づきかもしれませんが、イメージ名は通常、本質的に一般的なものです。たとえば、redis イメージには次のラベルが付けられます。

registry.redhat.io/rhscl/redis-5-rhel7

画像にタグを付けると、画像に含まれる内容がよりわかりやすくなるように、より直感的な名前が付けられます。 podman タグ コマンドを使用すると、基本的にさまざまな部分で構成されるイメージ名のエイリアスであるイメージ タグを作成できます。

これらは:

registry/username/NAME:tag

たとえば、 ID 646f2730318c を持つ Redis イメージの総称名を変更するには、次のコマンドを実行します。

podman tag 646f2730318c myredis

最後にタグを追加するには、フルコロンの後にタグ番号を追加します。

podman tag 646f2730318c myredis:5.0

タグ番号を追加しないと、単に「latest」属性が割り当てられます。

コンテナイメージの実行

コンテナを実行するには、podman run コマンドを使用します。例えば:

podman run image_id

コンテナをデーモン サービスとしてバックグラウンドでサイレントに実行するには、次のように -d オプションを使用します。

podman run -d image_id

たとえば、ID 646f2730318credis イメージを実行するには、次のコマンドを呼び出します。

podman run -d 646f2730318c

RHEL 8 基本イメージなどのオペレーティング システムに基づいてコンテナを実行している場合は、-it ディレクティブを使用してシェルにアクセスできます。 -i オプションは対話型セッションを作成し、-t オプションはターミナル セッションを生成します。 --name オプションはコンテナ名を mybash に設定し、 はベース イメージの ecbc6f53bba0 イメージ ID に設定します。

podman run -it --name=mybash ecbc6f53bba0

その後、任意のシェル コマンドを実行できるようになります。以下の例では、コンテナー イメージの OS バージョンを確認しています。

cat /etc/os-release

コンテナーを終了するには、exit コマンドを呼び出すだけです。

exit

コンテナが終了すると、コンテナは自動的に停止します。コンテナを再度起動するには、次のように -ai フラグを指定して podman start コマンドを使用します。

podman start -ai mybash

これにより、もう一度シェルにアクセスできるようになります。

実行中のコンテナイメージの一覧表示

現在実行中のコンテナを一覧表示するには、次のように podman ps コマンドを使用します。

podman ps

実行後に終了したコンテナを含むすべてのコンテナを表示するには、次のコマンドを使用します。

podman ps -a

Systemd サービスで自動起動するようにコンテナー イメージを構成する

このセクションでは、コンテナーを systemd サービスとして RHEL システム上で直接実行するように構成する方法に焦点を当てます。

まず、好みの画像を取得します。この場合、Docker Hub からRedis イメージをプルしました。

podman pull docker.io/redis

システムで SELinux を実行している場合は、systemd でコンテナを実行するには、container_manage_cgroup ブール値をアクティブにする必要があります。

setsebool -p container_manage_cgroup on

その後、コンテナー イメージをバックグラウンドで実行し、希望のイメージ名を割り当てます。この例では、イメージに redis_server という名前を付け、ポート 6379 をコンテナからRHEL 8 ホストにマッピングしました。

podman run -d --name redis_server -p 6379:6379 redis

次に、redis 用の systemd ユニット構成ファイルを /etc/systemd/system/ ディレクトリに作成します。

vim /etc/systemd/system/redis-container.service

以下の内容をファイルに貼り付けます。

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

ファイルを保存して終了します。

次に、起動時にコンテナが自動的に起動するように構成します。

systemctl enable redis-container.service

次に、コンテナを起動し、実行ステータスを確認します。

systemctl start redis-container.service
systemctl status redis-container.service

コンテナイメージの永続ストレージを構成する

コンテナーを実行するときは、ホスト上で永続的な外部ストレージを構成することが賢明です。これにより、コンテナーがクラッシュしたり、誤って削除された場合に備えてバックアップが提供されます。

データを永続化するために、ホストにあるディレクトリをコンテナ内のディレクトリにマップします。

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

--privileged オプションは、SELinux が強制に設定されている場合に渡されます。 -v オプションは、ホスト上にある外部ボリュームを指定します。ここでのコンテナ ボリュームは /mnt ディレクトリです。

シェルにアクセスしたら、次のようにサンプル ファイル testing.txt/mnt ディレクトリに作成します。

echo "This tests persistent external storage" > /mnt/testing.txt

次に、 コンテナを終了し、ホスト上の外部ストレージにファイルが存在するかどうかを確認します。

exit
cat /var/lib/containers/backup_storage/testing.txt

出力これは永続的な外部ストレージをテストします

コンテナの停止と削除

コンテナの実行が完了したら、podman stop コマンドの後に podman ps< から取得できるコンテナ ID を指定してコンテナを停止できます。 コマンド。

podman stop container-id

不要になったコンテナを削除するには、まずコンテナを停止してから、オプションとしてコンテナ ID または名前を指定して podman rm コマンドを実行します。

podman rm container-id

1 つのコマンドで複数のコンテナを一度に削除するには、コンテナのIDをスペースで区切って指定します。

podman rm container-id-1 container-id-2 container-id-3

すべてのコンテナをクリアするには、次のコマンドを実行します。

podman rm -a

画像の削除

イメージを削除するには、まず、前のサブトピックで説明したように、イメージから生成されたすべてのコンテナーが停止して削除されていることを確認します。

次に、次に示すように、podman -rmi コマンドの後にイメージの ID を指定して実行します。

podman -rmi image-id

結論

RHEL 8 でのコンテナの管理と操作に関するこの章はこれで終了です。このガイドで、コンテナと、podmanSkopeo を使用してRHEL システム上でコンテナを操作および管理する方法について十分に理解していただければ幸いです。