ご存知のとおり、デフォルトでは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システムの起動時間を分析する