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

コンテナーおよびコンテナーイメージの一般的な操作方法に慣れたら、本セクションを参照して、役に立つと思われる特定タイプのコンテナーイメージを学習します。これには、以下が含まれます。

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

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

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

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

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

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

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

手順

  1. toolbox パッケージおよび podman パッケージがインストールされていない場合はインストールします。そのために推奨される方法は、コンテナーツールのフルセットをインストールすることです。

    # 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
    
    bash-4.4#

    bash シェルが開き、コンテナー内でコマンドを実行できる状態になります。

  3. コンテナー内から、ホストの 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
  4. コンテナー内から、コマンドを試すことができます。たとえば、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-…​) に保存します。

  5. コンテナーにソフトウェアパッケージをインストールして、コンテナーにないツールを追加します。たとえば、ホストで実行中のプロセスのコアダンプを取得するには、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]
    # exit

    exit を入力すると、コンテナーを離れて、ホストに戻ります。ホストの /host/tmp/chronyd.core.809 に保存されたファイルは、ホストの /tmp/chronyd.core.809 から利用できることが確認できます。

この時点で、コンテナーは実行していませんが、システム上には存在したままになります。以下を選択できます。

  • Start up the container again - toolbox を再入力して、(toolbox-root という名前の) コンテナーを再起動します。以前コンテナーに行ったソフトウェアの追加や変更は維持されます。
  • Start with a fresh container - 古いコンテナーを取り除くには、podman rm toolbox-root と入力します。次に、toolbox を再実行して、新規の support-tools コンテナーで開始します。
  • Start with different values - 以下の値をホストの /root/.toolboxrc に追加して、toolbox で使用するレジストリー、イメージ、またはコンテナー名を変更できます。

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

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

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

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

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

このページには機械翻訳が使用されている場合があります (詳細はこちら)。