如何使用docker swarm扩展多个暴露端口和多个卷安装的应用程序?

时间:2017-01-25 10:27:41

标签: linux docker autoscaling docker-swarm docker-swarm-mode

我有一个基于Java的应用程序(Jboss版本6.1社区),流量很大。现在,我想使用docker和docker-swarm迁移此应用程序部署以进行群集。

方案

我的应用程序需要两个从docker容器暴露的端口,一个是Web端口(ie9080),另一个是数据库连接端口(ie1521),并且主机系统上安装的每个容器的日志目录都很少。

简单的Docker示例

docker run -it -d --name web1 -h "My Hostname" -p 9080:9080 -p 1521:1521 -v /home/web1/log:/opt/web1/jboss/server/log/ -v /home/web1/license:/opt/web1/jboss/server/license/ MYIMAGE

使用Swarm示例的Docker

docker service create --name jboss_service --mount type=bind,source=/home/web1/license,destination=/opt/web1/jboss/server/license/ --mount type=bind,source=/home/web1/log,destination=/opt/web1/jboss/server/log/ MYIMAGE

现在,如果我将上述服务扩展/复制到2或3,它将绑定哪个主机端口以及它将为新创建的容器绑定哪个挂载目录?

任何人都可以帮助我了解规模和复制服务在这种情况下的工作方式吗?

我也经历了--publish--name global但在我的情况下没有任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

在Docker世界中,支持有状态容器仍然不成熟。 我不确定Docker Swarm是否可行(如果它是我想知道的话)并且它不是一个简单的问题需要解决。

我建议您查看最新版Kubernetes中的Statefulset功能:

它支持在扩展事件中为每个容器创建唯一卷。至于端口处理,它是实现容器负载平衡的Kubernetes nornal Service功能的一部分。

答案 1 :(得分:1)

我建议将堆栈构建为docker-compose v3文件,该文件可以运行到swarn-cluster上。 而是发布这些端口,您应该公开它们。这意味着,端口不能直接在主机系统上使用,而是在docker-network中。默认情况下,每个Composefile都有自己的网络,例如:172.18.0.0/24。每个Container都有一个自己的ip,并使该服务可用于指定端口。 如果您扩展到3个容器,您将获得: 172.18.0.1:9080,1521 172.18.0.2:9080,1521 172.18.0.3:9080,1521

您需要一个Loadbalancer才能访问这些服务。如果您更喜欢容器方法,我会使用Jwilder / Nginx。我也可以推荐带有内部负载均衡器的Rancher。

在Swarm模式下,您必须使用覆盖网络驱动程序并创建网络,否则只能从本地主机本身访问。

与日志记录相关,您应该将日志文件重定向到stdout并使用日志驱动程序(流利,syslog,graylog2)捕获它们

对于持久存储,你应该看看flocker!但是,数据库可能不支持这些存储实现。 EG:MYsql不支持它们,mongodb可以使用flocker卷。

好像你要读很多.. :) https://docs.docker.com/