【问题标题】:Connecting to a remote MySQL database from Docker container从 Docker 容器连接到远程 MySQL 数据库
【发布时间】:2016-07-27 15:28:48
【问题描述】:

我在 AWS 中有两台服务器,都在一个安全组中,允许安全组成员之间的所有端口上的所有流量。在一台服务器上,我有一个 MySQL 服务器(没有 docker,我们称此服务器为“MySQL 服务器”),在另一台服务器上我有 docker(我们称其为“Docker 服务器”)。我想从 docker 服务器上的容器内访问 MySQL,而不必通过 Internet 路由流量(我想改用 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 服务器?

【问题讨论】:

  • 看起来您没有从容器中暴露任何端口?你解决了吗?顺便说一句,ping 使用端口 7,所以即使这对你有用,我怀疑它会解决你的实际问题,因为 mysql 将使用不同的端口。
  • 不,原来的问题还没有解决。最后,我决定在 docker 容器中使用 mysql 服务器的公共 IP 地址。我更新了 AWS 安全组以限制只能从 docker 服务器访问 mysql 端口,这是有效的。但这不是我最初想要的,我想通过专用网络路由 mysql 流量,而不是通过互联网。

标签: networking docker


【解决方案1】:

是的,这是可能的。

容器能否与世界对话取决于两个因素。第一个因素是主机是否在转发其 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=false,Docker 将永远不会更改您的系统iptables 规则。否则 Docker 服务器会将转发规则附加到 DOCKER 过滤器链中。所以,一定不要使用--iptables=false

【讨论】:

  • sysctl net.ipv4.conf.all.forwarding 已经设置为 1,我没有在 docker 选项中使用 --iptables=false。你能解释一下我应该如何配置我的容器来让它工作吗?另请注意,我不一定需要容器与世界通信,只需要与 Docker 服务器专用网络上的另一台服务器通信。
  • @Camilo Silva,有什么方法可以在 Docker for Windows 中实现同样的效果吗?
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2021-11-23
相关资源
最近更新 更多