无法从带有 Django 应用程序的容器连接到 MySQL docker 容器

use*_*706 8 mysql django docker

当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时,出现以下错误:

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '172.17.0.2' (111)")
Run Code Online (Sandbox Code Playgroud)

这是我运行 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
Run Code Online (Sandbox Code Playgroud)

如果我不指定MYSQL_ROOT_HOST,当我尝试从容器与 Django 应用程序连接时,我会收到此错误:

django.db.utils.OperationalError: (1130, "Host '172.17.0.3' is not allowed to connect to this MySQL server")
Run Code Online (Sandbox Code Playgroud)

这是我的 Django 设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdb',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '172.17.0.2',
        'PORT': '',
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经验证 MySQL 容器正在使用 IP 172.17.0.2:

$ docker inspect mysql |grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
Run Code Online (Sandbox Code Playgroud)

use*_*706 7

我必须授予 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;
Run Code Online (Sandbox Code Playgroud)

172.17.0.3应用程序容器的 IP在哪里。 MYSQL_ROOT_HOST不需要。

  • 不过,肮脏的解决方案是,Web 容器的 IP 并不总是相同。 (2认同)

max*_*ver 6

docker run --rm -d -p 9999:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_ROOT_HOST='%' mysql/mysql-server:5.7

重要的部分是MYSQL_ROOT_HOST='%'