Как подключиться к mysql на хосте из докера? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть mysql на моем локальном хосте, и я могу войти в систему с правами root:

[root@pocnnr1n1 etc]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+

Теперь у меня есть докер на этом хосте с IP-адресом '172.17.0.2'

Нет проблем с ping от докера к хосту:

root@eaa90c1059f2:/app/airflow/dags# ping 192.168.211.251
PING 192.168.211.251 (192.168.211.251): 56 data bytes
64 bytes from 192.168.211.251: icmp_seq=0 ttl=64 time=0.208 ms

Из докера, если я вручную запускаю pymysql для создания соединения:

conn= pymysql.connect(host='192.168.211.251', port=3306, user='root',
passwd='root', db='airflow')

У меня следующая ошибка:

pymysql.err.OperationalError: (1045, «Доступ запрещен для пользователя 'root'@'172.17.0.2' (используется пароль: YES)")

Если я изменил IP-адрес на «172.17.0.2», как показано ниже:

conn= pymysql.connect(host='172.17.0.2', port=3306, user='root',
passwd='root', db='airflow')
I have the following error:

pymysql.err.OperationalError: (2003, «Не удается подключиться к серверу MySQL на'172.17.0.2' ([Errno 111] Соединение отказано) ")

Обновление: my.cnf выглядит следующим образом:

[mysqld]
transaction-isolation = READ-COMMITTED
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links = 0

key_buffer = 16M
key_buffer_size = 32M
max_allowed_packet = 32M
thread_stack = 256K
thread_cache_size = 64
query_cache_limit = 8M
query_cache_size = 64M
query_cache_type = 1

max_connections = 550
#expire_logs_days = 10
#max_binlog_size = 100M

#log_bin should be on a disk with enough free space. Replace '/var/lib/mysql/mysql_binary_log' with an appropriate path for your system
#and chown the specified folder to the mysql user.
log_bin=/var/lib/mysql/mysql_binary_log
#explicit_defaults_for_timestamp = 1

binlog_format = mixed

read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M

# InnoDB settings
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit  = 2
innodb_log_buffer_size = 64M
innodb_buffer_pool_size = 4G
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
innodb_log_file_size = 512M

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Я только что разобрался, как показано ниже:

Этот вопрос о том, что привилегия не была предоставлена ​​пользователю airflow@172.17.0.2

Что мне нужно сделать, это на mysql хоста,

GRANT ALL TO 'airflow'@'172.17.0.2' IDENTIFIED BY 'airflow' ;
FLUSH PRIVILEGES;

Это очень ясно, если вы сделаете: select User, Host, Password from mysql.user;

Теперь соединение можно создать с помощью pymysql.

Для удобства тестирования можноне нужно проверять его в dag воздушного потока, это можно проверить только с помощью python (но с импортированным pymysql)

Надеюсь, это поможет.

0 голосов
/ 25 ноября 2018

Это из mysql-doc

Убедитесь, что сервер не был настроен на игнорирование сетевых подключений или (если вы пытаетесь подключиться удаленно), что онне был настроен на прослушивание только локально на своих сетевых интерфейсах.Если сервер был запущен с --skip-network, он вообще не будет принимать соединения TCP / IP.Если сервер был запущен с параметром --bind-address = 127.0.0.1, он будет прослушивать соединения TCP / IP только локально на интерфейсе обратной связи и не будет принимать удаленные соединения.

Когда что-то изDocker Network пытается подключиться к локальному хосту: он также пытается получить доступ к mysql с удаленного компьютера.

Найдите комментарий my.cnf (обычно /etc/mysql/my.cnf) в строке bind-address=127.0.0.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...