我正在使用它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 容器?
答案1
您可以在启动 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: '%' # needs to be enclosed with quotes
答案2
对我来说,这种方法很有效:
MYSQL_ROOT_HOST: '%'
答案3
就我的情况而言。我删除了卷配置,它就起作用了。
答案4
当你连接到 MySQL 服务器时,它会检查其GRANT
表(MySQL 服务器上的“mysql|”数据库中的“用户”表)与连接的 MySQL 客户端计算机的 IP 地址。如果有没有匹配的条目在“mysql”数据库的“用户”表中的“主机”列中,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 |
“根”是授权从多个 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)
然后,检查您的连接。