Dockerコンテナ: アプリケーションを正常に終了させる方法

Dockerコンテナ: アプリケーションを正常に終了させる方法

[[411410]]

ビジネスの継続的な更新と反復により、コンテナは頻繁に起動および停止されます。コンテナが停止しているときに、コンテナ内のプログラムが実行されないと、特に一部の分散トランザクションではデータが不完全になり、データの不整合が発生する可能性があります。このため、コンテナではエレガントなシャットダウン機能が導入されています。

前回のコンテナ内で kill -9 を使用してコンテナを強制終了する方法に関する記事では、シグナルをキャプチャする方法を紹介しました。 docker stop コマンドを実行すると、docker はコンテナ内のプロセス ID 1 のプロセスに SIGTERM (kill -15) シグナルを送信します。しばらく待ってもプログラムが終了しない場合は、SIGKILL (kill -9) シグナルを送信してプロセスを強制終了します。待機時間はパラメータで設定できます

  1. # docker stop ----time=30 foo  

ただし、docker kill コマンドを使用すると、待機時間は発生せず、SIGKILL シグナルが直接送信されます。 Kubernetes は、コンテナがシャットダウンされるときに、docker stop コマンドを通じてコン​​テナを正常にシャットダウンします。コンテナ内のアプリケーションは SIGTERM シグナルを受信すると、新しいアクセス要求を拒否し、未処理のタスクを完了して占有されているリソースを再利用します。以下は、SIGTERM シグナルを取得して正常に終了する方法を示す Go コードの例です。

  1. 用語:= make(chan os.Signal)
  2. シグナル.Notify(term, os.Interrupt, syscall.SIGTERM)
  3. キャンセル := make(chan 構造体{})
  4. 選択{
  5. ケース<-用語:
  6. level .Warn(logger).Log(“msg“, “SIGTERM を受信しました。正常に終了します...“)
  7. #特定のリサイクルアクションを実行する
  8. }

他のプログラミング言語でも同様ですが、ここで注意すべき落とし穴があります。 Docker がシャットダウンされると、プロセス ID 1 のプロセスにのみシグナルが送信されます。つまり、アプリケーションのプロセス ID が 1 でない場合、Docker から送信されたシグナルは受信されません。次の例がこれを示しています。まず、通常の JAVA プログラムである Kill.java を見てみましょう。

  1. クラスキル{
  2. プライベート静的スレッドメイン;
  3. 公共 静的void main(String[] a)は例外をスローします{
  4. Runtime.getRuntime().addShutdownHook(新しいスレッド(新しいRunnable() {
  5. パブリックボイド実行(){
  6. システム。 .println( "TERM" );を出力します
  7. main.interrupt();
  8. ( int i = 0; i < 4; i++)の場合{
  9. システム。 .println( "busy" );出力
  10. 試す {
  11. スレッドをスリープ状態にします(1000);
  12. } (例外 e) をキャッチします {}
  13. }
  14. システム。 .println( "exit" );出力
  15. }
  16. }));
  17. メイン = Thread.currentThread();
  18. )の間{
  19. スレッドをスリープ状態にします(1000);
  20. システム。 .println( "run" );を実行します
  21. }
  22. }
  23. }

「Javac Kill.java」を実行してコードをコンパイルし、Docker イメージにパッケージ化します。 Dockerfile は次のとおりです。

  1. openjdk:8-jre-alpineから
  2. ADD Kill*.class /
  3. エントリポイント [ "java" , "Kill" ]

コンテナを起動してコンテナに入り、「java Kill」プロセス番号が 1 であることを確認します。docker stop コマンドが実行されると、プログラムは TERM シグナルを受信し、正常に終了します。次に、Dockerfile を変更し、起動スクリプト start.sh を追加します。スクリプトは次のように 2 行のみで非常にシンプルです。

  1. #!/bin/sh
  2. ジャバキル

イメージを再構築して起動します。新しい Dockerfile は次のとおりです。

  1. openjdk:8-jre-alpineから
  2. ADD Kill*.class /
  3. start.shを追加します/
  4. エントリポイント [ "sh" "-c" "/start.sh" ]

コンテナを起動した後、コンテナに入ると JAVA プロセスの ID が 7 になり、シェル (プロセス ID は 1) の子プロセスになることがわかります。

  1. # ps -ef
  2. IDユーザー     タイムコマンド
  3. 1 ルート 0:00 {start.sh} /bin/sh /start.sh
  4. ルート 0:00 java キル

このとき、docker stop コマンドを再度実行すると、コンテナは TERM シグナルを受信せず、デフォルトの 10 秒間の正常なシャットダウン時間後に直接終了します (実際には、SIGKILL によって直接強制終了されます)。したがって、エレガントな終了が必要な場合は、アプリケーションのプロセス ID は 1 である必要があります。

PID が 1 でない場合に正常に終了する他の方法はありますか?もちろん、一般的な方法は 2 つあります。

(1)コンテナをシャットダウンする前にprestopスクリプトを実行することができます。スクリプトは最初に JAVA プロセスの ID を動的に取得し、次に kill を介してプロセスに TERM シグナルを直接送信し、それによってプログラムを正常にシャットダウンします。以下のように表示されます。

  1. PID=`pidof java` && kill -SIGTERM $PID。
  2. (2)tiniコンテナを介してアプリケーションを起動することができます。 Tini は ID 1 のプロセスです。シグナルを受信すると、そのシグナルを子プロセスに転送し、子プロセスが適切な終了操作を実行できるようにします。また、tini 自体にもゾンビ プロセスをリサイクルする機能があります。

(2)tiniコンテナを介してアプリケーションを起動することができます。 Tini は ID 1 のプロセスです。シグナルを受信すると、そのシグナルを子プロセスに転送し、子プロセスが適切な終了操作を実行できるようにします。また、tini 自体にもゾンビ プロセスをリサイクルする機能があります。

<<:  黄鶴楼をライトアップ! 2021年テンセントデジタルエコシステムカンファレンスは本日から【ライブ中継予約】を開始します!

>>:  企業がハイブリッド クラウドの導入を検討する必要があるのはなぜですか?

推薦する

華龍翔の改訂に関するSEO分析

Hualong Lane は元々 PHPWind システムを使用しており、元の URL はデフォルト...

#高トラフィック VPS# 1Qcloud -$7/Xen/1g メモリ/30g ハードディスク/10T トラフィック/ソルトレイクシティ、米国

VPS のトラフィックを非常に気にしていて、VPS を安定させ、比較的安価にする必要がある場合は、1...

KEDA を使用して Kubernetes で自動エラスティック スケーリングを実現する方法を学びます

こんにちは、皆さん。私はルガです。今日は、クラウド ネイティブ エコシステムに関連するテクノロジーで...

今日の小売業者がクラウドに移行する必要がある理由

数多くの小売業者とのコミュニケーションや会話の中で、多くの小売業者が管理コストの増加と従来のエンター...

厦門マドコンカンファレンスがSEO担当者に役立つ知識を共有

昨日、4月28日土曜日、私は厦門インタラクティブタイムズ文化コミュニケーション株式会社が開催したMa...

用事代行ウェブサイトのTaskRabbitがシリーズCの資金調達で1300万ドルを調達

用事代行ウェブサイト TaskRabbit は本日、Founders Fund が主導するシリーズ ...

ウェブマスターネットワークからの毎日のレポート:ダブル12はタオバオのジレンマを反映している:音楽の課金は嘘

1. 電子商取引は「ダブル12」で再び苦戦、小売業者は売上に楽観的ではない電子商取引業界は今、201...

アリババクラウド、天猫ダブル11で新たなゲームプレイ:グループ購入で300万の現金をシェア

クラウド コンピューティングは、Tmall Double 11 での消費と同じくらい人気があると言う...

ペイパルは中国での事業はゲームに注力しており、複数の決済レートを導入する予定だと述べた。

6月23日のニュース:最近、決済会社PayPal Chinaのシニアディレクターである張塵氏は、テン...

企業がハイブリッド クラウド戦略を採用する必要があるのはなぜですか?

クラウドに移行する企業は、パブリック クラウドとプライベート クラウドのどちらを選択するかというジレ...

VR 仮想現実の簡単な分析: VR 仮想現実技術とは何ですか?

VRバーチャルリアリティとは何ですか?仮想現実技術(略して VR)。精神世界技術とも呼ばれます。これ...

ブランドプロモーションのためのQ&Aプラットフォーム

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますインターネ...

Tujia.comの急速な資金調達の謎を解明:開発が最優先

Tujia.com の急速な発展から私たちが学んだのは、ウェブサイトがいかに飛躍するかではなく、ウェ...

災害復旧について話すとき、私たちは何について話すのでしょうか?

災害復旧というと、多くの学生は「同じ都市でのデュアルアクティブ」、「2 つの場所に 3 つのセンター...

顧客の75%は、強化されたホスティングおよびクラウドコンピューティングサービスに対してプレミアムを支払う用意がある

調査によると、クラウド コンピューティングのユーザーは、セキュリティ、稼働時間、パフォーマンスなどの...