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 ビット)

推薦する

MySQL Community Server 5.7.16 のグリーン バージョンをインストールしてリモート ログインを実装する方法

1. MySQL Community Server 5.7.16をダウンロードしてインストールします...

Linux で測位バックグラウンド サービスが時々クラッシュする問題の解決方法

問題の説明最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が...

Navicat for MySql ビジュアルインポート CSV ファイル

この記事では、参考までに、Navicat for MySql の CSV ファイルのビジュアルインポ...

Docker コンテナにデプロイされた Django のタイムゾーンの問題

目次Django でのタイムゾーン設定USE_TZ=真USE_TZ=偽Linux コンテナでのタイム...

WeChatミニプログラムビデオ集中砲火位置ランダム

この記事では、WeChatミニプログラムのビデオ弾幕の位置をランダム化するための具体的なコードを紹介...

CSS の読み込みによってブロックが発生しますか?

おそらく誰もが js の実行によって DOM ツリーの解析とレンダリングがブロックされることを知って...

Vue の DOM の非同期更新の簡単な分析

目次Vue が DOM を非同期更新する原理1 実際の DOM 要素を取得できるのはいつですか? 2...

ウェブフロントエンドに対する一般的な攻撃とその防止方法

ウェブサイトのフロントエンド開発で発生するセキュリティ問題は、クライアントブラウザで実行されるコード...

vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

目次1. はじめに2. 使用1. vue2とvue3の違い2. ページ上の一部のデータはキャッシュす...

ApacheのDjangoオンライン展開方法

環境: 1. Windows Server 2016 Datacenter 64 ビット 2. SQ...

MySQL レプリケーションの詳細な説明と簡単な例

MySQL レプリケーションの詳細な説明と簡単な例マスタースレーブレプリケーション技術は、MySQL...

MySQLクエリのソートとページング関連

概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...

Linux プロセスが占有するポート番号を表示する 6 つの方法

Linux システム管理者にとって、サービスがポートに正しくバインドされているか、またはポートをリッ...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

フロントエンドタスク構築のための強力なツールであるGulp.jsの使い方を詳しく説明します

目次概要Gulp.jsをインストールするGulp.jsを使用してプロジェクトを作成するgulpfil...