在AWS EC2上,尝试从Swarm容器连接到私有RDS实例。它在容器内无法运行,但在主机上运行良好。我只有一个主节点和节点设置-
bash-4.3# telnet mydb.cd1xokc1nbn4.ap-southeast-1.rds.amazonaws.com 5432
telnet: can't connect to remote host (10.0.2.3): Host is unreachable
bash-4.3# exit
ubuntu@ip-10-0-2-157:~/metabase$ telnet mydb.cd1xokc1nbn4.ap-southeast-1.rds.amazonaws.com 5432
Trying 10.0.2.3...
Connected to mydb.cd1xokc1nbn4.ap-southeast-1.rds.amazonaws.com.
Escape character is '^]'.
我很确定这与Swarm中的网络有关,因为如果执行docker run
,我就能连接到数据库。
Docker版本-
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:49:01 2018
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:16:44 2018
OS/Arch: linux/amd64
Experimental: false
答案 0 :(得分:0)
我能够通过使用主机网络模式使其工作。
class MY_Loader extends CI_Loader {
static $add_data = array();
public function view($view, $vars = array(), $return = FALSE)
{
self::$add_data = array_merge($vars, self::$add_data);
return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars(self::$add_data), '_ci_return' => $return));
}
}
PS-使用主机网络模式后,它工作正常,但不建议这样做。欢迎提供更多答案,因为我不确定确切原因与默认群集虚拟网络一起使用。
答案 1 :(得分:0)
我遇到了同样的问题 - 根据您要连接的 IP 地址,我猜您的问题有相同的原因。
Docker Swarm 覆盖网络默认使用 10.0.x.x 范围内的 IP 地址。在您的情况下,您想要连接到数据库的服务/容器可能位于 10.0.2.x IP 范围内的 Docker 网络中 - 因此它会尝试通过该网络连接到数据库主机,这显然不会工作。
所以你需要解决这个冲突。一种方法是配置 Swarm 以使用不同的 IP 范围。缺点是您只能在初始化 Swarm 时执行此操作(因此您必须重新创建它)。例如:
docker swarm init --default-addr-pool 10.10.0.0/16
验证它是否按预期工作的一种方法是之后创建一个新网络并检查子网:
docker network create -d overlay proxy
docker network inspect proxy | grep Subnet
如果您可以控制 AWS 子网的 IP 范围,您可能还可以更改那里的 IP 地址范围,以避免出现这种问题。