无法使用Django应用程序从容器连接到MySQL docker容器

时间:2016-11-27 03:57:39

标签: mysql django docker

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

4 个答案:

答案 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 :(得分: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='%'