从Docker容器连接到远程MySQL数据库

时间:2016-07-27 15:28:49

标签: networking docker

我在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服务器?

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。

容器是否可以与世界对话取决于两个因素。第一个因素是主机是否正在转发其IP数据包。第二个是主持人的iptables是否允许此特定连接。

  1. 要检查内核上的设置或手动启用它:(一定要设置为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
    
  2. 如果在守护程序启动时设置iptables,Docker将永远不会更改系统--iptables=false规则。否则,Docker服务器会将转发规则附加到DOCKER过滤器链。因此,请务必不要使用--iptables=false