docker run によって起動されたコンテナがハングしてデータが失われた場合の対処方法

docker run によって起動されたコンテナがハングしてデータが失われた場合の対処方法

シナリオの説明

あるシステムでは、機能サービスはdocker stack deploy xxxで起動し、国内データベースのサービスはdocker run xxxで別途起動しています。データベースサービスは保存場所をマウントしません。

その結果、顧客はサーバーを再起動しました... サービスを再起動するためにサーバーにログインすると、データベース内の以前のデータが消える可能性があるという問題が見つかりました (docker run を使用してサービスを再度開始する場合)。

解決

試行 1

最初はデータが確実に失われたと思ったので、再度データを復旧する必要がありましたが、作業量が膨大すぎました...

でも仕方がない、次回起動時にストレージをハードディスクにマウントするだけだ、Orz

しかし、同僚と話し合った結果、より簡単な(ただし永続的ではない)解決策を見つけました。試行 2 を参照してください。

試行2

同僚によると、 docker start container_nameを使用してコンテナを再度起動できるので、データはそのまま残っているとのことでした。後で試してみたところ、データはまだ残っていました...一時的な解決策に過ぎませんでしたが

後で考えてみると、docker によって起動されたイメージのデータがマッピングされていない場合、そのデータはデフォルトのボリュームに保存されます。docker restart xxx でコンテナを再起動しても、変更されたデータはそのまま残ります。つまり、この時点では、サーバーが再起動され、コンテナがハングアップしています (docker ps を使用して表示すると、コンテナのステータスは Exited です)。ただし、実際には、以前のデータはデフォルトのボリュームに残っており、変更されたデータはコンテナが削除された場合にのみ失われます。

検証テスト

イメージをパックし、コンテナを起動し、ファイルを作成し、停止し、再度起動して、ファイルが存在するかどうかを確認するだけです。

# コンテナを起動します ➜ docker_start_test docker run -itd --name docker_run_test 4cbf48630b46 ping 127.0.0.1
d6278f537113122d4ccbe00950790750215c5a09002bcbd1ef6f9e660fc9eaac
➜ docker_start_test docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
d6278f537113 4cbf48630b46 "ping 127.0.0.1" 3秒前 2秒前 docker_run_test
# コンテナにファイルを追加 ➜ docker_start_test docker exec -it docker_run_test /bin/sh
sh-4.2#パスワード
/
sh-4.2# タッチテスト
sh-4.2# 終了
出口
# コンテナを再起動します ➜ docker_start_test docker stop docker_run_test
docker_run_test
➜ docker_start_test docker ps -a | grep docker_run_test
d6278f537113 4cbf48630b46 "ping 127.0.0.1" 約1分前 終了しました (137) 12秒前 docker_run_test
# ファイルが存在するか確認します ➜ docker_start_test docker start docker_run_test
docker_run_test
➜ docker_start_test docker exec -ti docker_run_test /bin/sh
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt ​​proc root run sbin srv sys test tmp usr var

ご覧のとおり、ファイル test はまだ存在しています。コンテナを停止し、docker rm を使用してコンテナを削除し、同じ名前のコンテナを再起動すると、コンテナ内に test ファイルがないことがわかります。

# コンテナを停止/rm ➜ docker_start_test docker stop docker_run_test
docker_run_test
➜ docker_start_test docker ps -a | grep docker_run
d6278f537113 4cbf48630b46 "ping 127.0.0.1" 7 分前 終了 (137) 13 秒前 docker_run_test
➜ docker_start_test docker rm d6278f537113
d6278f537113
# 同じ名前で新しいコンテナを起動します ➜ docker_start_test docker run -itd --name docker_run_test 4cbf48630b46 ping 127.0.0.1
99a6f5df0a86e4c07abf184e322a23e4fbec89ff354691459cdac8fcd8687ba3
# 検証するコンテナに入る ➜ docker_start_test docker exec -ti docker_run_test /bin/sh
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt ​​proc root run sbin srv sys tmp usr var
sh-4.2# ls テスト
ls: テストにアクセスできません: そのようなファイルまたはディレクトリはありません

docker runの手順

公式サイトによると、start コマンドの機能は次のとおりです。

Start one or more stopped containers

うーん、かなり単純で、言うことはあまりないですね

追伸

実際、コンテナのストレージディレクトリをマウントするのが最善の方法です...また、一般的に言えば、コンテナを使用してデータベースサービスを起動すべきではないようです

要約する

上記は、docker run によって起動されたコンテナがデータをハングアップした場合の対処方法について紹介したものです。お役に立てば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • docker run -v はデータボリュームを異常にマウントし、コンテナのステータスは常に再起動になります。
  • Docker実行コンテナが作成状態にある問題についての簡単な説明
  • docker runコンテナの自動終了の解決策
  • Docker Runc コンテナのライフサイクルの詳細な紹介
  • docker run後にコンテナがExited (0)と表示される問題を解決する

<<:  Vue3 での Teleport の使用に関する詳細な説明

>>:  MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

推薦する

Linuxグループの基礎知識ポイントまとめ

1. Linuxグループの基本紹介Linux では、すべてのユーザーはグループに所属する必要があり、...

Webpack5-react スキャフォールディングをゼロから構築するための実装手順 (ソースコード付き)

目次ウェブパック5公式スタート建築ガイド構築を開始する依存する準備が完了したら、プロジェクトの構築を...

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

CSSセレクターでの正規表現の使用

はい、CSS にも正規表現があります (アーメン) CSS で目立つための 2 つの強力なツール: ...

jsはショッピングカートの加算と減算、価格計算を実装します

この記事の例では、ショッピングカートの加算と減算、価格計算を実装するためのjsの具体的なコードを共有...

Dockerコンテナのデータを復元する方法

プロジェクトのテスト環境データベースのデータが失われてしまったので、記録しておきたいと思います。当時...

Vue.jsはアイコンをクリックしてズームインし、

前回の記事では、Vue で画像の切り抜きや拡大・縮小、回転を実現する方法を紹介しました。今回は、アイ...

CSS3 を使って本のページめくり効果を実現するサンプルコード

重要なポイント: 1. CSS3 3Dアニメーションをマスターする2. ページめくり後のページ内容の...

Vue3.0 エラーの解決策: モジュール 'worker_threads' が見つかりません

vue3.0 への最初の試みを記録します。プロジェクトを開始したときに、「モジュール 'wo...

マークアップ言語 - リスト

標準化されたデザインソリューション - マークアップ言語とスタイルマニュアルWeb 標準ソリューショ...

Raspberry Pi 3B+ に 64 ビット Ubuntu システムと Docker ツールをインストールする詳細な手順

Raspberry Pi 3B に 64 ビット アプリケーション (64 ビット JDK など) ...

ソースコードから、Vue2がデータとメソッドを直接取得できる理由がわかる

目次1. 例: これはデータとメソッドを直接取得できます2. 環境を準備し、ソースコードをデバッグし...

Vue はシームレスなカルーセル効果を実現

この記事では、シームレスなカルーセル効果を実現するためのVueの具体的なコードを参考までに紹介します...

Web デザインの経験: 独善的な Web デザイナー

1. ゴミかクラシックか? Web テクノロジーは急速に更新されており、Web サイトのインターフェ...

MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL

序文トランザクション データ ディクショナリとアトミック DDL は、MySQL 8.0 で導入され...