2016-11-27 1 views
0

Когда я пытаюсь соединиться с Docker контейнера работает мое приложение Django в контейнер работает MySQL, я получаю следующее сообщение об ошибке:Не удается подключиться к MySQL Docker контейнера из контейнера с Django приложение

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

Является ли название базы данных docker container mysql? – denvaar

+0

Да, это имя mysql. – user2233706

+0

Обычно для запуска MySql требуется несколько секунд, вы пытаетесь подключиться к нему сразу или после немного? Кроме того, fwiw, похоже, что вам не нужно указывать 'MYSQL_ROOT_HOST' при запуске контейнера. – R0MANARMY

ответ

2

Я должен был предоставить пользователь корня в контейнере разрешениях Django для доступа к БД :

GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.3' IDENTIFIED BY 'password' WITH GRANT OPTION; 
SET PASSWORD FOR [email protected]'172.17.0.3' = PASSWORD('root'); 
FLUSH PRIVILEGES; 

Где 172.17.0.3 является IP-адресом контейнера с приложением. MYSQL_ROOT_HOST не требуется.

1

Такое поведение полностью документированный здесь: (https://github.com/mysql/mysql-docker#mysql_root_host) и работает как и ожидалось. Я процитирую его:

By default, MySQL creates the 'root'@'localhost' command. This account can only be connected to from inside the container, requiring the use of the docker exec command as noted under Connect to MySQL from the MySQL Command Line Client. To allow connections from other hosts, set this environment variable. As an example, the value "172.17.0.1", which is the default Docker gateway IP, will allow connections from the Docker host machine.

Вы можете увидеть фактический .sh скрипт, который установлен допустимый хост из этого окр переменный: https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L63-L68

+0

Так что делать то, что я делаю, невозможно? Единственный способ подключиться к контейнеру MySQL (по крайней мере, используя официальный образ) - это сам контейнер? – user2233706

+0

Да. Но почему это проблема для вас? – valignatev

+1

Разве это не допустимый прецедент для работы базы данных в контейнере и приложения, запущенного в другом контейнере? – user2233706

Смежные вопросы