第3章 コンテナーの使用

コンテナーは、圧縮されたファイルから展開したコンテナーイメージにあるファイルから生成した、実行中または停止したプロセスを表します。本セクションでは、コンテナーを実行し、そのコンテナーを使用するツールを説明します。

3.1. コンテナーの実行

podman run コマンドを実行すると、コンテナーイメージから起動して新しいコンテナーを作成できます。podman run コマンドラインに渡すコマンドは、コンテナーの内部を実行環境と見なします。そのため、デフォルトでは、ホストシステムはほとんど確認できません。たとえば、デフォルトで実行中のアプリケーションからは、以下が確認できます。

  • コンテナーイメージが提供するファイルシステム
  • コンテナー内からの新規プロセステーブル (ホストからのプロセスは確認できません)

コンテナーに利用できるホストのディレクトリーを作成したり、コンテナーからホストにネットワークポートをマッピングしたり、コンテナーが使用できるメモリーの量を制限したり、コンテナーで利用できる CPU 共有を拡張したりする場合は、podman run コマンドラインで実行できます。ここでは、さまざまな機能を有効にする podman run コマンドラインの例をいくつか紹介します。

例 1 (クイックコマンドを実行) - この podman コマンドは、cat /etc/os-release コマンドを実行して、コンテナの基盤として使用されているオペレーティングシステムの種類を確認します。コンテナーがコマンドを実行すると、コンテナーは終了し、削除されます (--rm)。

# podman run --rm registry.redhat.io/ubi8/ubi cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="8.0 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.0"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.0 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8.0:latest"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.0
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.0"
...

例 2 (コンテナーの Dockerfile を表示) - これは、ホストからコンテナーの内容を検証するためのクイックコマンドを実行する例です。Red Hat Provides には、/root/buildinfo が組み込まれている Dockerfile があります。この場合は、ホストからボリュームをマウントする必要がありません。

# podman run --rm \
      registry.access.redhat.com/rhel8/rsyslog \
      ls /root/buildinfo
Dockerfile-rhel8-rsyslog-8

これで Dockerfile が呼び出されたことが分かったため、その内容を一覧表示できます。

# podman run --rm registry.access.redhat.com/rhel8/rsyslog \
    cat /root/buildinfo/Dockerfile-rhel8-rsyslog-8
FROM sha256:eb205f07ce7d0bb63bfe560...
LABEL maintainer="Red Hat, Inc."

RUN INSTALL_PKGS="\
rsyslog \
rsyslog-gnutls \
rsyslog-gssapi \
rsyslog-mysql \
rsyslog-pgsql \
rsyslog-relp \
" && yum -y install $INSTALL_PKGS && rpm -V --nosize
    --nofiledigest --nomtime --nomode $INSTALL_PKGS && yum clean all
LABEL com.redhat.component="rsyslog-container"
LABEL name="rhel8/rsyslog"
LABEL version="8.0"
...

例 #3 (コンテナーでシェルを実行) - コンテナーを使用して bash シェルを起動することで、コンテナーを調べ、その内容を変更できます。これにより、コンテナーの名前は、mybash に設定されます。-i は対話型セッションを作成し、-t で端末セッションを開きます。-i を使用しないと、シェルが開き、そして終了します。-t を使用しないと、シェルは開いたままになりますが、シェルには何も入力できません。

コマンドを実行すると、シェルプロンプトが表示され、コンテナーから実行コマンドを開始できます。

# podman run --name=mybash -it registry.redhat.io/ubi8/ubi /bin/bash
[root@ed904b8f2d5c/]#  yum install procps-ng
[root@ed904b8f2d5c/]#  ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 00:46 pts/0    00:00:00 /bin/bash
root        35     1  0 00:51 pts/0    00:00:00 ps -ef
[root@49830c4f9cc4/]# exit

コンテナーを終了すると実行しなくなりますが、新しいソフトウェアパッケージがインストールされた状態で残ります。podman ps -a を実行して、コンテナーの一覧を表示します。

# podman ps -a
CONTAINER ID IMAGE                 COMMAND   CREATED        STATUS                PORTS NAMES        IS INFRA
1ca061b47bd7 .../ubi8/ubi:latest   /bin/bash 8 minutes ago  Exited 12 seconds ago       musing_brown false
...

podman start コマンドに -ai オプションを付けると、コンテナーを再度起動できます。以下に例を示します。

# podman start -ai mybash
[root@ed904b8f2d5c/]#

例 4 (ログファイルのマウントをバインド) - ホストシステムで利用可能なコンテナーからログメッセージを作成する 1 つの方法は、コンテナーでホストの /dev/log デバイスをバインドマウントすることです。この例は、log_test という名前の RHEL コンテナーでアプリケーションを実行する方法を示しています。ここでは、ログメッセージ (この場合は単なる logger コマンド) を生成し、そのメッセージを、ホストから、コンテナーにマウントされている /dev/log デバイスに転送します。--rm オプションは、実行後にコンテナーを削除します。

# podman run --name="log_test" -v /dev/log:/dev/log --rm \
     registry.redhat.io/ubi8/ubi logger "Testing logging to the host"
# journalctl -b | grep Testing
Nov 12 20:00:10 ubi8 root[17210]: Testing logging to the host