如何使用 docker swarm 扩展具有多个暴露端口和多个卷的应用程序?
How to scale application with multiple exposed ports and multiple volume mounted by using docker swarm?
我有一个基于 Java 的应用程序(Jboss 版本 6.1 社区),它的流量很大。现在我想使用 docker 和 docker-swarm 迁移此应用程序部署以进行集群。
场景
我的应用程序需要从 docker 容器中公开两个端口,一个是 Web 端口(即 9080),另一个是数据库连接端口(即 1521),并且安装在每个容器上的日志目录等内容很少主机系统。
简单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
现在,如果我 scale/replicate 以上服务到 2 或 3,它将绑定哪个主机端口以及为新创建的容器绑定哪个挂载目录??
任何人都可以帮助我了解规模和复制服务在这种情况下的工作方式吗?
我也经历了 --publish
和 --name global
但对我的情况没有任何帮助。
谢谢!
支持有状态容器在 Docker 宇宙中还不成熟。
我不确定 Docker Swarm 是否可行(如果我想知道的话),这不是一个简单的问题。
我建议您查看最新版本的 Kubernetes 中的 Statefulset 功能:
- https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/
- https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/
它支持在 scale-up 事件中为每个容器创建一个唯一的卷。至于端口处理,它是实现容器负载平衡的 Kubernetes 正常服务功能的一部分。
我建议将您的堆栈构建到 docker-compose v3 文件中,可以 运行 到 swarn-cluster 中。
您应该公开它们,而不是发布这些端口。这意味着,这些端口不能直接在主机系统上使用,而是在 docker-network 中。默认情况下,每个 Composefile 都有自己的网络,例如:172.18.0.0/24。每个容器都有一个自己的 ip,并使该服务在指定端口之外可用。
如果您扩展到 3 个容器,您将获得:
172.18.0.1:9080,1521
172.18.0.2:9080,1521
172.18.0.3:9080,1521
您需要负载平衡器才能访问这些服务。如果您更喜欢容器方法,我会使用 Jwilder/Nginx。我也可以推荐带有内部负载均衡器的 Rancher。
在 Swarm-mode 中,您必须使用覆盖网络驱动程序并创建网络,否则只能从本地主机本身访问它。
与日志记录相关,您应该将日志文件重定向到标准输出并使用日志记录驱动程序(fluentd、syslog、graylog2)捕获它们
对于持久存储,您应该看看 flocker!但是数据库可能不支持这些存储实现。例如:MYsql 不支持它们,mongodb 可以使用 flocker 体积。
看来你要多读书了.. :)
https://docs.docker.com/
我有一个基于 Java 的应用程序(Jboss 版本 6.1 社区),它的流量很大。现在我想使用 docker 和 docker-swarm 迁移此应用程序部署以进行集群。
场景
我的应用程序需要从 docker 容器中公开两个端口,一个是 Web 端口(即 9080),另一个是数据库连接端口(即 1521),并且安装在每个容器上的日志目录等内容很少主机系统。
简单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
现在,如果我 scale/replicate 以上服务到 2 或 3,它将绑定哪个主机端口以及为新创建的容器绑定哪个挂载目录??
任何人都可以帮助我了解规模和复制服务在这种情况下的工作方式吗?
我也经历了 --publish
和 --name global
但对我的情况没有任何帮助。
谢谢!
支持有状态容器在 Docker 宇宙中还不成熟。 我不确定 Docker Swarm 是否可行(如果我想知道的话),这不是一个简单的问题。
我建议您查看最新版本的 Kubernetes 中的 Statefulset 功能:
- https://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/
- https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/
它支持在 scale-up 事件中为每个容器创建一个唯一的卷。至于端口处理,它是实现容器负载平衡的 Kubernetes 正常服务功能的一部分。
我建议将您的堆栈构建到 docker-compose v3 文件中,可以 运行 到 swarn-cluster 中。 您应该公开它们,而不是发布这些端口。这意味着,这些端口不能直接在主机系统上使用,而是在 docker-network 中。默认情况下,每个 Composefile 都有自己的网络,例如:172.18.0.0/24。每个容器都有一个自己的 ip,并使该服务在指定端口之外可用。 如果您扩展到 3 个容器,您将获得: 172.18.0.1:9080,1521 172.18.0.2:9080,1521 172.18.0.3:9080,1521
您需要负载平衡器才能访问这些服务。如果您更喜欢容器方法,我会使用 Jwilder/Nginx。我也可以推荐带有内部负载均衡器的 Rancher。
在 Swarm-mode 中,您必须使用覆盖网络驱动程序并创建网络,否则只能从本地主机本身访问它。
与日志记录相关,您应该将日志文件重定向到标准输出并使用日志记录驱动程序(fluentd、syslog、graylog2)捕获它们
对于持久存储,您应该看看 flocker!但是数据库可能不支持这些存储实现。例如:MYsql 不支持它们,mongodb 可以使用 flocker 体积。
看来你要多读书了.. :) https://docs.docker.com/