Docker実行コンテナが作成状態にある問題についての簡単な説明

Docker実行コンテナが作成状態にある問題についての簡単な説明

最近の問題としては、次のような現象があります。

システムには、docker run コマンドを継続的に実行してコンテナを実行するテスト スクリプトがあります。テスト中に、コンテナが「Up」状態まで完全に実行されず、「created」状態のままになることがあり、非常に奇妙であることがわかりました。

上記の環境では、まず「作成済み」状態のコンテナと dockerd ログをチェックします。

(1)dockerdログには「post create」リクエストのみが含まれますが、コンテナに対する「post start」リクエストは受信されません。

(2)docker startを手動で実行すると、コンテナを「Up」状態にプルすることができ、コンテナとイメージ自体に問題がないことが示されます。

上記の現象から、「docker run」プロセスが完了しておらず、docker run が終了しているのではないかと推測されます。早速「docker run」を見てみましょう。cli/command/container/run.go では、「docker run」コマンドの処理関数 func runRun() の実装が以下のような状況になっています。

func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions, copts *runco​​nfigopts.ContainerOptions) エラー {
 。 。 。 。 。 。
 createResponse、err := createContainer(ctx、dockerCli、config、hostConfig、networkingConfig、hostConfig.ContainerIDFile、opts.name)
 。 。 。 。 。 。
 エラーの場合:= client.ContainerStart(ctx, createResponse.ID, types.ContainerStartOptions{}); エラー!= nil {)
 。 。 。 。 。
}

createContainer() 関数を実行した後に「docker run」コマンドが異常終了した場合 (kill シグナルに遭遇するなど)、ContainerStart() 関数は実行を継続できません。これにより、コンテナは正常に作成され、「作成済み」状態になりますが、実際には dockerd に「post start」が与えられず、最終的に上記の現象が発生します。

そのため、日常業務においては「docker run」コマンドが正常に実行されているか、異常終了していないか、終了時の戻り値が 0 になっていないかなどを監視する必要があります。

補足: Dockerコンテナを実行する3つの方法

最初の解決策

Docker コンテナを実行すると、多くの場合、コンテナは Exited 状態になります。

たとえば、次のコマンド docker run -d --name nginx -P nginx /bin/bash は対話モードが完了した後に終了し、再度 docker start は機能しません。

実行後にコンテナを実行し続けたい場合は、/bin/bash を削除するだけです。

2番目の解決策

docker run -it --name nginxit -P nginx

現在、コンテナ nginxit は終了状態になっています。

dockerで起動すれば使える

docker で nginxit を起動する

3 番目は 2 番目と似ています。

docker run -it --name nginxit2 -P nginx /bin/bash

フォアグラウンドとバックグラウンドのインタラクションを終了する必要があります。

root@de4dbb27f905:/# 終了

次に再起動します。

docker で nginxit2 を起動します

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Dockerは終了状態で起動します
  • docker run -v はデータボリュームを異常にマウントし、コンテナのステータスは常に再起動になります。
  • Dockerコンテナの状態変換の実装
  • docker run後、ステータスは常にExitedになります
  • Zabbix は Docker コンテナのステータスを監視します [推奨]
  • Dockerコンテナシェルスクリプトの実行ステータスを監視する方法

<<:  MySQL 上級学習インデックスの長所と短所、使用ルール

>>:  jQuery キャンバスは QR コード付きのポスターを生成します

推薦する

TypeScript 列挙型

目次1. 概要2. デジタル列挙2.1 逆マッピング3. 文字列の列挙4. const列挙5. まと...

Zabbix による SQL Server の監視プロセスの詳細な説明

Zabbix による SQL Server の監視を見てみましょう。まずfreetdsをダウンロード...

LeetCode の SQL 実装 (183. 注文をしたことがない顧客)

[LeetCode] 183.注文しない顧客Web サイトに、Customers テーブルと Or...

MySQLの基本操作学習ノートテーブル

テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...

Node.js ファイルのコピー、フォルダの作成、その他の関連操作

NodeJS は次のファイルをコピーします:通常、小さなファイルのコピー操作では、ストリーム パイプ...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

MySQLパラダイムの使用に関する詳細な説明

1. パラダイムこのパラダイムの英語名は Normal Form であり、1970 年代にリレーショ...

3列レイアウトを実現するCSS3フレキシブルボックスフレックス

タイトルの通り、高さは既知で、左と右の列の幅は 300 ピクセル、中央は適応型です。弾性ボックス自体...

Reactでプロキシを有効にする2つの実用的な方法

プロキシを有効にする2つの方法React には、直接使用できるカプセル化された Ajax リクエスト...

Linux で起動時にプログラムを自動的に実行させる最も簡単な方法

たくさん集めましたが、すべて失敗に終わりました。最終的に、この方法は優れており、使用に影響を与えない...

Linux xargsコマンドの使用

1. 機能: xargs は、stdin 内のスペースまたは改行で区切られたデータをスペースで区切ら...

MySQL のデフォルトのストレージ エンジンを変更する方法

mysql ストレージ エンジン: MySQL サーバーはモジュール スタイルを採用しており、特にス...

JavaScript の寄生的構成継承についての簡単な説明

コンポジション継承組み合わせ継承は、疑似古典的継承とも呼ばれます。これは、昨日説明したプロトタイプ ...

React、Angular、Vueの3つの主要なフロントエンド技術の詳細説明

目次1. 反応する基本的な使い方注目すべき機能クラスコンポーネント仮想DOMライフサイクルメソッドJ...

HTML の表の行と列を結合する問題の解決策の詳細な説明

私たちが構築しようとしていたウェブサイトには、長い文章だけでなく、多数の表も含まれており、表のレイア...