Изменить:
Если вы используете Docker-for-mac или Docker-for-Windows 18.03+, просто подключитесь к своей службе mysql с помощью хоста host.docker.internal
(вместо 127.0.0.1
в строке подключения).
Если вы используете Docker-for-Linux 20.10.0+, вы также можете использовать хост host.docker.internal
, если вы запустили свой контейнер Docker с параметром --add-host host.docker.internal:host-gateway
.
В противном случае читайте ниже
TL; DR
Используйте --network="host"
в своей команде docker run
, тогда 127.0.0.1
в вашем контейнере докера будет указывать на ваш хост докера.
Примечание. Этот режим работает только в Docker для Linux, согласно документации.
Примечание о сетевых режимах контейнера докеров
Docker предлагает различные сетевые режимы при запуске контейнеров. В зависимости от выбранного режима вы будете по-разному подключаться к базе данных MySQL, запущенной на хосте докера.
docker run --network = bridge (по умолчанию)
Docker по умолчанию создает мост с именем docker0
. И у хоста докеров, и у контейнеров докеров есть 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
В качестве альтернативы вы можете запустить контейнер докеров с настройками сети, установленными на 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-адресе.
Для этого убедитесь, что в вашем конфигурационном файле MySQL (my.cnf) указано значение bind-address = 172.17.42.1
или bind-address = 0.0.0.0
.
Если вам нужно установить переменную среды с 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.
person
Thomasleveil
schedule
20.06.2014
network: host
вы не можете вернуться из контейнера на хост. Только хост в контейнер. Это основная идеология контейнеров. Они изолированы как по соображениям стабильности, так и по соображениям безопасности. - person FreeSoftwareServers   schedule 17.05.2020