我有几台服务器。每台服务器都有很多用于 HTTPS 的 docker-compose 项目,这些项目使用一个自动发现 HTTPS 反向代理。
几天前我在 youtube 上发现,Swarm 非常容易设置,并且可以让我在这些机器之间移动容器,而不会产生大量的停机时间。
现在谈谈我的两个问题:
1.) 同步配置和 letsencrypt 证书
我创建了一个配置:
版本:'3.2' 服务: nginx的: 图片:myFancyImage 网络: - 网络 重启:总是 部署: 模式:全局 端口: - 目标:80 已发布:81 # 用于测试 协议:tcp 模式:入口 - 目标:443 已发布:444 # 用于测试 协议:tcp 模式:入口 卷: -mainnginx-www:/var/www -mainnginx-letsencrypt:/etc/letsencrypt -mainnginx-sites-enabled:在/etc/nginx/sites-enabled/ 卷: 主nginx-www: 主nginx-letsencrypt: mainnginx-站点已启用: 网络: 网站: 外部的: 名称:web1
并通过以下方式部署服务:
docker stack deploy --compose-file docker-compose.yml mainnginx
现在,两台机器上我的反向代理实例都运行并安装了三个卷,但它们只是本地的,而不是共享的。
当然,我可以使用 NFS 来同步它们,但这里的最佳做法是什么?NFS 看起来不干净。我读到过某处,docker 正在从管理器挂载,但事实并非如此...
你是如何解决这个问题的?
2.)使用 Swarm 网络与本地容器协同工作
我为我的主代理创建了一个网络:
docker network create --opt encrypted --attachable --driver overlay web1
并将我的一个本地项目从 server1 添加到网络,如演示文稿中所示。
然后,我尝试从我的服务器 1 反向代理和我的服务器 2 反向代理进行连接,以 ping 我的项目容器,但只能从服务器 1 执行此操作。服务器 2 发现了正确的 IP,但既没有 ping 也没有 pon 。它只是等待。
我做错了什么?这根本就不是我的想法吗?
答案1
与您的第一个问题相关。虽然 Swarm 确实易于设置,并允许您创建容器的副本和更多内容,但 Swarm 中不包含卷共享功能。您说得对,卷未安装在管理器中。每个容器都会在其运行的每个工作主机上安装一个卷,并且这些卷不会在 Swarm 中共享。
您应该查看有关卷插件的 Docker 文档。从文档中可以看出,“卷插件可能使 Docker 卷能够跨多个 Docker 主机持久保存”。因此,如果您希望在群集主机之间共享相同的卷,那么您必须选择最适合您环境的卷插件,从中选择一个插件列表。
正如您所提到的,卷插件的替代方案当然可以是与 NFS、GlusterFS 或 Ceph 共享数据,其中 Swarm 中的工作节点应该共享卷的挂载点。我建议您阅读此文章关于卷持久性和卷共享,虽然它已经过时并且与 Swarm 没有直接关系,但它提供了有价值的信息,并讨论了提到的两种策略:卷插件和数据共享。请注意,文章中提到了 Flocker,但 Flocker 已停产,尽管它在这里被分叉了https://github.com/ScatterHQ/flocker)。由于 ServerFault 不是基于观点的,因此我没有包含我的偏好,我只是提到了针对您的问题的现有策略。
关于你的第二个问题。得益于覆盖网络,Swarm 确实允许你互连位于不同工作主机的容器。我使用负载均衡器和反向代理,可以完美地连接其他容器。你在其中一个 Swarm 管理器中创建网络,你的工作主机将被修改,以便创建相同的网络并应用防火墙规则。如果你遇到问题,我建议你遵循Swarm 教程这样您就可以看到它正在运行或检测设置中的问题。我用它来进行故障排除。