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サンプルコード

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

推薦する

mysql8.0 でユーザーを作成して権限を付与する際のエラーの解決方法の詳細な説明

質問1:エラーを報告する書き込み方法: GRANT OPTION を使用して、'123123...

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

Vue+elementを使用してページ上部のタグを実装する方法の詳細な説明

目次1. ページレンダリング2. タグを切り替える3. タグを削除するこのようなタグはどのように記述...

小規模プロジェクトで Vue が点滅するのを防ぐ方法

まとめHTML: 要素と v-cloak CSS: [v-cloak]{表示: なし}プロセスページ...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...

Nginx で Http、Https、WS、WSS を設定する方法

前面に書かれた今日のインターネット分野では、Nginx は最も広く使用されているプロキシ サーバーの...

HTMLタグのtarget属性の使用法

1: <a> タグを使用してページにリンクする場合、target 属性の役割は誰もが知っ...

CentOS サーバーのセキュリティ構成戦略

最近、ブルートフォース攻撃によるサーバのクラッキングが頻発しています。侵入行為を大まかに分析し、よく...

MySQL 百万レベルのデータページングクエリ最適化ソリューション

データベースからクエリする必要があるテーブルに数万件のレコードがある場合、すべての結果を一度にクエリ...

src 属性と href 属性の違い

src と href には違いがあり、混同される可能性があります。 src は現在の要素を置き換える...

jsはポップアップウィンドウをクリックすることでポップアップログインボックスを実装します

この記事では、ポップアップウィンドウをクリックしたときにポップアップログインボックスを実現するための...

Vueはタブナビゲーションバーを実装し、左右のスライド機能をサポートしています

この記事では主に、Vue を使用してタブ ナビゲーション バーを実装し、flex レイアウトを使用し...

LinuxでのDNSサーバーの設定の詳細な説明

1. DNSサーバーの概念インターネットでの通信には IP アドレスの助けが必要ですが、数字に対する...