当我尝试从运行我的Django应用程序的docker容器连接到运行MySQL的容器时,我收到以下错误:
django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '172.17.0.2' (111)")
以下是我如何运行MySQL容器:
$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=testdb -e MYSQL_ROOT_HOST=172.17.0.2 -d mysql/mysql-server:5.7
如果我没有指定MYSQL_ROOT_HOST
,当我尝试从容器与Django应用程序连接时出现此错误:
django.db.utils.OperationalError: (1130, "Host '172.17.0.3' is not allowed to connect to this MySQL server")
以下是我的Django设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testdb',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '172.17.0.2',
'PORT': '',
}
}
我已验证MySQL容器正在使用IP 172.17.0.2:
$ docker inspect mysql |grep -i ipaddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
答案 0 :(得分:4)
我必须授予Django容器权限的root用户访问DB:
/dist
其中GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.3' IDENTIFIED BY 'password' WITH GRANT OPTION;
SET PASSWORD FOR root@'172.17.0.3' = PASSWORD('root');
FLUSH PRIVILEGES;
是带有应用的容器的IP。 1}}不需要。{/ p>
答案 1 :(得分:1)
此行为在此完整记录:(https://github.com/mysql/mysql-docker#mysql_root_host)并按预期工作。 我会引用它:
默认情况下,MySQL会创建'root'@'localhost'命令。此帐户 只能从容器内部连接,需要使用 如从连接到MySQL中所述的docker exec命令 MySQL命令行客户端。要允许来自其他主机的连接,请设置 这个环境变量。例如,值“172.17.0.1”, 这是默认的Docker网关IP,将允许连接 Docker主机。
您可以看到实际.sh
脚本设置允许来自此env变量的主机:https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L63-L68
答案 2 :(得分:1)
按照@valignatev的建议,使用此env变量可以解决问题。
我确实以这种方式创建了容器:
docker run --rm -dit -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_ROOT_HOST=172.17.0.1 --name mysql_container -p 3306:3306 mysql-mysql-server
172.17.0.1是我的默认Docker网关
一旦容器启动,我就可以像这样从主机进行连接:
mysql -h localhost -P 3306 --protocol=tcp -u root -p
答案 3 :(得分:0)
docker run --rm -d -p 9999:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_ROOT_HOST='%' mysql/mysql-server:5.7
重要的部分是MYSQL_ROOT_HOST='%'