Red Hat Training

A Red Hat training course is available for RHEL 8

第8章 特殊なコンテナーイメージの実行

本章では、特種なコンテナーイメージについて説明します。これには、以下が含まれます。

  • toolbox - 問題のデバッグや機能の監視に必要なツールをインストールしてホストシステムに負担をかける代わりに、toolbox コマンドを実行できます。Toolbox は、ホストでレポートを実行したり問題を診断したりするために使用できるツールを保持する support-tools コンテナーイメージを起動します。
  • Runlabels - 一部のコンテナーイメージには、あらかじめ設定されたオプションと引数を使用してコンテナーを実行できるラベルが組み込まれています。podman container runlabel <label> コマンドでは、コンテナーイメージに対して <label> で定義されているコマンドを実行できます。サポートされるラベルは、installrun、および uninstall です。

8.1. toolbox でコンテナーホストのトラブルシューティング

toolbox ユーティリティーを使用すればトラブルシューティングツールを RHEL 8 システムに直接インストールする代わりに、このツールを一時的に追加し、完了したら簡単に破棄できます。toolbox ユーティリティーは次のように機能します。

  • registry.redhat.io/rhel8/support-tools イメージをローカルシステムにプルします。
  • イメージからコンテナーを起動し、ホストシステムにアクセスできるコンテナー内でシェルを実行します。

support-tools コンテナーを使用すると、以下を行うことができます。

  • ホストシステムにインストールされていない可能性のあるコマンド (例: sosreportstrace、または tcpdump) を、ホストシステムで動作できるように実行します。
  • ホストシステムで使用するコンテナーに、追加ソフトウェアをインストールします。
  • 作業が完了したら、コンテナーを破棄します。

以下は、典型的な toolbox セッションを示しています。

手順

  1. toolbox パッケージおよび podman パッケージがインストールされていることを確認します。

    # yum module list container-tools

    コンテナーツールの完全なセットをインストールするには、以下を入力します。

    # yum module install container-tools -y
  2. toolbox コマンドを実行して、support-tools イメージをプルして実行します (プロンプトが表示されたら、Red Hat カスタマーポータルの認証情報を入力します)。

    # toolbox
    Trying to pull registry.redhat.io/rhel8/support-tools...
    ...
    Would you like to authenticate to registry: 'registry.redhat.io' and try again? [y/N] y
    Username: johndoe
    Password: *************
    Login Succeeded!
    Trying to pull registry.redhat.io/rhel8/support-tools...Getting image source signatures
    ...
    Storing signatures
    30e261462851238d38f4ef2afdaf55f1f8187775c5ca373b43e0f55722faaf97
    Spawning a container 'toolbox-root' with image 'registry.redhat.io/rhel8/support-tools'
    Detected RUN label in the container image. Using that as the default...
    command: podman run -it --name toolbox-root --privileged --ipc=host --net=host --pid=host -e HOST=/host -e NAME=toolbox-root -e IMAGE=registry.redhat.io/rhel8/support-tools:latest -v /run:/run -v /var/log:/var/log -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -v /:/host registry.redhat.io/rhel8/support-tools:latest
  3. bash シェルを開き、コンテナー内でコマンドを実行します。

    # bash-4.4#
  4. コンテナー内から、ホストの root ファイルシステムが /host ディレクトリーから利用できます。ここに表示されるその他のディレクトリーは、コンテナーの中にすべて表示されます。

    # ls /
    bin   dev  home  lib	lost+found  mnt  proc  run   srv  tmp  var
    boot  etc  host  lib64	media	    opt  root  sbin  sys  usr
  5. コンテナー内でコマンドを実行してください。sosreport コマンドでは、システムに関する情報を生成して、Red Hat サポートに送信できます。

    bash-4.4# sosreport
    
    sosreport (version 3.6)
    This command will collect diagnostic and configuration information from
    this Red Hat Enterprise Linux system and installed applications.
    
    An archive containing the collected information will be generated in
    /host/var/tmp/sos.u82evisb and may be provided to a Red Hat support
    representative.
    ...
    Press ENTER to continue, or CTRL-C to quit.   <Press ENTER>
    ...
    Your sosreport has been generated and saved in:
      /host/var/tmp/sosreport-rhel81beta-12345678-2019-10-29-pmgjncg.tar.xz
    The checksum is: c4e1fd3ee45f78a17afb4e45a05842ed
    Please send this file to your support representative.

    sosreport コマンドは、レポートをホスト (/host/var/tmp/sosreport-<ID>) に保存します。

  6. コンテナーにソフトウェアパッケージをインストールして、コンテナーにないツールを追加します。たとえば、ホストで実行中のプロセスのコアダンプを取得するには、procps パッケージおよび gcore パッケージをインストールし、ps を使用して実行中のデーモンのプロセス ID を取得し、gcore を使用してコアダンプを取得します。

    bash-4.4# yum install procps gdb -y
    bash-4.4# ps -ef | grep chronyd
    994        809     1  0 Oct28 ?        00:00:00 /usr/sbin/chronyd
    bash-4.4# gcore -o /host/tmp/chronyd.core 809
    Missing separate debuginfo for target:/usr/sbin/chronyd
    Try: dnf --enablerepo='*debug*' install /usr/lib/debug/.build-id/96/0789a8a3bf28932b093e94b816be379f16a56a.debug
    ...
    Saved corefile /host/tmp/chronyd.core.809
    [Inferior 1 (process 809) detached]
  7. コンテナーからログアウトしてホストに戻るには、exit と入力します。ファイルは /host/tmp/chronyd.core.809 に保存され、ホストの /tmp/chronyd.core.809 から利用できます。
  8. toolbox-root コンテナーを削除するには、以下を入力します。

    # podman rm toolbox-root

以下を追加することで、toolbox で使用されるレジストリー、イメージ、またはコンテナー名を変更できます。

  • REGISTRY - toolbox イメージがプルされるレジストリーを変更します。たとえば、REGISTRY=registry.example.com です。
  • IMAGE - 使用されるイメージを変更します。たとえば、IMAGE=mysupport-tools などです。
  • TOOLBOX_NAME - 実行中のコンテナーに割り当てられた名前を変更します。たとえば、TOOLBOX_NAME=mytoolbox となります。

次回の toolbox を実行すると、.toolboxrc ファイルから新しい値が使用されます。

8.1.1. ホストへの権限の付与

support-tools コンテナー (または特権コンテナー) 内からその他のコマンドを実行すると、非特権コンテナー内で実行した場合と異なる動作をする場合があります。sosreport は、コンテナーで実行しているタイミングを指示できますが、その他のコマンドは、ホストシステム (/host ディレクトリー) で機能するように指示する必要があります。以下は、コンテナーからホストに開くことができる、または開くことができない機能の例です。

  • 特権 - 特権コンテナー (--privileged) は、デフォルトでホストのアプリケーションを root ユーザーとして実行します。SELinux セキュリティーコンテキスト unconfined_t で実行しているため、コンテナーにはこの機能があります。そのため、たとえば、root ユーザーが所有するホストからマウントされたファイルおよびディレクトリーを削除できます。
  • プロセステーブル: コンテナー内で実行しているプロセスのみを表示する通常のコンテナーとは異なり、特権コンテナー内で (--pid=host セットを使用して) ps -e コマンドを実行すると、ホストで実行しているすべてのプロセスを表示できます。ホストから特権コンテナーで実行するコマンドにプロセス ID を渡すことができます (例: kill <PID>)。ただし、コマンドによっては、コンテナーからプロセスにアクセスしようとすると、パーミッションの問題が発生することがあります。
  • ネットワークインターフェース - デフォルトでは、コンテナーには外部のネットワークインターフェースとループバックネットワークインターフェースが 1 つずつだけあります。ネットワークインターフェースをホストに開く (--net=host) と、コンテナーからネットワークインターフェースに直接アクセスできます。
  • プロセス間のコミュニケーション - ホストの IPC 機能は、特権コンテナーからアクセスできます。ipcs などのコマンドを実行して、ホスト上のアクティブなメッセージキュー、共有メモリーセグメント、およびセマフォセットに関する情報を表示できます。