Docker Swarm 服务集群

Docker Swarm Service Clustering

我想使用 docker-compose 和 Docker Swarm(我使用 docker 1.13 版并使用 version: '3' 语法组合)。 每个服务是否可以作为其他服务的 "single" 服务访问?这里有一个简单的例子要清楚:

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,它们被配置为 swarm。所以每个虚拟机上有一个 nodejs 容器 运行 但只有两个 redis 容器。

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

其他问题: 当我为我的 redis 设置 replicas: 4 时,我将在 one VM 上有 two redis 容器:这对我的 nodejs 来说是个问题吗应用程序?

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

按照你问的顺序:

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

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