从Docker容器连接到本地主机上的Mysql

我有我的本地主机上运行的MySQL我可以连接它通过运行:

mysql -h 127.0.0.1 -P 3306 -u root -p 

我也用命令运行docker容器:

 docker run -tid -v $(pwd):/code -p 3306:3306 -p 5000:5000 --name container container 

我想从docker容器中访问我的Mysql数据库。 所以我也从docker集装箱input:

 mysql -h 127.0.0.1 -P 3306 -u root -p 

但它给我错误:

 ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111) 

我究竟做错了什么? 端口似乎是正确的。 编辑1docker的ifconfig输出:

 eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1780 errors:0 dropped:0 overruns:0 frame:0 TX packets:977 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2225781 (2.2 MB) TX bytes:56572 (56.5 KB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:28 errors:0 dropped:0 overruns:0 frame:0 TX packets:28 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:1400 (1.4 KB) TX bytes:1400 (1.4 KB) 

即使将mysqlconfiguration为在所有接口上侦听,然后从您的容器从非环回IP访问mysql,您可能会发现docker路由,nat和防火墙规则不允许您访问在主机上运行的服务。 对此的快速解决方法是在主机networking堆栈上运行您的容器:

 docker run -tid -v $(pwd):/code -p 3306:3306 -p 5000:5000 \ --name container --net host container 

你也可以在运行在同一个dockernetworking上的容器中移动mysql,然后通过使用docker的DNS服务发现的容器名称来访问它。

使用默认路由。 例如:

 ~# ip route show | grep "default" | awk '{print $3}' 172.18.0.1 

然后

 mysql -h 172.18.0.1 -P 3306 -u root -p 

如果你需要自动化这个,比方说,在一个shell脚本上使用这个IP,把它发送到一个shell脚本,并把它作为:

 host=$(ip route show | grep \"default\" | awk '{print $3}' | xargs echo -n) 

那么你在$host上有主机IP地址