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 バージョンのインストールと構成のグラフィック チュートリアル

推薦する

HTMLの基本タグと構造の詳細な説明

1. HTMLの概要1.HTML: ハイパーテキスト マークアップ言語。これはプログラミング言語では...

MySQL タイムブラインドインジェクションの 5 つの遅延方法

MySQL タイム ブラインド インジェクションの 5 つの遅延方法 (PWNHUB の予期しない解...

フロントエンド開発者のための HTML 入門

1 HTML入門1.1 初めてのコード体験、最初のウェブページの作成XML/HTML コードコンテン...

Linux入力サブシステムフレームワーク原理の分析

入力サブシステムフレームワークLinux 入力サブシステムは、上から下に向かって、入力サブシステム ...

CSS で平均レイアウトを実現するためにネガティブ マージン テクノロジーを使用する方法

通常、IE ブラウザでの CSS の互換性の問題を解決するために、フロート レイアウトが使用されます...

CSS に基づいて MaterialUI ボタン​​クリックアニメーションを実装し、それを React コンポーネントにカプセル化します。

序文フロントエンドフレームワークのヘビーユーザーとして、私はテクノロジーを選択する際にそのエコロジー...

Linux でのデータベースのスケジュールバックアップの実装スクリプト

目次シナリオ: サーバーデータベースを毎日定期的にバックアップする必要がある1. まずバックアップス...

JS で配列をループする 4 つの方法のまとめ

この記事では、配列を走査する 4 つの方法を比較してまとめます。 for ループ: for (let...

LinuxにVSCodeをダウンロードしてインストールし、プログラミングを使用して現在の時刻を出力する

rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...

Linux SSHポートを転送する3つの方法

ssh は私が最も頻繁に使用する 2 つのコマンドライン ツールのうちの 1 つです (もう 1 つ...

Vue で Baidu Map を呼び出して経度と緯度を取得する

プロジェクトでは、現在地の緯度経度を取得したり、場所を検索して緯度経度情報を取得したりする必要があり...

HTML Selectは、デフォルトの選択を設定するためにselected属性を使用します。

オプションに属性 selected = "selected" を追加すると、それ...

HTML テーブル マークアップ チュートリアル (18): テーブル ヘッダー

<br />ヘッダーはテーブルの最初の行を参照します。ヘッダー内のテキストは中央揃えで太...

js のプロトタイプ、プロトタイプ オブジェクト、プロトタイプ チェーンの包括的な分析

目次プロトタイプを理解するプロトタイプオブジェクトを理解するインスタンスプロパティとプロトタイププロ...