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

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

脚本

我的应用程序需要Docker容器中公开的两个端口,一个是Web端口(ie9080),另一个是数据库连接端口(即1521),并且在主机系统上安装的每个容器的日志目录都很less。

简单的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 

Docker与Swarm的例子

 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,它将绑定哪个主机端口和哪个挂载目录将绑定为新创build的容器?

任何人都可以帮助我得到如何规模和复制服务在这种情况下工作?

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

谢谢!

支持有状态的容器在Docker领域还是不成熟的。 我不确定Docker Swarm是否有可能(如果是我想知道的话),这不是一个简单的问题。

我build议您查看最新版本的Kubernetes中的Statefulsetfunction:

它支持在放大事件中为每个容器创build独特的卷。 对于实现容器负载平衡的Kubernetes正则服务function的一部分的端口处理。

我build议将你的堆栈构build成一个docker-compose v3文件,这个文件可以运行在一个swarn-cluster上。 相反,发布这些端口,你应该暴露他们。 这意味着,这些端口不能直接在主机系统上使用,而是在docker-network中。 每个Composefile默认都有自己的networking,例如: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。 我也可以推荐带有内部Loadbalancer的Rancher。

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

与日志logging相关,您应该将日志文件redirect到stdout,并使用日志logging驱动程序(fluentd,syslog,graylog2)

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

好像你必须阅读很多.. 🙂 https://docs.docker.com/

Interesting Posts