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

推薦する

Nginx の場所に関する一般的なルールの優先順位の問題

目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...

Facebook によるインターネット サービスのほぼ完璧な再設計

<br />出典: http://www.a-xuan.cn/?p=197 先ほどFac...

フロントエンドの状態管理(パート 1)

目次1. フロントエンドの状態管理とは何ですか? 2. ヴュークス3. バス4. ウェブストレージ序...

LinuxのバックグラウンドでPythonプログラムを実行するいくつかの方法

1. 最初の方法は、unhup コマンドを直接使用してプログラムをバックグラウンドで実行することです...

VMware ESXi CLI の一般的なコマンドを調べる

目次【共通コマンド】 [一般的な esxi コマンドの概要] [esxcli コマンドの調査] ES...

iptables の再起動後に Docker の iptables ルールの完全なプロセスが失われる

原因と結果1. ansibleコマンドを使用してジャンプサーバー上のマシンBをテストすると、次のエラ...

ubuntu16.04でNFSサービスを構築する方法

NFS の紹介NFS (ネットワーク ファイル システム) は、FreeBSD でサポートされている...

antd pro に基づく SMS 認証コード ログイン機能 (プロセス分析)

目次まとめ全体的なプロセスフロントエンドページコード検証コードとログイン サービスをリクエストする ...

Web デザイナーにはどのような知識体系が必要ですか?

製品設計者は、複雑で大規模な製造システムと多様な市場に直面しているため、知識体系には幅広さと深さの両...

CSS3 で transform を使用した場合のフォントぼかしの解決方法の詳細な説明

この質問は非常に奇妙なので、あまり多くを語らずにコードに直接進みます。 .g-ダイアログラッパー{ ...

Linux で JDK 環境を構成する方法

1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

Vue3.0 における Ref と Reactive の違いの詳細な分析

目次参照と反応参照反応的RefとReactiveの違いshallowRef と shallowRea...

Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

目次環境設定の概要1.K8Sとは何ですか? 2. K8S を使用する理由3. K8S を使用する利点...

React-vscode で jsx 構文を使用する際の問題と解決策

問題の説明プラグインをインストールした後、ES7 React/Redux/GraphQL/React...