Docker群集服务集群

我想用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个configuration为群集的虚拟机。 所以每个虚拟机上都有一个nodejs容器运行,但是只有两个redis容器。

没有运行redis的VM上:我的nodejs容器是否知道redis?

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

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

按照同样的顺序,你问:

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

这些服务必须是无国籍的。 在数据库的情况下,每个实例都需要设置集群模式,因为它们是有状态的。