Docker-Machine命令超时TLS握手但Dock Swarmer工作正常

Ash*_*ken 6 linux docker digital-ocean docker-swarm docker-machine

我现在遇到了docker-machine的麻烦,以前工作正常,因为在Digital Ocean中运行docker的机器上的命令超时.

我可以SSH到机器和Docker Swarm,我们的系统似乎在机器上正常运行(docker node命令似乎工作正常,例如docker node ls).

这个问题似乎与docker机器有关.我过去有类似的东西,可以通过增加超时来修复,但现在这没有用.

该错误似乎是由net/http HTLS握手超时引起的输出:

docker-machine ls --timeout 30

说明:

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown 
dev-m0 - digitalocean Error Unknown Get https://api.digitalocean.com/v2/droplets/42100174: net/http: TLS handshake timeout
dev-w1 - digitalocean Error Unknown Get https://api.digitalocean.com/v2/droplets/42115817: net/http: TLS handshake timeout
... repeated for all managers and workers.
Run Code Online (Sandbox Code Playgroud)

我在Mac上运行Docker CE版本17.05.0-ce-rc1-mac8 Edge,在Digital Ocean上的Linux机器上运行17.03.0-ce(它们似乎是最新的).我已经在Mac上的Edge和Stable之间进行了交换,看看是否会导致问题,但它没有帮助.

我重新启动了机器(停止并启动).我没有重新生成证书,因为我可以使用docker-machine ssh dev-m1 SSH连接到没有问题的机器,所以看起来证书对我来说似乎不是问题.我不是想在本地运行任何容器.

这一切在过去一直很好,但最近刚刚停止.

任何帮助或建议最受赞赏.

谢谢,阿什利.

Fla*_*vin 2

假设

我的猜测是,docker 客户端虚拟机内的时间与数字海洋服务器不同步,导致 TLS 握手失败。尝试在 Mac 上运行以下命令来同步时钟:

$ docker run --rm --privileged alpine hwclock -s
Run Code Online (Sandbox Code Playgroud)

该命令将使用hwclock命令将 VM 内的时钟设置为 Mac 上的时钟。它需要特权访问,因为容器需要从主机硬件读取时间。

解释

Mac 上的 docker 客户端正在瘦虚拟机内运行。虚拟机中的时钟计时可能与 Mac 上的时间以及外界的时间不同步,尤其是当您在允许睡眠的笔记本电脑上使用 docker 时。时间不同步可能会导致任何需要了解 docker 服务器(虚拟机内部)上发生事件的时间并将其与 docker 服务器外部发生的事件进行比较的操作出现问题。我怀疑 TLS 与数字海洋的握手就是这样的操作之一。

我遇到了 docker 事件的行为不符合我预期的问题。在 docker 存储库的问题部分 ( moby/moby#25579 ) 中进行了很长的讨论后,我们发现时钟不同步是原因。