#python #docker #mysql-connector
#python #docker #mysql-connector
Вопрос:
Я использую mysql-connector, когда я запускаю контейнер с помощью docker, я получаю эту ошибку:
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'db:3306' (-5 No address associated with hostname)
но когда я запускаю проект, используя только python, он выполняется без ошибок
Я хочу использовать phpmyadmin только для базы данных, пожалуйста, помогите.
Комментарии:
1. Где находится база данных? Находится ли это в контейнере docker? Вы создали базу данных в отдельном контейнере docker? Я предпочитаю создавать контейнер docker для каждого компонента отдельно, а затем открывать порты, чтобы разрешить связь между ними. Обратите внимание, что если вы создаете отдельный docker для своей базы данных, вам потребуется смонтировать отдельную папку хранения в docker, чтобы сохранить данные постоянными. Если это вас интересует, я могу вставить некоторый пример кода, с которым вы можете работать.
2. Звучит хорошо, да, пожалуйста, я тоже хочу, чтобы это было действительно срочно
3. И, кстати, база данных находится в main.py и контейнер docker
Ответ №1:
Чтобы создать docker с вашего компьютера Linux:
docker pull mysql:latest
Чтобы запустить его и смонтировать постоянную папку с доступом к порту на 3306 (std-порт для mysql):
docker run --name=mysql_dockerdb --env="MYSQL_ROOT_PASSWORD=<your_password>" -p 3306:3306 -v /home/ubuntu/sql_db/<your_dbasename>:/var/lib/mysql -d mysql:latest
Для подключения к экземпляру docker, чтобы вы могли создать базу данных в docker:
docker exec -it mysql_dockerdb mysql -uroot -p<your_password>
Мой SQL-код для создания базы данных:
CREATE DATABASE dockerdb;
CREATE USER 'newuser'@'%' IDENTIFIED BY 'newpassword';
GRANT ALL PRIVILEGES ON dockerdb.* to 'newuser'@'%';
ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'userpassword';
Теперь у вас будет docker, работающий с постоянной базой данных SQL. Вы подключаетесь к нему из своего кода Python. Я запускаю Flask MySQL. Вы захотите сохранить свои пароли в переменных среды. Я использую Mac, поэтому мой ~/.bash_profile содержит:
export RDS_LOGIN="mysql pymysql://<username>:<userpassword>@<dockerhost_ip>/dockerdb"
В Python:
import os
SQLALCHEMY_DATABASE_URI = os.environ.get('RDS_LOGIN')
И в этот момент вы должны иметь возможность подключиться обычным способом Python. Обратите внимание, что я умолчал о любых аспектах безопасности, предполагая, что это локально за брандмауэром.