Редагувати: Якщо ви використовуєте Docker-for-mac або Docker-for-Windows 18.03+, просто підключіться до служби mysql за допомогою хоста host.docker.internal
(замість 127.0.0.1
рядка підключення).
Станом на Docker 18.09.3, це не працює на Docker-for-Linux. Виправлення було представлено на 8 березня, 2019 і ми сподіваємося , будуть об'єднані в базу коду. До цього часу вирішується використання контейнера, як описано у відповіді qoomon .
2020-01: досягнуто певного прогресу . Якщо все піде добре, це має приземлитися в Докер 20.04
TLDR
Використовуйте --network="host"
у вашій docker run
команді, тоді 127.0.0.1
ваш контейнер докера буде вказувати на вашого хокера докера.
Примітка. Цей режим працює лише на Docker для Linux відповідно до документації .
Зверніть увагу на режими роботи мережі контейнерів докер
Docker пропонує різні режими роботи мережі під час запуску контейнерів. Залежно від обраного режиму ви підключитесь до своєї бази даних MySQL, що працює на хості докера по-різному.
docker run --network = "міст" (за замовчуванням)
Docker створює міст, названий docker0
за замовчуванням. IP-хост і контейнер докера мають IP-адресу на цьому мості.
на хості Docker введіть sudo ip addr show docker0
висновок, схожий на:
[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever
Отже, тут мій докер-хост має IP-адресу 172.17.42.1
в docker0
мережевому інтерфейсі.
Тепер запустіть новий контейнер і вставте на нього оболонку: docker run --rm -it ubuntu:trusty bash
а в межах контейнера ip addr show eth0
дізнайтеся, як налаштований його основний мережевий інтерфейс:
root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.192/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
valid_lft forever preferred_lft forever
Тут мій контейнер має IP-адресу 172.17.1.192
. Тепер подивіться на таблицю маршрутизації:
root@e77f6a1b3740:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
Отже IP-адреса хоста докера 172.17.42.1
задається як маршрут за замовчуванням і є доступним з вашого контейнера.
root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
docker run --network = "хост"
Крім того, ви можете запустити контейнер докера з мережевими налаштуваннямиhost
. Такий контейнер буде спільним мережевим стеком з хостом докера, і з точки зору контейнера localhost
(або 127.0.0.1
) буде посилатися на хост докера.
Майте на увазі, що будь-який порт, відкритий у вашому докерному контейнері, буде відкритий на хості докера. І це, не вимагаючи -p
або -P
docker run
опції .
Конфігурація IP на моєму хості докера:
[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
і з докерного контейнера в хостовому режимі:
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
Як ви можете бачити, як хост докера, так і контейнер докер мають спільний інтерфейс, і вони мають однакову IP-адресу.
Підключення до MySQL з контейнерів
мостовий режим
Щоб отримати доступ до MySQL, який працює на хості докера, з контейнерів у режимі мосту , вам потрібно переконатися, що служба MySQL прослуховує з'єднання за 172.17.42.1
IP-адресою.
Для цього переконайтеся, що у вас є bind-address = 172.17.42.1
або bind-address = 0.0.0.0
у вашому конфігураційному файлі MySQL (my.cnf).
Якщо вам потрібно встановити змінну середовища з IP-адресою шлюзу, ви можете запустити наступний код у контейнері:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
тоді у вашій програмі використовуйте DOCKER_HOST_IP
змінну середовища для відкриття з'єднання з MySQL.
Примітка: якщо ви використовуєте bind-address = 0.0.0.0
ваш сервер MySQL, він прослуховує з'єднання на всіх мережевих інтерфейсах. Це означає, що ваш сервер MySQL можна отримати з Інтернету; переконайтеся, що відповідно встановити правила брандмауера.
Примітка 2: якщо ви використовуєте bind-address = 172.17.42.1
ваш сервер MySQL, він не прослуховує з'єднання, зроблені на 127.0.0.1
. Процеси, що працюють на хості докера, який хотів би підключитися до MySQL, повинні використовувати 172.17.42.1
IP-адресу.
хост-режим
Щоб отримати доступ до MySQL, який працює на хості докера, з контейнерів у хостовому режимі , ви можете зберігати bind-address = 127.0.0.1
свою конфігурацію MySQL, і все, що вам потрібно зробити, це підключитися до 127.0.0.1
своїх контейнерів:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Примітка: Використовуйте mysql -h 127.0.0.1
і ні mysql -h localhost
; в іншому випадку клієнт MySQL намагатиметься підключитися за допомогою unix socket.