Docker Swarm服务群集

Docker Swarm服务群集,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,我想在docker Swarm中使用docker compose,我使用docker版本1.13,并使用版本:“3”语法进行编写。 每个服务是否可以作为单个服务访问其他服务?下面是一个简单的例子: version: '3' services: nodejs: image: mynodeapp container_name: my_app ports: - "80:8080" environment: - REDIS_HOST=my_r

我想在docker Swarm中使用docker compose,我使用docker版本1.13,并使用版本:“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个虚拟机,它们被配置为一个swarm。因此,每个VM上运行一个nodejs容器,但只有两个redis容器

在没有运行redis的VM上:我的nodejs容器会知道redis吗

其他问题: 当我为我的redis设置副本:4时,我将在一个VM上有两个redis容器:这对我的nodejs应用程序会有问题吗

最后一个问题:
当我为我的节点设置副本:4时,由于我现在已公开了两次端口80,这是否有效?

与您要求的顺序相同:

一个服务看不到另一个服务,就好像它是由副本组成的一样。Nodejs将看到一个独特的Redis,它将有一个IP,无论其副本位于哪个节点。这就是Swarm的魅力所在。 是的,您可以在一个节点中有NodeJ,在另一个节点中有Redis,它们将彼此可见。经理就是这样做的;使容器相信它们在同一台机器上运行。 此外,您可以在同一节点中拥有多个副本,而不会出现问题;它们将被视为一个整体。事实上,它们使用相同的卷。 最后,正如1所暗示的,不会有问题,因为您实际上并没有两次公开端口80。即使有20个副本,您的服务也有一个唯一的入口点,即特定的IP:端口方向。
服务必须是无状态的。对于数据库,有必要在每个实例中设置集群模式,因为它们是状态完整的。

3。但是如果我在不同的节点上有一个复制的数据库,我必须为数据库配置一个集群,因为我需要同步的数据-对吗?@Munchkin我不知道你的意思。Docker Swarm确保您将拥有同步数据,无论您的服务有多少副本以及它们分布在多个节点上,您都不必担心这一点。要明确的是:例如,我有3个复制的redis。第一个请求到达redis1,它将更新key1。然后,稍后,另一个请求到达redis2:redis2是否有新的更新密钥?即使没有配置redis群集选项,群集已启用是吗?卷呢?我找到了-mount选项。。。redis或mysql、elasticsearch的所有复制实例。。。装载相同的卷?会不会有竞争条件?redis的两个副本将有不同的数据,它们不会共享第3点中所述的卷。在每个实例中-那么我真的在每个实例中都有这么多ssh docker exec-it container/bin/sh吗?嗯,这听起来像是一个糟糕的解决方法=/配置将取决于每个特定的解决方案状态。例如,对于couchbase,请看这个示例。和这篇很好的文章有关