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

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

推薦する

CenterOS7 インストールおよび構成環境 jdk1.8 チュートリアル

1. まずcenterosに付属のJDKをアンインストールします rpm-qa|grepopenjd...

SQL インジェクションのある Web サイトを見つける方法 (必読)

方法 1: Google の詳細検索を使用します。たとえば、次に示すように.asp?id=9などの ...

CSSはメッセージパネルをスライドするWebコンポーネント機能を実装します

みなさんこんにちは。私と同じように混乱している方はいらっしゃいませんか。CSS は簡単に始められます...

MySQL の垂直テーブルを水平テーブルに変換する方法と最適化のチュートリアル

1. 縦型テーブルと横型テーブル垂直テーブル: テーブル内のフィールドとフィールド値はキーと値の形式...

Docker Alpine イメージのタイムゾーン問題に対する完璧な解決策

最近、Docker を使用して Java アプリケーションをデプロイしていたときに、タイムゾーンが間...

LinuxにPHP7をインストールする方法の詳細な説明

Linux に PHP7 をインストールするにはどうすればいいですか? 1. 依存パッケージをインス...

MySQL 半同期レプリケーションの原理構成と導入の詳細な説明

環境の紹介: Ubuntu Server 16.04.2+MySQL 5.7.17 コミュニティ サ...

モバイルの赤い封筒の雨機能ページを実装するための JavaScript HTML

この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...

【HTML要素】画像の埋め込み方法

img 要素を使用すると、HTML ドキュメントに画像を埋め込むことができます。画像を埋め込むには、...

MySQL ストアド プロシージャの作成と呼び出しの詳細な説明

目次序文ストアドプロシージャ: 1. ストアドプロシージャの作成と呼び出し1. ストアドプロシージャ...

MySQLサーバーが消えたエラーの解決策

PHP で MySQL サーバーが消えた問題1. 背景以前、Codeigniter でコンソール コ...

Ubuntu 18.04で国内ソースを変更する方法の例

Ubuntu はソースが中国からなのでダウンロード速度が比較的遅いです。CentOS と異なり、yu...

MySQL実践スキル: 2つのテーブルに異なるデータがあるかどうかを比較する方法の分析

この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を...

document.getElementBy系メソッドがオブジェクトを取得できない問題を解決する

getElementByIdはオブジェクトを取得できませんブラウザがドキュメントを解析するときにはシ...

Vue 大画面データ表示例

効率的に要件を満たし、コンポーネント ライブラリの肥大化や車輪の再発明を避けるために、私は以前、大画...