Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどのいくつかの変更が必要です。変更後にコンテナーを再実行すると、変更されたファイルは無効になり、新しく生成されたコンテナーには以前に変更されたコンテンツが含まれなくなります。

1 つ目は、公式サイトからダウンロードしたイメージを修正し、新しいイメージ ファイルと新しく生成されたその他のイメージ情報を docker commit -m で送信する方法です。

2番目のタイプのMYSQL DBデータでは、コンテナを閉じた後にdocker restartで同じコンテナを再起動すると、データは正常になります。コンテナを再度docker runすると、各コンテナにファイルアドレスがあるため、データは表示されません。

これには、他のコンテナが読み取れるようにデータ ファイルをマウントする必要があります。

docker で mysql コンテナを起動し、mysql コンテナ内のデータベースに変更を加え (データベースの作成、データの変更など)、コミット後に再度コンテナに入ると、以前の変更がすべて保存されていないことがわかります。

1. バックグラウンドで mysql コンテナを実行し、コンテナ名を mysql に設定します。

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql

f80791a0daf194fdba94f16a9d89ebec8ba8fbd8af28d3ea8b599b9d705f85ba

2. コンテナ bash と mysql に入り、データベース TEST_DB を作成し、TEST_DB が正常に作成されたことを確認します。

[root@localhost ~]# docker exec -it mysql bash root@f80791a0daf1:/# mysql -uroot -p 
データベースを表示します。 
データベース TEST_DB を作成します。

3. コンテナを終了し、イメージへの変更をコミットします。このデータは実際には MySQL イメージではなく、ホスト マシン上で変更されます。だからうまくいかない

mysql>終了
さよなら
root@f80791a0daf1:/# 終了
出口
[root@localhost ~]# docker commit mysql owenchen1992/mysql

4. コンテナを再起動し、bash と mysql を入力します。以前作成した TEST_DB が消えていることがわかり、以前の変更が無効であることがわかります。

[root@localhost ~]# docker コンテナが mysql を停止します
マイスク
[root@localhost ~]# docker コンテナ rm mysql 
マイスク
[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql
a1a1b4174caaadda0ec4b01b9fe5f92d6b3464d85284042274f71aebde0915dd
[root@localhost ~]# docker exec -it mysql bash
ルート@a1a1b4174caa:/#mysql -uroot -p
パスワードを入力してください: 
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは3です
サーバーバージョン: 5.7.20 MySQL コミュニティサーバー (GPL)
 
mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
+--------------------+
セット内の 4 行 (0.00 秒)

問題の原因:

MySQL Dockerfile には次のような行があります。

ボリューム /var/lib/mysql

これは、コンテナ内の /var/lib/mysql ディレクトリへのすべての変更がホスト上の特定の場所にマッピングされることを意味します。特定の対応するホスト ディレクトリは、コマンド docker inspect containerID/name で確認できます。docker commit を実行すると、コンテナ内の /var/lib/mysql ディレクトリへの変更はイメージにコミットされませんが、これらの変更はいつでもホスト上の対応するディレクトリと同期されます。

コミットされたイメージを再起動すると、コンテナはデータの更新を保存するためにホスト上に新しいディレクトリを作成します。したがって、これは元のホスト ディレクトリではないため、新しく開かれたコンテナは以前のデータの変更を確認できません。

解決:

問題の原因がわかったので、解決するのは難しくありません。手順は次のとおりです。

このディレクトリに直接アクセスして、各コンテナに生成されたデータディレクトリを表示できます。

1. mysql コンテナ「/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data」に対応するホスト ディレクトリを見つけます。

[root@localhost ~]# docker でmysqlを検査する
[
......
    「ソース」: 「/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data」、
    「宛先」: 「/var/lib/mysql」、
......
]

コンテナを作成して実行する前の手順を繰り返し、新しいコンテナを実行して、TEST テーブルを作成します。まずコンテナを閉じてから、コンテナ サービスを削除します。

4. 新しいコンテナをバックグラウンドで実行し、ホスト マシンに対応するディレクトリをコンテナの /var/lib/mysql ディレクトリにマウントし、読み取りおよび書き込み権限を有効にします (重要な手順):

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -v /var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data:/var/lib/mysql:rw -d owenchen1992/mysql

5. 新しく開いたコンテナに入り、データベースを確認します。コンテナを再実行しても、作成したデータベースTEST_DBが消えず、問題が解決していることがわかります。

手順は次のとおりです: 1. 新しいテーブルを作成します。2. テーブルを作成するためにコンテナをシャットダウンします。3. コンテナを再実行し、データ ディレクトリを /var/lib/mysql にマウントすると、問題は解決します。

補足知識: Docker環境でMySQLを使用する際のエンコード形式を変更する方法

方法1(単一マシンの変更の場合)

まず、mysqlサービスが開始されていることを確認します

docker exec -it + サービス名/bin/bashと入力してコンソールに入ります。

apt-get updateコマンドを入力します

apt-get install vimと入力します(上記の2つのコマンドはvimエディタをダウンロードするために使用されます)。

vim /etc/mysql/mysql.conf.d/mysqld.cnfコマンドを入力してmysqld.cnfファイルに入ります。

4. i を使用して編集モードを開き、テキストの最後に次のように入力します。

注意: 以下の内容を誤って入力しないでください。誤って入力すると、構成ファイルが無効になります。

[クライアント]
デフォルトの文字セット=utf8
[mysql]
デフォルトの文字セット=utf8
[mysqld]
文字セットサーバー=utf8

終了するには ESC を押し、保存して終了するには Shift + コロン wq を押します。

5. MySQLコンソールに入る

6. 変更された対応する情報を表示するには、「show variables like 'char%';」と入力します。

変更が完了し、データベースが再起動したら、「char%」のような変数を表示します。

上記の結果は、変更が成功したことを示しています。

方法2(クラスター構築に適用)

構成ファイルを元のディレクトリからコピーし、外部ファイルを使用して変更します。この方法は、ファイルを複数のサーバーに送信して、データベースのデフォルトのエンコーディングを変更するために使用されます。

docker exec -it + サービス名/bin/bash でコンソールに入る

cd /etc/mysql/conf.d/と入力して設定ファイルのディレクトリに入ります。

ファイルの絶対パスを取得するにはpwdと入力します

コンソールに戻るにはcdと入力し、終了してください

docker cp サービス名:/etc/mysql/conf.d/mysql.cnf /usr/soft と入力します (docker 内の mysql.cnf ファイルを Linux の下の soft フォルダにコピーします)

外部エディター (notepad++ など) を開き、次のように構成ファイルを記述します。

[クライアント]
デフォルトの文字セット=utf8

[mysql]
デフォルトの文字セット=utf8

[mysqld]
init_connect = '照合接続を utf8_unicode_ci に設定'
init_connect='名前をutf8に設定'
文字セットサーバー=utf8
照合サーバー=utf8_unicode_ci
文字セットクライアントハンドシェイクをスキップする

PS: 設定ファイルの内容の間にはスペースが必要であることに注意することが重要です。

上手に節約

7.docker cp /usr/soft/mysql.cnf サービス名: /etc/mysql/conf.d/ 変更したファイルを元のディレクトリにコピーして上書きします

8. dockerでmysqlサービスを再起動し、

9. 変更された文字エンコード形式を表示するには、「char%」コマンドのようなshow variablesを入力します。

Docker MySQLコンテナデータベースの変更が反映されない問題を解決する上記の記事は、編集者が皆さんと共有する内容のすべてです。この記事が皆さんの参考になれば幸いです。また、123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • dockerコンテナは直接実行され、pingを介してパブリックIP操作を取得します。
  • Docker ファイルの保存パス、コンテナの起動コマンド操作の取得
  • Linux の Docker コンテナで bash を終了する 2 つの方法
  • 停止したすべてのDockerコンテナを1つのコマンドで再起動する
  • docker version es、milvus、minio 起動コマンドの詳細な説明
  • Dockerはelasticsearchイメージを起動し、ディレクトリをマウントした後にエラーを解決します
  • dockerログマウントの問題を解決する

<<:  HTML チュートリアル: 定義リスト

>>:  MySQL 8.0.22 の最新バージョンのダウンロードとインストールの超詳細なチュートリアル (Windows 64 ビット)

推薦する

Harborを使用してプライベートDockerリポジトリを構築する方法

目次1. オープンソースの倉庫管理ツール Harbor 2 インストール2.1 DockerとDoc...

JavaScriptページングコンポーネントの使い方の詳細な説明

ページネーションコンポーネントはWeb開発でよく使われるコンポーネントです。ページネーション機能を実...

Docker での Redis のマスタースレーブ構成チュートリアルの詳細説明

1. Redisイメージを取得するdocker pull redis 2. それぞれポート6379、...

ユーザーのニーズがマーケティング指向のデザインにつながる

<br />それぞれのトピックについて、チーム内でメールで議論します。議論が白熱するにつ...

MySQL ディープページング問題の解決の実践記録

目次序文ディープページングを制限すると遅くなるのはなぜですか?サブクエリによる最適化B+ツリー構造の...

WeChatアプレットはふるいを振る効果を実現

この記事では、WeChatアプレットの具体的なコードを参考までに共有します。具体的な内容は次のとおり...

HTML でのアンカータグの使用例の共有

アンカータグの使用法:同じドキュメント内の特定の場所にリンクすることをアンカー リンクと呼びます。ア...

Vueを使用して手書き署名機能を実装する

個人的な実装のスクリーンショット:インストール: npm インストール vue-esign --sa...

Dockerは元のタグのイメージの再タグ付けと削除を実装します

docker イメージ ID は一意であり、イメージを物理的に識別できます。repository: ...

CSS3のtext-fill-colorプロパティの詳細な説明

text-fill-color とは何を意味しますか?文字通りの意味から言えば、「テキストの塗りつぶ...

dockerエラーの原因分析 終了しました (1) 4分前

Dockerエラー1. 原因を確認するdocker ログ ネクサス2. エラーの原因OpenJDK ...

Reactのコンポーネント共同利用実装

目次ネスティング親子コンポーネント通信ブラザーコンポーネント通信撤回するReact の Linked...

LinuxでのMySQLのインストール手順

1. mysql tar ファイルをダウンロードします。参考: 2. インストールパッケージがあるデ...

モバイルブラウザが位置をサポートしない場合の解決策: 修正

具体的な方法は以下の通りです。 CSSコードコードをコピーコードは次のとおりです。 .wap_bot...

今日、私は非常に奇妙なクリックの問題に遭遇し、自分で解決しました

...こんな感じで、今日はポップアップウィンドウを作ろうと思ったのですが、バックエンド PHP によ...