У меня есть локальное загрузочное приложение Spring, которое подключается к локальному MySQL и работает нормально.
Для подключения я использую следующее свойство:
spring.datasource.url=jdbc:mysql://localhost:3306/pitstop?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
Я хотел бы поместить свое приложение в докер и попытаться подключиться к локальной базе данных.
Поэтому мне нужно изменить MySQL url.
Я использовал эту команду для получения локального IP
ip route show | grep "default" | awk '{print $3}' результат 192.168.1.1. Я изменяю свой URL следующим образом
spring.datasource.url=jdbc:mysql://192.168.1.1:3306/pitstop?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
и попробуйте запустить контейнер docker с моим приложением командой docker run -p 9001:9001 --network=bizon4ik --rm bizon4ik/mycontainer результат будет исключением:
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Я пытался найти другой IP. Я использовал команду ip addr show и нашел следующую запись:
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 30:52:cb:db:8d:e0 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.102/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp3s0
Поэтому, основываясь на этом, я взял 192.168.1.102 и изменил свой URL-адрес, но в результате получил то же исключение.
Чтобы убедиться, что найденные IP-адреса верны, я запускаю новый контейнер с чистой Ubuntu docker run -it --rm --network=bizon4ik ubuntu и проверяю упомянутый выше IP-адрес:
root@268c4d544328:/# nmap -p 3306 192.168.1.1
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-28 17:28 UTC
Nmap scan report for 192.168.1.1
Host is up (0.053s latency).
PORT STATE SERVICE
3306/tcp filtered mysql
root@268c4d544328:/# nmap -p 3306 192.168.1.102
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-28 15:56 UTC
Nmap scan report for my-host (192.168.1.102)
Host is up (0.000088s latency).
PORT STATE SERVICE
3306/tcp closed mysql
Итак, выглядит нормально, контейнер Ubuntu может пинговать мою БД. У вас есть идеи, почему я не могу подключиться через приложение к БД?
Примечание:
Проверил в БД SHOW GRANTS; результат GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION
Я также проверил файл /etc/mysql/my.cnf. У него есть только эти записи:
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
у меня нет ~/.my.cnf
Выход nmap сообщает, что порт 3306 является closed или filtered не openдокументы. Где вы запускали команду ip route show? Хост или контейнер приложения?
Вы запускаете БД на своем хосте или она также находится в док-контейнере? Если это на хосте без контейнера, то почему? Если бы БД была в контейнере, у вас не было бы проблем с подключением.
@b0gusb Я использовал route на хосте
@Bizon4ik беги ip внутри контейнера. Это дает вам IP-адрес шлюза по умолчанию. Обычно это docker0 сетевой интерфейс в мостовой сети. Вы должны иметь возможность подключиться к этому IP
@SashaShpota моя БД в хосте
@ b0gusb Я пытался. Я дал мне какой-то IP, который начинается с 72..... Но результат тот же.




Проблема была в bind-address для MySQL. Я посмотрел это в /etc/mysql/my.cnf однако правильное место /etc/mysql/mysql.conf.d/mysqld.cnf
Возможный дубликат Как мне подключиться к локальному хосту машины из контейнера Docker?