无法从容器与Django应用程序连接到MySQLdocker容器

当我尝试从运行我的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': '', } } 

我已经validation了MySQL容器正在使用IP 172.17.0.2:

 $ docker inspect mysql |grep -i ipaddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2", 

我必须授予Django容器的root用户访问数据库的权限:

 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; 

其中172.17.0.3是与应用程序的容器的IP。 MYSQL_ROOT_HOST不是必需的。

此行为完整logging在这里:( https://github.com/mysql/mysql-docker#mysql_root_host )并按预期工作。 我会引用它:

默认情况下,MySQL创build'root'@'localhost'命令。 此帐户只能从容器内部连接,需要使用docker exec命令,如从MySQL命令行客户端连接到MySQL中所述。 要允许来自其他主机的连接,请设置此环境variables。 例如,作为默认的Docker网关IP的值“172.17.0.1”将允许来自Docker主机的连接。

你可以看到实际的.sh脚本,它设置了这个envvariables允许的主机: https : //github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L63-L68