我在AWS中有两台服务器,两者都在一个安全组中,该组允许安全组成员之间所有端口上的所有流量。在一台服务器上我有一个MySQL服务器(没有docker,让我们把这个服务器称为" MySQL服务器")而在另一台服务器上我有docker(让我们称之为&# 34; Docker服务器")。我想从docker服务器上的容器内访问MySQL,而不必通过互联网路由流量(我想使用MySQL服务器的内部IP地址)。
这可能吗?我有什么选择?
我已将MySQL服务器配置为侦听所有接口,仅用于测试。这允许我从Docker服务器成功连接到MySQL服务器(使用mysql客户端连接到MySQL服务器的私有IP地址)。但是,当我启动容器时,会创建一个新的网络命名空间,因此我无法再访问MySQL服务器的私有IP地址。
我已尝试使用如here所述的大使容器,但我遇到了同样的问题,大使容器内部无法提供MySQL服务器的私有IP地址。
以下是一个示例来说明问题以及我尝试做的事情。
从Docker服务器(尚未在任何容器中):
$ ping -c 1 10.0.0.155
PING 10.0.0.155 (10.0.0.155) 56(84) bytes of data.
64 bytes from 10.0.0.155: icmp_seq=1 ttl=64 time=0.777 ms
--- 10.0.0.155 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.777/0.777/0.777/0.000 ms
但是在容器内尝试:
$ sudo docker run --rm -it apcera/nats-ping-client ping -c 1 10.0.0.115
PING 10.0.0.115 (10.0.0.115) 56(84) bytes of data.
From 10.0.0.200 icmp_seq=1 Destination Host Unreachable
--- 10.0.0.115 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
我希望这是因为我知道docker只为容器创建了一个新的专用网络,但我不知道能够绕过我想要做的事情。
如何连接东西以便能够从容器中访问mysql服务器?
答案 0 :(得分:3)
是的,这是可能的。
容器是否可以与世界对话取决于两个因素。第一个因素是主机是否正在转发其IP数据包。第二个是主持人的iptables
是否允许此特定连接。
要检查内核上的设置或手动启用它:(一定要设置为1 )
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 0
$ sysctl net.ipv4.conf.all.forwarding=1
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1
如果在守护程序启动时设置iptables
,Docker将永远不会更改系统--iptables=false
规则。否则,Docker服务器会将转发规则附加到DOCKER过滤器链。因此,请务必不要使用--iptables=false