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 コード付きのポスターを生成します

推薦する

WindowsでcmdからDOSウィンドウに入り、MySQLデータベースにアクセスします。

1. win + R を押して cmd と入力し、DOS ウィンドウに入ります。 2. MySQL...

...

MySQL ビューの原則と使用例の概要

この記事では、MySQL ビューの原理と使用法についてまとめます。ご参考までに、詳細は以下の通りです...

システム外のフォント参照とトランジション効果

コードをコピーコードは次のとおりです。 <span style="font-fami...

Ubuntu環境でxdebugをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で xdebug をコンパイルしてインストールする方法について説明し...

MySQLデータベースインデックスの左端一致原則

目次1. 共同インデックスの説明2. ac はインデックスを使用できますか? 3. 考える4. 最左...

Linux 環境で crontab コマンドを使用して、スケジュールされた定期的な実行タスクを設定します (PHP 実行コードを含む)

この記事では、Linux 環境で crontab コマンドを使用して、タスクの定期的な実行をスケジュ...

Node.js の非同期ジェネレータと非同期反復の詳細な説明

序文ジェネレーター関数は、async/await が導入される前から JavaScript に存在し...

Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

1. 遭遇したいくつかの問題2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テ...

MySQL 結合クエリ構文と例

接続クエリ:これは、2 つのクエリ (またはテーブル) の各行をペアで接続した結果です。つまり、1 ...

LeetCode の SQL 実装 (178. スコアランキング)

[LeetCode] 178.ランクスコアスコアをランク付けする SQL クエリを記述します。2 ...

MySQL 実行ステータスの表示と分析

MySQL のパフォーマンスに問題があると思われる場合は、通常、まずshow processlist...

Linuxで現在のスクリプトの実際のパスを取得する方法

1. 現在のスクリプトの実際のパスを取得します。 #!/bin/bash if [[ $0 =~ ^...

MYSQL接続ポートが占有され、ファイルパスエラーが発生する問題を解決します

今朝、私は Wampserver を使用してローカルの win7 マシン上に PHP 環境を構築し、...

Linux環境でグラフデータベースneo4jを構築する方法の説明

Neo4j (Nosql の 1 つ) は、高性能なグラフ データベース (分散をサポートしていませ...