7.2. systemd でコンテナーでサービスの起動

systemd 初期化システムを含むパッケージは、公式の Red Hat Enterprise Linux Init ベースイメージである registry.access.redhat.com/ubi8/ubi-init に含まれています。つまり、これは、systemd で管理するために作成されたアプリケーションが、コンテナー内で起動および管理できることを示しています。systemd を実行しているコンテナーは、以下を行います。

  • /sbin/init プロセス (systemd サービス) を起動して、コンテナーで PID 1 として実行します。
  • コンテナーにインストールされ、有効になっているすべての systemd サービスを、依存関係の順番に起動します。
  • systemd により、サービスを再起動したり、コンテナーで開始したサービスのゾンビプロセスを強制終了したりできます。

systemd サービスとして使用する準備ができているコンテナーを構築する一般的な手順は以下のとおりです。

  • コンテナーに systemd-enabled サービスを含むパッケージをインストールします。これには、Apache Web Server (httpd) 、FTP サーバー (vsftpd) 、プロキシーサーバー (squid) など、RHEL に同梱されるサービスが多数含まれます。この例では、Apache (httpd) Web サーバーをインストールします。
  • systemctl コマンドを使用して、コンテナーでサービスを有効にします。
  • コンテナーで使用するサービスのデータを追加します (この例では、Web サーバーのテストページを追加します)。実際のデプロイメントでは、おそらく外部ストレージに接続します。
  • サービスへのアクセスに必要なポートを公開します。

この例では、コンテナーをホストシステムで実行している場合に、systemd サービス (/sbin/init) により自動的に起動する Web サーバー (httpd) をインストールして設定する Dockerfile を作成して、コンテナーを構築します。

  1. Dockerfile の作成 - このディレクトリーで、以下の内容を含む Dockerfile という名前のファイルを作成します。

    FROM registry.access.redhat.com/ubi8/ubi-init
    RUN yum -y install httpd; yum clean all; systemctl enable httpd;
    RUN echo "Successful Web Server Test" > /var/www/html/index.html
    RUN mkdir /etc/systemd/system/httpd.service.d/; echo -e '[Service]\nRestart=always' > /etc/systemd/system/httpd.service.d/httpd.conf
    EXPOSE 80

    Dockerfile は、httpd パッケージをインストールし、システムの起動時 (つまりコンテナーが起動した時) に httpd サービスが開始するようにし、テストファイル (index.html) を作成し、Web サーバーをホスト (ポート 80) に公開し、コンテナーが起動すると systemd init サービス (/sbin/init) を開始します。

  2. コンテナーの構築 - Dockerfile を含むディレクトリーから、次のコマンドを入力します。

    # podman build --format=docker -t mysysd .
  3. Selinux のパーミッションを開く - システムで SELinux が有効になっている場合は、以下に示すように、systemd でコンテナーを実行する container_manage_cgroup ブール値を有効にする必要があります (詳細は「Container running systemd fails to run after upgrade to Red Hat Enterprise Linux 7.5 」を参照)。

    # setsebool -P container_manage_cgroup 1
  4. コンテナーの実行 - コンテナーを構築し、mysysd という名前を付けたら、次のコマンドでコンテナーを実行します。

    # podman run -d --name=mysysd_run -p 80:80 mysysd

    このコマンドでは、mysysd イメージが mysysd_run コンテナーをデーモンプロセスとして実行し、コンテナーのポート 80 がホストシステムのポート 80 に公開されます。

  5. コンテナーが実行していることを確認 - コンテナーが実行中で、サービスが機能していることを確認するには、以下のコマンドを実行します。

    # podman ps | grep mysysd_run
    a282b0c2ad3d  localhost/mysysd:latest  /sbin/init  15 seconds ago  Up 14 seconds ago  0.0.0.0:80->80/tcp  mysysd_run
    # curl localhost/index.html
    Successful Web Server Test

この時点で、Web サーバーをコンテナーの systemd サービスとして起動するコンテナーがあります。Dockerfile を変更し、必要に応じてデータを設定し、ポートを開いて、同様の方法で任意のサービスをインストールおよび実行します。


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