Dockerが正常に起動しない原因と解決策を詳しく解説

Dockerが正常に起動しない原因と解決策を詳しく解説

1. Docker 起動時の異常なパフォーマンス:

1. ステータスが繰り返し再起動している場合は、コマンドで確認します。

$ docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
21c09be88c11 docker.xxxx.cn:5000/xxx-tes/xxx_tes:1.0.6 "/usr/local/tomcat..." 9日前 再起動中 (1) 1秒未満前 xxx10

2. Docker ログには明らかな問題があります。

$docker logs [コンテナ名/コンテナID]

2. Docker 起動異常の考えられる原因:

2.1. メモリ不足

Docker を起動するには少なくとも 2G のメモリが必要です。まず、free -mh コマンドを実行して、残りのメモリが十分かどうかを確認します。

メモリを直接表示する

$無料-mh
      使用可能な使用済み空き共有バフ/キャッシュの合計
メモリ: 15G 14G 627M 195M 636M 726M
スワップ: 0B 0B 0B

ログを分析する

時々、メモリが一時的に過負荷になり、一部のプロセスが強制終了することがあります。メモリは十分であるように見えますが、実際には Docker が繰り返し再起動します。Docker ログとシステム ログ情報によるさらなる分析が必要です。

Dockerログの分析

メモリオーバーフローの情報を確認するには、dockerログを確認してください。情報を見つけるには注意深く読む必要があります。一番下には記載されていません。

$docker logs [コンテナ名/コンテナID]|less 
Java HotSpot(TM) 64 ビット サーバー VM 警告: INFO: os::commit_memory(0x0000000769990000, 1449590784, 0) が失敗しました。エラー = 'メモリを割り当てられません' (errno = 12)
#
# Java Runtime Environment を続行するにはメモリが不足しています。
# ネイティブ メモリ割り当て (malloc) で、予約済みメモリをコミットするための 1449590784 バイトの割り当てに失敗しました。
# 詳細情報を含むエラー レポート ファイルは次のように保存されます。
# //hs_err_pid1.log
Java HotSpot(TM) 64 ビット サーバー VM 警告: INFO: os::commit_memory(0x0000000769990000, 1449590784, 0) が失敗しました。エラー = 'メモリを割り当てられません' (errno = 12)
#
# Java Runtime Environment を続行するにはメモリが不足しています。
# ネイティブ メモリ割り当て (malloc) で、予約済みメモリをコミットするための 1449590784 バイトの割り当てに失敗しました。
# 詳細情報を含むエラー レポート ファイルは次のように保存されます。
# /tmp/hs_err_pid1.log
Java HotSpot(TM) 64 ビット サーバー VM 警告: INFO: os::commit_memory(0x0000000769990000, 1449590784, 0) が失敗しました。エラー = 'メモリを割り当てられません' (errno = 12)
#
# Java Runtime Environment を続行するにはメモリが不足しています。
# ネイティブ メモリ割り当て (malloc) で、予約済みメモリをコミットするための 1449590784 バイトの割り当てに失敗しました。
# ログ ファイルを保存できません。画面にダンプします。
#
# Java Runtime Environment を続行するにはメモリが不足しています。
# ネイティブ メモリ割り当て (malloc) で、予約済みメモリをコミットするための 1449590784 バイトの割り当てに失敗しました。
# 考えられる理由:
# システムの物理RAMまたはスワップ領域が不足しています
# 32ビットモードでは、プロセスサイズの制限に達しました
# 考えられる解決策:
# システムのメモリ負荷を軽減
# 物理メモリまたはスワップ領域を増やす
# スワップバッキングストアがいっぱいかどうか確認する
# 64 ビット OS で 64 ビット Java を使用する
# Java ヒープサイズを減らす (-Xmx/-Xms)
# Javaスレッドの数を減らす
# Java スレッドのスタック サイズを減らす (-Xss)
# -XX:ReservedCodeCacheSize= でより大きなコードキャッシュを設定します
# この出力ファイルは切り捨てられているか不完全である可能性があります。
#
# メモリ不足エラー (os_linux.cpp:2756)、pid=1、tid=140325689620224
#
# JRE バージョン: (7.0_79-b15) (ビルド)
# Java VM: Java HotSpot(TM) 64 ビット サーバー VM (24.79-b02 混合モード linux-amd64 圧縮 oops)
# コアダンプが書き込まれました。デフォルトの場所: //core または core.1
#

システムログを分析する

システム ログを確認すると、メモリ オーバーフローによりプロセスが強制終了された記録が多数見つかりました。

$grep -i 'メモリ不足' /var/log/messages
4月7日 10:04:02 centos106 カーネル: メモリ不足: プロセス 1192 (java) を強制終了するか、子プロセスを犠牲にする (スコア 54)
4月7日 10:08:00 centos106 カーネル: メモリ不足: プロセス 2301 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:09:59 centos106 カーネル: メモリ不足: プロセス 28145 (java) を強制終了するか、子プロセスを犠牲にする (スコア 52)
4月7日 10:20:40 centos106 カーネル: メモリ不足: プロセス 2976 (java) を強制終了するか、子プロセスを犠牲にする (スコア 54)
4月7日 10:21:08 centos106 カーネル: メモリ不足: プロセス 3577 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:21:08 centos106 カーネル: メモリ不足: プロセス 3631 (java) を強制終了するか、子プロセスを犠牲にする (スコア 47)
4月7日 10:21:08 centos106 カーネル: メモリ不足: プロセス 3634 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:21:08 centos106 カーネル: メモリ不足: プロセス 3640 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:21:08 centos106 カーネル: メモリ不足: プロセス 3654 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:27:27 centos106 カーネル: メモリ不足: プロセス 6998 (java) を強制終了するか、子プロセスを犠牲にする (スコア 51)
4月7日 10:27:28 centos106 カーネル: メモリ不足: プロセス 7027 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:28:10 centos106 カーネル: メモリ不足: プロセス 7571 (java) を強制終了するか、子プロセスを犠牲にする
4月7日 10:28:10 centos106 カーネル: メモリ不足: プロセス 7586 (java) を強制終了するか、子プロセスを犠牲にする

2.2. ポートの競合

Docker のリスニング ポートが他のプロセスによって占有されています。この問題は、新しくデプロイされたサービスや、元のマシンに新しいバックグラウンド サービスをデプロイするときに発生しがちです。そのため、デプロイ前にコマンドを実行して、ポートが占有されているかどうかを確認する必要があります。オンラインになった後にポートが占有されていることが判明した場合は、使用可能なポートに変更して再起動する必要があります。

確認コマンド: $netstat -nltp|grep [計画ポート番号]

3. 対策

3.1. メモリ不足の対策:

対策1:
3.1.1 実行時間が長すぎると、saltstack ミニオンが大量のメモリを占有し、再起動が必要になる場合があります。再起動コマンドが機能しない場合があります。主に実行状態を確認します。停止に失敗した場合は再起動します。

対策2:
3.2.2 ELK ログ収集プログラムまたはその他の Java プロセスが占有するスペースが多すぎる場合は、top コマンドと ps コマンドを使用して確認し、プロセスの役割を慎重に判断し、業務に影響を与えずに関連プロセスを停止します。

戦略3:
占有されているメモリ(バッファ/キャッシュ)を解放します。
$sync #メモリデータをディスクに書き込む
$echo 3 > /proc/sys/vm/drop_caches #占有されているメモリを解放する

対策4:
バッファ/キャッシュが高すぎるためにメモリが不足しているのではなく、多くの必要なプロセスによってメモリが実際に消費されている場合もあります。この場合、マシンのリソースの割り当てと使用の観点から問題を検討して解決する必要があります。

3.2 港湾紛争への対策

対策1:
通常、この問題は、新しくデプロイされたサービス、または元のマシンに新しいバックグラウンド サービスを展開するときに発生する傾向があります。したがって、デプロイする前に、ポートが占有されているかどうかを確認するコマンドを実行する必要があります。オンラインになった後にポートが占有されていることが判明した場合は、使用可能なポートに変更して再起動する必要があります。
確認コマンド: $netstat -nltp|grep [計画ポート番号]

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • CentOS7は起動できない問題を解決するためにdockerをインストールします
  • DockerがCentOSイメージを起動する方法の詳細な説明
  • CentOS7 docker サービスの起動失敗の解決策と実装手順
  • Dockerで複数のサービスを同時に起動する方法
  • Dockerでスタートアップコンテナに入る方法
  • Docker イメージを作成してコンテナを起動する 2 つの方法の違い (要約)
  • Docker での MySQL の初期化と起動の失敗の解決策
  • Dockerコンテナでアプリケーションサービスを自動的に起動する方法の例
  • Dockerコンテナのセルフスタートを実装する方法
  • Dockerコンテナを作成、起動、停止する方法

<<:  Vueフィルターとカスタム命令の使用

>>:  MySQL 8.0.11 MSI バージョンのインストールと構成のグラフィック チュートリアル

推薦する

時間別にグループ化された MySQL クエリ ステートメント

年、月、週、日グループによる MySQL クエリ1. 学年別検索 SELECT DATE_FORMA...

React リストバーとショッピングカートコンポーネントの使用の詳細な説明

この記事では、Reactリストバーとショッピングカートコンポーネントの具体的なコードを参考までに紹介...

SQLと各種NoSQLデータベースの使用シナリオの説明

SQL はメイントランクです。なぜ私はこのように理解するのでしょうか。技術的な観点からリレーショナル...

HTML テーブル マウス ドラッグ ソート機能

効果画像: 1. ファイルをインポートする<script src="js/jquer...

MySQLが間違ったインデックスを選択する理由と解決策

MySQL では、テーブルに複数のインデックスを指定できますが、ステートメントの実行時に、使用するイ...

HTML の基本 - ハイパーリンク スタイルを設定する簡単な例

*** ハイパーリンクのスタイル設定の例a:link クリックされる前のハイパーリンクの状態a:vi...

Linux での SSH 非秘密通信の実装

SSHとは何か管理者はリモートでログインして、インターネット経由で接続されたさまざまな場所にある複数...

Word のコンテンツを Web サイトのエディターに直接コピーすることはお勧めしません。

<br />質問: Word のコンテンツを Web サイトのエディターに直接コピーする...

iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...

DD DT DLタグの使用例

通常は <ul><li> タグを使用しますが、dd タグと dt タグも便利...

CocosCreatorを使ってシューティングゲームを作る方法

製造手順を分析します。 1. リソースを準備してシーンを構築するオンラインでリソースを探すか、私のリ...

CSS--overflow:hidden のプロジェクト例

以下は、私のプロジェクトでこのプロパティを使用する方法の例です。 (1)激しく透明な浮遊コードをコピ...

Vueプロジェクトのパッケージ化の詳細な説明

目次1. 関連構成ケース1(使用ツールはvue-cil)ケース2(使用するツールはwebpack) ...

Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体

1. Expressライブラリとジェネレータをインストールするcmdを開いて、次のコマンドを入力しま...