Docker Swarm服务聚类

时间:2017-01-19 12:45:11

标签: docker docker-compose docker-swarm

我想使用docker-compose与Docker Swarm(我使用docker版本1.13并使用version: '3'语法编写)。 每项服务是否可以作为"单一"服务到其他服务?这是一个简单的示例:

version: '3'

services:
  nodejs:
    image: mynodeapp
    container_name: my_app
    ports:
      - "80:8080"
    environment:
      - REDIS_HOST=my_redis
      - REDIS_PORT=6379
    deploy:
      mode: replicated
      replicas: 3
    networks:
      - my_net
    command: npm start

  redis:
    image: redis
    container_name: my_redis
    restart: always
    expose:
      - 6379
    deploy:
      mode: replicated
      replicas: 2
    networks:
      - my_net

networks:
  my_net:
    external: true

假设我有3个配置为群组的虚拟机。因此,每个VM上都运行一个nodejs容器,但只有两个redis容器。

在正在运行 redis的VM上:我的nodejs容器是否会知道redis?

附加问题: 当我为我的redis设置replicas: 4时,我会在一个 VM上设置两个 redis容器:这对我的nodejs应用程序会有问题吗?

最后一个问题: 当我为我的nodeapp设置replicas: 4时:这是否会起作用,因为我现在暴露了两次次端口80?

2 个答案:

答案 0 :(得分:1)

服务必须是无国籍的。对于数据库,有必要在每个实例中设置集群模式,因为它们是有状态的。

答案 1 :(得分:0)

按照同样的顺序:

  1. 一项服务看不到另一项服务,就好像它是由副本组成的。 Nodejs将看到一个唯一的Redis,它将拥有一个IP,无论其副本位于哪个节点。这就是Swarm的美丽。
  2. 是的,您可以在一个节点中安装Nodej,在另一个节点中安装Redis,它们将彼此可见。这就是经理所做的;使容器“相信”它们在同一台机器上运行。
  3. 此外,您可以在同一节点中拥有多个副本而不会出现问题;他们将被视为一个整体。事实上,他们使用相同的音量。
  4. 最后,作为(1)的含义,没有问题,因为你实际上没有两次暴露端口80。即使有20个副本,您也有一个独特的服务入口点,一个特定的IP:PORT方向。