стек докера: Redis не работает на рабочем узле - PullRequest
2 голосов
/ 08 октября 2019

Я только что закончил докерскую документацию и создал два экземпляра на aws (http://13.127.150.218, http://13.235.134.73). Первый - это менеджер, а второй - рабочий. Ниже приведен составной файл, который я использовал для развертывания.

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

Здесь служба redis имеет ограничение, ограничивающее ее запуск только на узле менеджера. Теперь мой вопрос заключается в том, как веб-служба на рабочем экземпляре должна использовать службу redis.

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Вам необходимо использовать параметр hostname во всех контейнерах, чтобы вы могли использовать это значение для доступа к сервисам от работника или для доступа от работника к сервисам на менеджере.

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    hostname: "web"
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    hostname: "visualizer"
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    hostname: "redis"
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

В зависимости от того, используете ли выPortainer вместо визуализатора вы можете управлять своим стеком SWARM с большим количеством опций:

https://hub.docker.com/r/portainer/portainer

BR,

Carlos

1 голос
/ 15 октября 2019

Рассмотрим файл стека в соответствии с приведенным ниже примером - enter image description here

Независимо от того, где он находится, менеджер | работник может использовать все службы в файле стека, находящиеся в одной сетииспользовать встроенную функцию DNS, которая помогает разрешать каждую службу по определенному имени службы. В этом случае служба web использует службу redis по имени службы.

Вот пример команды ping, способной разрешить службу web из контейнера, связанного с redisservice - enter image description here

Подробнее об обнаружении Swarm Native Service , чтобы понять это.

...