web-dev-qa-db-ja.com

Dockerコンテナをsystemdサービスとして適切に処理する方法は?

私は、systemdユニットを介してDockerコンテナーによって実装される多くのサービス(データベース、Webサーバーなど)を処理します。動作しますが、システムのシャットダウンには非常に長い時間がかかり、Dockerサービスがシャットダウンするのを待っているようです。

これは、DockerCEを使用してDebianStretchの下で仮想マシンで作成したsystemdユニットの例です。

/ lib/systemd/system/mariadb.service

[Unit]
Description=MariaDB
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --rm \
    --name=mariadb \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    -e MYSQL_DATABASE=test \
    -e MYSQL_USER=user \
    -e MYSQL_PASSWORD=user \
    -v /var/lib/mysql:/var/lib/mysql \
    mariadb:latest
ExecStop=-/usr/bin/docker stop mariadb # See UPDATEs 1 & 2

[Install]
WantedBy=multi-user.target

Systemctlコマンドを使用すると、サービスが数秒で正しく開始および停止します。しかし、システムをシャットダウンすると、次のように表示されます。

VM screenshot 1VM screenshot 2VM screenshot 3

それは3分以上続きます。 systemdを介して実行されているコンテナーが多数ある場合は、さらに長くなる可能性があります。

この問題はMariaDBに固有のものではありません。

Systemdを介してDockerコンテナを処理し、余分なシャットダウン時間を回避するためのより良い方法はありますか?

  • 更新1:Bennett Hardwickがコメントで示唆したように、サービスの定義からExecStopディレクティブを削除しようとしました。サービスは3分ではなく1分30後に停止するので、より良いようです。

  • 更新2:ExecStopディレクティブのdocker stopコマンドにオプション-tを追加しようとしました( https://docs.docker.com/engine/reference/commandline/stop/ )。効果はありません。

2
berty

もはや維持されていないソリューションは systemd-docker であり、次のように記述されます。

これはdockerrunのラッパーであるため、systemdでDockerコンテナーを正常に実行できます。このラッパーが行う重要なことは、コンテナープロセスをDockerによってセットアップされたcgroupsからサービスユニットのcgroupに移動することです。これは他の多くの癖を処理するので、systemdでDockerを実行することのすべての影響を理解するためにドキュメントを読んでください。

このラッパーを使用すると、systemctlまたはdocker CLIを介してコンテナーを管理でき、すべての同期が維持されます。さらに、systemdおよびsystemd-notifyのすべてのcgroup機能を活用できます。

Systemd-dockerを最近のLinuxバージョンで動作させる問題については、投稿で説明されています 最近のsystemdやdockerのリリースでは動作しません 、james-cxxという名前のユーザーが成功を報告しています:

次の方法で、systemd-dockerをUbuntu18.04で動作させることができました。

私のguessは、dockerがデフォルトでcgroupにsystemdを使用しないことです。「デリゲートの問題はまだ存在し、systemdは現在コンテナーに必要なcgroup機能セットをサポートしていないためです。 (docker.serviceユニットファイルごとに)dockerによって実行されます。systemd-dockerはcgroupに対してsystemdを予期しているため、open /sys/fs/cgroup/system.slice/docker.service/cgroup.procs: no such file or directoryエラーが発生します。 --cgroups name=systemdを設定すると、Dockerのデフォルトが上書きされるようですが、docker.serviceユニットファイルに不吉なメモがあるため、これがどのような副作用をもたらす可能性があるかはわかりません。

Systemd-dockerの代わりに、 rkt を使用することもできます。

rktは、最新の本番クラウドネイティブ環境向けに開発されたアプリケーションコンテナエンジンです。ポッドネイティブのアプローチ、プラグ可能な実行環境、および他のシステムとの統合に理想的な明確に定義された表面積を備えています。

4
harrymc