编辑: 如果您使用的是Docker-for-mac或Docker-for-
Windows
18.03+,只需使用主机
host.docker.internal(而不是
127.0.0.1连接字符串中的)连接到您的mysql服务。
从Docker 18.09.3开始,这不适用于Linux上的Docker。
一个修复已三月提交的8日,2019年将有望被合并到代码库。在此之前,解决方法是使用qoomon的answer中所述的容器。
2020-01:
取得了一些进展。如果一切顺利,这应该可以在Docker
20.04中找到
TLDR
--network="host"在
docker run命令中使用,然后
127.0.0.1在Docker容器中将指向您的Docker主机。
注意:根据文档,此模式仅适用于Linux的Docker 。
关于Docker容器联网模式的注意事项
运行容器时,Docker提供了不同的联网模式。根据您选择的模式,您将以不同的方式连接到在docker主机上运行的MySQL数据库。
docker run –network =“ bridge”(默认)Docker创建一个
docker0默认命名的网桥。docker主机和docker容器在该网桥上均具有IP地址。
在Docker主机上,键入
sudo ip addr show docker0您将具有以下输出:
[vagrant@docker:~] $ sudo ip addr show docker04: 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
因此,这里我的Docker主机
172.17.42.1在
docker0网络接口上具有IP地址。
现在启动一个新容器并在其上安装一个外壳:
docker run --rm -it ubuntu:trusty bash在容器类型内,
ip addrshow eth0以发现其主要网络接口的设置方式:
root@e77f6a1b3740:/# ip addr show eth0863: 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:/# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault 172.17.42.1 0.0.0.0 UG 0 0 0 eth0172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
因此,将Docker主机的IP地址
172.17.42.1设置为默认路由,并且可以从您的容器访问它。
泊坞窗运行–network =“ host”root@e77f6a1b3740:/# ping 172.17.42.1PING 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 ms64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
或者,您可以运行网络设置
host为的Docker容器。这样的容器将与docker主机共享网络堆栈,并且从容器的角度来看,
localhost(或
127.0.0.1)将引用docker主机。
请注意,您在Docker容器中打开的任何端口都将在Docker主机上打开。而且这不需要
-por
-P
dockerrun选项。
我的Docker主机上的IP配置:
[vagrant@docker:~] $ ip addr show eth02: 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
并在 主机 模式下从Docker容器中获取:
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth02: 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
如您所见,docker主机和docker容器共享完全相同的网络接口,因此具有相同的IP地址。
从容器连接到MySQL桥接模式
要以 桥接模式 从容器访问在docker主机上运行的MySQL ,您需要确保MySQL服务正在侦听
172.17.42.1IP地址上的连接。
要做到这一点,请确保您有两种
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 }')
然后在您的应用程序中,使用
DOCKER_HOST_IP环境变量打开与MySQL的连接。
注意: 如果使用
bind-address =0.0.0.0MySQL服务器,它将监听所有网络接口上的连接。这意味着您可以从Internet访问MySQL服务器。确保相应地设置防火墙规则。
注意2: 如果使用
bind-address =172.17.42.1MySQL服务器,则不会监听与的连接
127.0.0.1。在要连接到MySQL的docker主机上运行的进程必须使用
172.17.42.1IP地址。主机模式
要以 主机模式 从容器访问在docker主机上运行的MySQL ,您可以保持
bind-address =127.0.0.1MySQL配置,而要做的就是
127.0.0.1从容器连接到:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -pEnter password:Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 36Server 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套接字进行连接。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)