Docker群:如何将应用程序和数据库放在一起?

时间:2018-11-19 08:50:12

标签: docker docker-swarm docker-swarm-mode

我有两个服务的堆栈:Spring Boot应用程序和mongo数据库。 我想将此堆栈部署到Docker Swarm(德国1个节点,芬兰1个节点和爱沙尼亚1个节点)。

当前Swarm将应用程序调度到德国集群,将数据库调度到芬兰,这意味着每个请求都从德国发送到芬兰。

通过这种方式如何迫使Swarm将所有堆栈都放置到单个节点上?

P.S。坚持使用主机名不是解决方案,因为如果节点死亡,服务将关闭。

我的Stack.yml是:

version: '3.3'
services:
app:
  image: kyberorg/boot-mongo
  networks:
  - net
  ports:
    - "8080:8080"
  depends_on:
    - mongo
labels:
  - ee.yadev.bootmongoapp
deploy:
  mode: replicated
  replicas: 1
  update_config:
    parallelism: 1
    delay: 10s
 mongo:
   image: mongo
  networks:
    - net
  volumes:
    - example-mongo:/data/db
  deploy:
    mode: replicated
    replicas: 1
    update_config:
      parallelism: 1
      delay: 10s
networks:
  net:
   driver: overlay
volumes:
  example-mongo:
    external: true

4 个答案:

答案 0 :(得分:1)

您正在寻找的是POD中的kubernetes之类的东西,可以在同一位置放置容器。 AFAIK,当前在docker上不可用。

您可以查看此存储库,看看它是否有用:https://github.com/rycus86/podlike

这是将Pod的概念引入docker的尝试。

编辑:附带说明一下,如果应用程序和数据库是如此紧密地耦合在一起,那么它们都属于同一容器是有道理的。

答案 1 :(得分:1)

Swarm的体系结构通常是由于管理者的延迟而在同一区域中需要单个swarm的体系结构。通常,一个群是“单个区域,多个可用区”(数据中心通常彼此靠近,通常在同一城市。)

我也想不出一种方法,可以使用约束和/或放置首选项将两个容器放在一个数据中心中,然后如果第一个关闭,则经理将它们移动到同一第二个数据中心。 / p>

Podlike,就像giabar提到的那样,是一种选择,但不能解决“跨多个区域的单一群”的设计挑战。

答案 2 :(得分:1)

我也花了半天时间寻找解决方案,然后找到了。

看看“亲和力”选项,这里对此进行了很好的描述:https://blog.docker.com/2015/02/scaling-docker-with-swarm/

亲和力 在某些情况下,容器的放置必须相对于其他容器。 Swarm可让您通过亲缘关系定义这些关系。

以下内容将运行两台Redis服务器,同时确保它们不会在同一台计算机上进行调度:

docker run -d --name redis_1 -e‘affinity:container!= redis_ ’redis docker run -d --name redis_2 -e‘affinity:container!= redis _ ’redis

暗含容器之间的关系时,会自动生成关联。使用–link,–volumes-from和–net = container之类的选项的容器:在同一主机上共同调度。

答案 3 :(得分:0)

我的第一个想法是建议您使用“展示位置限制”和“标签”:

https://docs.docker.com/engine/swarm/services/#placement-constraints https://docs.docker.com/engine/swarm/manage-nodes/#add-or-remove-label-metadata

感谢他们,您可以为每个国家/地区的节点分配标签,然后修改堆栈以强制应用程序在同一节点上运行。

docker node update --label-add country =德国node-germany docker node update --label-add country =芬兰node-finland

-约束node.labels.region == east

版本:“ 3.3” 服务:   应用程式:     图片:kyberorg / boot-mongo     部署:       放置:         约束:           -国家==德国

mongo:     图片:蒙哥     部署:       放置:         约束:           -国家==德国

其他有用的链接:

https://semaphoreci.com/community/tutorials/scheduling-services-on-a-docker-swarm-mode-cluster https://container-solutions.com/using-binpack-with-docker-swarm/

希望这对您有帮助!