_docker-compose
_を使用してmysql
コンテナを作成しています。ホストIP _172.21.0.2
_を取得します。しかし、mysqlに接続すると、エラーが発生します:
私の_docker-compose.yml
_:
_version: '2'
services:
### Mysql container
mysql:
image: mysql:latest
ports:
- "3306:3306"
volumes:
- /var/lib/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
MYSQL_USER: test
MYSQL_PASSWORD: test_pass
_
ホストIPを取得する_docker inspect db_mysql_1 | grep IPAddress
_
_"IPAddress": "172.21.0.2",
_
Mysqlにアクセスします:_mysql -h 172.21.0.2 -P 3306 -u root -proot
_。
ERROR 1130 (HY000): Host '172.21.0.1' is not allowed to connect to this MySQL server
Mysqlコンテナーに接続するにはどうすればよいですか?
MySQLコンテナMYSQL_ROOT_Host=<ip>
を起動するときに、追加の環境変数を渡すことができます。これにより、指定したIPアドレスからログインする権限を持つrootユーザーが作成されます。任意のIPからのログインを許可する場合は、MYSQL_ROOT_Host=%
を指定できます。
これは、新しく作成されたコンテナに対してのみ機能します。
新しいコンテナを回転させるとき:
docker run --name some-mysql -e MYSQL_ROOT_Host=% -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest
作成ファイルでは次のようになります。
version: '2'
services:
### Mysql container
mysql:
image: mysql:latest
ports:
- "3306:3306"
volumes:
- /var/lib/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_db
MYSQL_USER: test
MYSQL_PASSWORD: test_pass
MYSQL_ROOT_Host: %
MySQLサーバーに接続すると、それはGRANT
テーブル(MySQLサーバー上の「mysql |データベース」の「user」テーブル)であるかどうかを、接続しているMySQLクライアントマシンのIPアドレスと照合します。 NO MATCHING ENTRIES「mysql」データベースの「user」テーブルの「Host」列MySQLは接続を即座に閉じますERROR 1130
。
クライアントがデータベースサーバーのポート3306(MySQLポート)に到達できるかどうかを確認します。
telnet 172.21.0.2 3306
Trying ::1...
Connected to 172.21.0.2.
Escape character is '^]'.
MySQLサーバーにログインし、「mysql」を実行して権限テーブルを確認する必要があります。
# mysql mysql
mysql> SELECT Host,user FROM user;
+-----------------+-----------+
| Host | user |
+-----------------+-----------+
| 172.21.0.5 | root |
| 172.21.0.4 | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | root |
"root" is複数のIPアドレスからの接続が許可されていますが、クライアントIP 172.21.0.1からの接続は許可されていません。したがって、そのIPからGRANTアクセスを追加するだけです。
mysql> GRANT ALL PRIVILEGES ON root.* TO 'your_db'@'172.21.0.1' IDENTIFIED BY 'Password';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
次に、接続を確認します。