Docker群集模式 | telnet:无法连接到远程主机:主机不可达

3
在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
2个回答

1
我遇到了相同的问题 - 根据您想连接的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地址范围,以避免这种问题。

1
谢谢,差点整整一天都没有解决方案。我能够离开Docker Swarm并创建一个新的。这解决了问题,因为我的AWS子网也是在以下CIDR块范围内创建的:10.0.0.0/16。 - Nirojan Selvanathan

1
我能够通过使用主机网络模式使其正常工作。
    .......
    networks:
      - metabase

networks:
  metabase:
    external:
      name: "host"

PS - 在使用主机网络模式后,它运行良好,但这并不建议。更多答案是受欢迎的,因为我不确定为什么在默认的Swarm虚拟网络下它能够工作的确切原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接