GNU/Linux >> Linux の 問題 >  >> Rocky Linux

Systemd(systemctl)を使用してAlmalinuxまたはRocky Linux8Dockerコンテナを実行します

ご存知のとおり、デフォルトではDockerコンテナはsystemdなしで実行されます ユーザーがsystemctlを使用できないことを意味します 指図。これは、Dockerで作成したコンテナがinitで起動されていないためです。ここでは、Alamlinux / Rocky Linux / CentOS8Dockerコンテナ内でSystemdを実行する方法を学びます。

問題は、なぜエラーが発生するのかということです systemctlを実行するたびに Dockerコンテナ内のコマンド?その背後にある理由は何ですか?

実際、Docker開発者も推奨しているように、コンテナー内で単一のサービスを使用する必要があります。つまり、コンテナーを使用してWordPressをインストールすることを計画している場合は、アプリケーションごとに1つのコンテナーが必要です。たとえば、あるコンテナではApache + PHPを使用し、別のコンテナではMySQLを使用します。したがって、Dockerはこのモデルで開発されました。つまり、複数のサービスを並行して管理および実行するために、標準のLinuxシステムにあるSystemdは必要ありません。したがって、Dockerが異なるアプリに対して複数のコンテナーを実行することを提案しているため、開発者はコンテナーの分離とセキュリティを向上させるためにこのシステムプロセスマネージャーを無効にしました。これが、systemctlを使用するたびにエラーが発生する理由です。 コマンド。

ヒント-Systemdとは何ですか?

Systemdはシステムおよびセッションマネージャーです( init system )起動プロセスからシャットダウンまで、コンピュータの動作時間全体にわたってシステムで実行されているすべてのサービスを管理する責任があります。ブートプロセスを可能な限り短くするために、プロセスは常に(可能な限り)並行して開始されます。

また、systemd Linuxシステムでトリガーする最初のプロセスです。これがps -auxを実行する理由です。 Linux端末でコマンドを実行すると、最初のプロセス(PID 1)がsystemdに割り当てられていることがわかります。 。

ps -aux

一方、コンテナ内で同じコマンドを実行すると、 PID(1)が表示されます。 システムの最初のプロセスがbashに割り当てられたことを意味します 。

したがって、これが、 systemctlを使用してDockerコンテナ内でサービスを開始しようとするたびにエラーが発生する理由です。 コマンド。

AlmalinuxまたはRockyLinux8Dockerコンテナ内にsystemdをインストールまたは有効にする

Dockerファイルを作成する

AlmalinuxまたはRockyを使用してコンテナを作成する前に実行する必要のある特定のコマンドがあります。したがって、これらを1つのコマンドで実行するのではなく、dockerファイルに追加して、systemdで有効なDockerイメージを作成しましょう。 。

ディレクトリを作成しますsysmd」としましょう ‘:

mkdir sysmd

切り替え:

cd sysmd

Dockerファイルを作成します:

nano Dockerfile

Systemdを取得するためにDockerファイルで実行するコマンド

次に、指定されたコマンドをコピーしてDockerファイルに貼り付けます。

almalinuxを変更します rockylinuxへ 、RockyLinuxを実行するためのDockerイメージを構築する場合。

ファイル内の指定されたコマンドは、Dockerイメージ(AlmalinuxまたはRocky)をプルし、ボリュームのマウントとSystemdを有効にするために必要なコマンドを含む次のコマンドを実行します。また、systemdに関連付けられているいくつかのファイルを削除して、コマンドラインのDockerコンテナで不要な他のサービスを有効にします。

FROM almalinux
ENV container docker

RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done);

RUN rm -rf /lib/systemd/system/multi-user.target.wants/ \
&& rm -rf /etc/systemd/system/.wants/ \
&& rm -rf /lib/systemd/system/local-fs.target.wants/ \
&& rm -f /lib/systemd/system/sockets.target.wants/udev \
&& rm -f /lib/systemd/system/sockets.target.wants/initctl \
&& rm -rf /lib/systemd/system/basic.target.wants/ \
&& rm -f /lib/systemd/system/anaconda.target.wants/*

VOLUME [ “/sys/fs/cgroup” ]
CMD ["/usr/sbin/init"]

Ctrl + O を押して、ファイルを保存します Enterを押します キーを押してから、 Ctrl + X を押します ファイルを終了します。

systemdを使用してDockerコンテナファイルをビルドする

ここで、Dockerファイルで指定されたコマンドを渡しながら、コンテナーイメージをフェッチしてビルドします。そのために、docker buildというコマンドがあります。 同じものを使用します。

docker build -t almalinux-md .

almalinux-mdを変更できます 画像に付けたい名前を付けます。また、ドットを追加することも忘れないでください( )上記のコマンドで指定されているように、 buildをガイドします ディレクトリ内でDockerファイルを検索するコマンド。

ファイルで指定されたすべてのコマンドがdocker buildによって実行されたことがわかります。 付けた名前で新しい画像を作成します。

出力:

Sending build context to Docker daemon 2.56kB 
Step 1/6 : FROM almalinux 
---> 4ca63ce1d8a9 
Step 2/6 : ENV container docker 
---> Running in 57d447426e1a 
Removing intermediate container 57d447426e1a 
---> fa30ff65bd36 
Step 3/6 : RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); 
---> Running in bc3b161040e6 
Removing intermediate container bc3b161040e6 
---> 6f51cf56580e 
Step 4/6 : RUN rm -rf /lib/systemd/system/multi-user.target.wants/ && rm -rf /etc/systemd/system/.wants/ && rm -rf /lib/systemd/system/local-fs.target.wants/ && rm -f /lib/systemd/system/sockets.target.wants/udev && rm -f /lib/systemd/system/sockets.target.wants/initctl && rm -rf /lib/systemd/system/basic.target.wants/ && rm -f /lib/systemd/system/anaconda.target.wants/* 
---> Running in 082cfe33fc89 
Removing intermediate container 082cfe33fc89 
---> 9f8224491315 
Step 5/6 : VOLUME [ “/sys/fs/cgroup” ] 
---> Running in fe0177b04643 
Removing intermediate container fe0177b04643 
---> 212b1b01046b 
Step 6/6 : CMD ["/usr/sbin/init"] 
---> Running in bff7b36d4964 
Removing intermediate container bff7b36d4964 
---> 9b8dfd7c1d81 
Successfully built 9b8dfd7c1d81 
Successfully tagged almalinux-md:latest

作成されたAlmalinuxまたはRockyLinuxイメージを確認します

それでは、コンテナを起動するためにそこに作成したイメージがあるかどうかを確認しましょう。

docker images

systemdを使用してDockerコンテナを作成または起動します

作成したばかりのイメージがあります。それを使用してコンテナを作成しましょう。

docker run -itd --privileged--name h2smedia almalinux-md

h2smedia はコンテナに付けたいきれいな名前ですが、almalinux-md 作成した画像の名前です。自分の画像に置き換えてください。

警告 :ここでは、特権でコンテナを実行しています フラグ、これはコンテナに追加の権限を与えます。簡単に言えば、コンテナはホストマシンに対する権限またはルート権限を持ちます。このようなコンテナーは、通常、(ホストの)直接ハードウェアアクセスを許可する場合、またはコンテナー内でコンテナーを実行する場合に使用します。したがって、外部ユーザーが一部のサービスにアクセスする商用または企業での使用には、このようなコンテナーを使用しないことをお勧めします。開発またはローカル目的でのみ作成してください。これが、Systemdファシリティまたはinitをコンテナに含めることができるように、このフラグを使用して上記のコマンドを実行した理由です。

コンテナBashに切り替え

それでは、コンテナのコマンドラインにアクセスして、systemctlを実行できるかどうかを確認しましょう。 コマンドかどうか。

これで、Systemdを使用したDocker Imageができました。これにより、ローカルアプリケーションの開発またはテストに必要な数のコンテナーを作成できます。

その他のチュートリアル:

•AlmaLinux8にDockerコンテナをインストールしてセットアップする方法
•LinuxでSystemdサービスユニットファイルを作成する方法
•Systemdを使用してLinuxシステムの起動時間を分析する


Rocky Linux
  1. AlmaLinuxとRockyLinux

  2. LinuxでSystemctlを使用してSystemdサービスを管理する方法

  3. AlmaLinux /RockyLinuxにDockerをインストールする方法

  1. 例を使用してDockerRunコマンドを使用する方法

  2. RockyLinux8にDockerContainerをインストールしてセットアップする方法

  3. docker は Linux コンテナー内で実行できますか?

  1. Dockerを使用してJenkinsコンテナをSystemdサービスとして実行する方法

  2. Rocky Linux 8 / CentOS 8 / RHEL 8/AlmaLinuxにDockerをインストールする方法

  3. SystemdとDockerを使用してJenkinsをインストールして実行する