mysql8.x docker リモートアクセスの詳細な設定

mysql8.x docker リモートアクセスの詳細な設定

環境条件

MySQL 8.x は docker 経由でデプロイされており、起動時の docker-compose.yml は次のようになります。

バージョン: "3.2"
サービス:
    マイスク:
        コンテナ名: mysql
        イメージ: "mysql:8.0"
        ポート:
            - 「3306:3306」
        指示:
            [
                "--文字セットサーバー=utf8mb4",
                "--collat​​ion-server=utf8mb4_unicode_ci",
                "--sql_mode=STRICT_TRANS_TABLES、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_ENGINE_SUBSTITUTION"、
            ]
        ボリューム:
            - タイプ: バインド
              ソース: ./mysql
              ターゲット: /var/lib/mysql
            - タイプ: バインド
              ソース: ./mysql-docker.cnf
              ターゲット: /etc/mysql/conf.d/docker.cnf
        環境:
            - MYSQL_RANDOM_ROOT_PASSWORD=はい
            -MYSQL_USER=私のユーザー
            -MYSQL_PASSWORD=パスワード
            -MYSQL_DATABASE=mydb
        再起動: 常に

docker-compose コマンドを初めて起動すると、mysql 8.x イメージが自動的にダウンロードされます。

起動が成功すると、ポート 3306 もマッピングされていることがわかります。

この時点で、mysql は正常にインストールされ、起動されます。​

エラーが発生しました

次に、Navicat などのデータベース クライアントを介して MySQL サーバーに接続すると、まったく接続できないことがわかりました。発生したエラーの種類は次のとおりです。

  1. エラー 1045 (28000): ユーザー 'myuser' のアクセスが拒否されました
  2. 10060 エラー
  3. 10061 エラー

回避策

データベースのユーザー権限を設定することでリモート アクセスの問題を解決する方法はインターネット上に多数ありますが、それらにはコア ステップしかなく、プロセスが欠けています。

1. mysql dockerにログインする

上記の docker-compose.yml からわかるように、mysql ルート ユーザーのパスワードは設定されていません。
ボリューム マッピング セクションでは、コンテナー内の /etc/mysql/conf.d/docker.cnf ファイルを外部にマッピングしたことがわかります。このファイルの内容は次のとおりです。

[mysqld]
ホストキャッシュをスキップする
名前解決をスキップ

MySQL にログインするときにパスワードが不要になるように、次の行を追加します。

[mysqld]
ホストキャッシュをスキップする
名前解決をスキップ
スキップ許可テーブル

追加後、コンテナを再起動します。

docker-compose ダウン
docker-compose を起動 -d

2. ルートパスワードを設定する

コンテナに入り、root アカウントで mysql サーバーにログインします。

docker exec -it mysql /bin/bash
mysql -uroot # ここで Enter キーを押すと、パスワードを入力せずにサーバーにログインできます。mysql> flush privileges;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> ALTER USER 'root'@'localhost' は 'mysqlroot' によって mysql_native_password で識別されます。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

最初に権限をフラッシュする必要があることに注意してください。そうしないと、パスワードの変更は成功しません。​

次に、コンテナを終了し、マップされた /etc/mysql/conf.d/docker.cnf ファイルを復元します。

[mysqld]
ホストキャッシュをスキップする
名前解決をスキップ

新しく追加された行を削除し、コンテナを再起動します。

docker-compose ダウン
docker-compose を起動 -d

3. ルートリモートアクセス権限を設定する

コンテナを再起動した後、再度コンテナに入り、ルート ユーザーのリモート アクセス権限を設定します。

docker exec -it mysql /bin/bash
mysql -uroot -p # 前の手順で設定したパスワードmysqlrootを入力する必要があります

mysql> ALTER USER 'root'@'%' は 'mysqlroot' によって mysql_native_password で識別されます。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

前の手順で 'root'@'localhost' の代わりに 'root'@'%' を使用してリモート アクセス権限を構成します。

設定後は、mysql docker コンテナを再起動せずに navicat で接続できるようになります。

4. 一般ユーザーmyuserのリモートアクセスを設定する

上記の手順に従って、通常のユーザー myuser のリモート接続を構成します。

mysql> ALTER USER 'myuser'@'%' は 'mypass' によって mysql_native_password で識別されます。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> grant オプションを使用して、*.* のすべての権限を 'myuser'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

設定が成功すると、myuser アカウントも navicat 経由でリモート接続できるようになります。

mysql8.x docker リモートアクセスの詳細設定に関するこの記事はこれで終わりです。より関連性の高い mysql8.x docker リモートアクセスのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker は 2003 年の問題を解決するために MySQL リモート接続を導入しました
  • Docker で MySQL をインストールし、リモート接続を実装するチュートリアル
  • Docker はリモート接続のサンプルコードを実現するために MySQL をデプロイします

<<:  Win10の明るさ調整効果を模倣するHTML+CSS+JSサンプルコード

>>:  完璧なアロエベラジェルを選ぶには?完璧なアロエベラジェルの本物と偽物の見分け方

推薦する

Keras を使って SQL インジェクション攻撃を判断する (例の説明)

この記事では、ディープラーニングフレームワーク keras を使用して、SQL インジェクションの特...

Dockerプライベートライブラリの実装

プライベート Docker レジストリのインストールとデプロイは、Docker テクノロジーを導入、...

MySQLの構文、特殊記号、正規表現の詳細な説明

Mysql でよく使用される表示コマンド1. 現在のデータベース サーバー内のデータベースの一覧を表...

タグ li はブロックレベル要素ですか?

なぜ高さを設定できるのでしょうか。<h1 /> などの要素とは異なり、「セミインライン」...

mysql エラー 1045 (28000) - ユーザーへのアクセスが拒否される問題を解決する方法

問題の説明 (以下の説明は Windows 環境に限定されます): D:\develop\ide\m...

この構成ファイルの排他ロックに失敗したという VMware 仮想マシンのプロンプトの解決方法

VMware が異常シャットダウンした後、再起動すると「この構成ファイルを排他的にロックできませんで...

タブステータスバーの切り替え効果を実現するための js と jQuery

今日は、タブ バーをクリックして切り替えるという目的を実現するために、js と jQuery を使用...

innodb_autoinc_lock_mode の表現と値の選択方法についての簡単な説明

前提条件: Percona 5.6 バージョン、トランザクション分離レベルは RR mysql>...

CentOS サーバーに FFmpeg をインストールするための完全な手順

序文サーバーシステム環境は、CentOS 6.5 (最終) です。 FFmpeg をサーバーに正常に...

静的リソースファイルのアクセスログをフィルタリングするNginxの実装

乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...

ECMAScript6 におけるマップマッピングの基本概念と一般的な方法

目次マッピングとは何かオブジェクトとマップの違いマップの共通メソッド宣言と初期化割り当てセットキー値...

MySQL の隠し列の詳細表示

目次1. 主キーが存在する2. 主キーはないが、一意のインデックスが存在する3. 共同主キーまたは共...

Docker を使用して静的 Web サイト アプリケーションを作成する (複数の方法)

静的ウェブサイトをホストできるサーバーは数多くあります。この記事では、nginx、apache、to...

node.js でマルチコア CPU を最大限に活用する方法

目次概要node.js でマルチコア CPU を最大限に活用する方法Node で子プロセスを作成する...

入力テキスト ボックスと画像検証コードの位置合わせの問題 (画像は常に入力より 1 つ上になります)

Web ページ制作では、input と img が同じ行に配置されることが多く、img タグが常に ...