Düzenle: Eğer kullanıyorsanız Docker-for-mac veya Docker-için Windows 18.03+, sadece ev sahibi kullanarak MySQL hizmetine bağlanmak host.docker.internal
(yerine 127.0.0.1
bağlantı dizesinde).
Docker 18.09.3'ten itibaren, bu, Linux için Docker'da çalışmaz. 8 Mart 2019'da bir düzeltme gönderildi ve umarım kod tabanıyla birleştirilecek. O zamana kadar bir çözüm, qoomon'un cevabında açıklandığı gibi bir kap kullanmaktır .
2020-01: bazı ilerlemeler kaydedildi . Her şey yolunda giderse, bu Docker 20.04'e inmeli
TLDR
Kullan --network="host"
senin de docker run
daha sonra, komuta 127.0.0.1
senin liman işçisi konak işaret olacaktır liman işçisi kap içinde.
Not: Bu mod yalnızca Linux için Docker'da çalışır, , belgelere göre .
Docker konteyneri ağ modları hakkında not
Docker teklifleri kapsayıcıları çalıştırırken farklı ağ modları . Seçtiğiniz moda bağlı olarak, docker ana bilgisayarında çalışan MySQL veritabanınıza farklı bağlanırsınız.
docker run --network = "köprü" (varsayılan)
Docker adlı bir köprü oluşturur docker0
varsayılan olarak . Hem docker ana bilgisayarında hem de docker kapsayıcılarında bu köprüde bir IP adresi bulunur.
Docker ana bilgisayarına şöyle sudo ip addr show docker0
bir çıktıya sahip olacağınızı yazın :
[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
Yani burada benim liman işçisi ana bilgisayar IP adresi vardır 172.17.42.1
üzerindedocker0
ağ arayüzünde .
Şimdi yeni bir kapsayıcı başlatın ve üzerine bir kabuk alın: docker run --rm -it ubuntu:trusty bash
ve ip addr show eth0
ana ağ arayüzünün nasıl kurulduğunu öğrenmek için kapsayıcı türü içinde :
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
Burada kabımın IP adresi var 172.17.1.192
. Şimdi yönlendirme tablosuna bakın:
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
Böylece docker ana bilgisayarının IP Adresi 172.17.42.1
varsayılan yol olarak ayarlanır ve kapsayıcıdan erişilebilir.
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 = "ana bilgisayar"
Alternatif olarak, ağ ayarları olarak ayarlanmışhost
bir docker kapsayıcısı çalıştırabilirsiniz . Böyle bir kap, ağ yığınını liman işçisini barındıran ve kapsayıcı açısından paylaşacaktır localhost
(veya127.0.0.1
) yükleyici ana bilgisayarına atıfta bulunacaktır.
Docker kabınızda açılan tüm bağlantı noktalarının docker ana bilgisayarında açılacağını unutmayın. Ve bu, veya seçeneğine ihtiyaç duymadan-p
-P
docker run
.
Docker ana bilgisayarımdaki IP yapılandırması:
[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
ve ana bilgisayar kipindeki docker kapsayıcısından :
[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
Gördüğünüz gibi hem docker ana makinesi hem de docker konteyneri aynı ağ arayüzünü paylaşır ve aynı IP adresine sahiptir.
Kapsayıcılardan MySQL'e bağlanma
köprü modu
Docker ana bilgisayarında çalışan MySQL'e köprü kipindeki kaplardan erişmek için, MySQL hizmetinin ağ bağlantılarını dinlediğinden emin olmanız gerekir.172.17.42.1
IP adresindeki .
Bunu yapmak için, emin olun ya bind-address = 172.17.42.1
yabind-address = 0.0.0.0
için MySQL yapılandırma dosyanızın (my.cnf) içinde .
Ağ geçidinin IP adresiyle bir ortam değişkeni ayarlamanız gerekirse, bir kapta aşağıdaki kodu çalıştırabilirsiniz:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
uygulamanızda DOCKER_HOST_IP
MySQL bağlantısını açmak için ortam değişkenini kullanın.
Not:bind-address = 0.0.0.0
MySQL sunucunuzu kullanırsanız tüm ağ arayüzlerindeki bağlantıları dinler. Bu, MySQL sunucunuza İnternet'ten erişilebileceği anlamına gelir; güvenlik duvarı kurallarını buna göre ayarladığınızdan emin olun.
Not 2:bind-address = 172.17.42.1
MySQL sunucunuzu kullanıyorsanız , yapılan bağlantıları dinlemez 127.0.0.1
. Docker ana bilgisayarında MySQL'e bağlanmak isteyecek işlemlerin172.17.42.1
IP adresini .
ana bilgisayar modu
Docker ana bilgisayarında çalışan MySQL'e ana makine modunda kapsayıcılardan erişmek bind-address = 127.0.0.1
için MySQL yapılandırmanızda kalabilir ve tek yapmanız gereken 127.0.0.1
kaplarınızdan bağlanmaktır :
[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>
not: kullanın mysql -h 127.0.0.1
ve değil mysql -h localhost
; aksi takdirde MySQL istemcisi bir unix soketi kullanarak bağlanmaya çalışır.