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 の使用上の問題と解決策

推薦する

MySql 5.7.17 winx64 のインストールと設定に関する詳細なチュートリアル

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカウ...

docker の実行に必要な権限の分析

Docker を実行するには root 権限が必要です。非 root ユーザーに docker コマ...

CentOS7.5にHarbor1.7をインストールして設定するプロセス全体

1. 必要なパッケージをダウンロードする wget -P /usr/local https://st...

ウェブページの画像を素早く表示する方法とテクニック

1. .jpg ではなく .gif を使用します。GIF は JPG に比べてサイズが小さくなります...

デザイン理論:人間中心のグリーンデザイン

「人間中心」と「グリーンデザイン」という2つの視点から考える——デザイン業界の同僚とも議論する2つの...

Element-ui レイアウト (行と列コンポーネント) の実装

目次基本的な手順と使用方法行コンポーネントの分析レンダリング機能ソースコード分析Col成分の分析コン...

全文検索とキーワードスコアリング方式のMySQL実装例

1. はじめに今日、同僚から、MySQL を使用して ElasticSearch に似た全文検索機能...

Linux で lvm 論理ボリューム パーティションのサイズを調整するチュートリアル (xfs や ext4 などのさまざまなファイル システム用)

序文システムをインストールしたときに、パーティション領域を適切に割り当てませんでした。その後のメンテ...

Reactでのこのリファレンスの詳細な説明

目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...

TypeScript におけるジェネリックケースの詳細な説明

ジェネリックの定義 // 要件 1: ジェネリックは指定されていないデータ型をサポートできるため、渡...

jsはキャンバスに基づいて時計コンポーネントを実装します

圧縮アップロード画像、スクラッチカード、ポスター作成、チャートプラグインなど、フロントエンド開発にお...

CCS におけるマージン: トップ崩壊問題を解決する

HTML 構造は次のとおりです。 CCS 構造は次のとおりです。 ページ効果図は次のとおりです。 こ...

HTML チュートリアル: よく使われる HTML タグのコレクション (6)

関連記事:初心者が学ぶ HTML タグ (5)導入された HTML タグは、必ずしも XHTML 仕...

Windows 10 64 ビット版に MySQL 5.6.35 をインストールするためのグラフィック チュートリアル

1. MySQL Community Server 5.6.35をダウンロードするダウンロードアドレ...

Vue はシェイク機能を実装します (ios13.3 以降と互換性があります)

最近、shake.jsを使用して、shakeに似た機能を作成しました。ただし、shake機能はios...