0

我已经使用 nginx 成功设置了 docker swarm 集群。在我的 ec2 实例上。使用本教程

https://botleg.com/stories/load-balancing-with-docker-swarm/

我正在这样使用

经理 1

节点 1

节点 2

我正在使用带有注册器的 consol 来进行服务发现。

在 Consul Machine docker run --restart=unless-stopped -d -p 8500:8500 -h consul progrium/consul -server -bootstrap

群管理器 docker run --restart=unless-stopped -d -p 3375:2375 群管理 --replication --advertise=mangerip:3375 consul://consulip:8500/

docker run --restart=unless-stopped -d --name=registrator -h=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://consulip: 8500

Node1 docker run --restart=unless-stopped -d swarm join --advertise=node1ip:2375 consul://consulip:8500/

docker run --restart=unless-stopped -d --name=registrator -h=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://consulip: 8500

Node2 docker run --restart=unless-stopped -d swarm join --advertise=node2:2375 consul://consulip:8500/

docker run --restart=unless-stopped -d --name=registrator -h=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://consulip: 8500

我的 Dockerfile

FROM nginx:latest

RUN apt-get update \
  && apt-get install -y unzip

ADD files/start.sh /bin/start.sh
RUN chmod +x /bin/start.sh
ADD files/default.ctmpl /templates/default.ctmpl

ADD https://releases.hashicorp.com/consul-template/0.12.2/consul-template_0.12.2_linux_amd64.zip /usr/bin/
RUN unzip /usr/bin/consul-template_0.12.2_linux_amd64.zip -d /usr/local/bin

EXPOSE 80
ENTRYPOINT ["/bin/start.sh"]

启动.sh

#!/bin/bash
service nginx start
consul-template -consul=$CONSUL_URL -template="/templates/default.ctmpl:/etc/nginx/conf.d/default.conf:service nginx reload"

默认.ctmpl

{{$app := env "APP_NAME"}}

upstream {{printf $app}} {
    least_conn;
    {{range service $app}}
    server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1;{{end}}
}

server {
    listen 80 default;

    location / {
        proxy_pass http://{{printf $app}};
    }
}

码头工人-compose.yml

version: '2'

services:
  lb:
    build: .
    container_name: lb
    ports:
      - "80:80"
    environment:
      - APP_NAME=tutum-nodejs-redis
      - CONSUL_URL=${KV_IP}:8500
    depends_on:
      - web
    networks:
      - front-tier

  web:
    image: hanzel/tutum-nodejs-redis
    ports:
      - "4000"
    environment:
      - APP_PORT=4000
      - REDIS_IP=redis
      - REDIS_PORT=6379
    depends_on:
      - redis
    networks:
      - front-tier
      - back-tier

  redis:
    image: redis
    container_name: redis
    command: redis-server --appendonly yes
    volumes:
      - redis-data:/data
    networks:
      - back-tier

volumes:
  redis-data:
    driver: local

networks:
  front-tier:
    driver: overlay
  back-tier:
    driver: overlay

这个问题,我需要哪个 IP 地址指向 A 记录,因为 docker swarm 自动拾取节点。

假设我第一次运行它可能会选择第一个节点。如果我删除它并重做所有步骤,它将选择不同的节点和不同的 ip。所以那个时候我需要改变我的A记录。为解决这个问题,

我用谷歌搜索它,我找到了 wagl。这给了我基于 DNS 的服务发现,这很酷。但我想这是非常基本的,我不知道这是否准备好生产。

请任何人告诉我,从A到Z的流程,即从部署到配置IP地址到A记录如何做。或者只是给我一些链接。

4

1 回答 1

2

我认为您不需要为此更改 A 记录。由于您已经知道集群的 IP 地址,并且如果您正在使用它进行部署,docker-compose您可以constraint在负载均衡器环境中添加:constraint:node==node1

于 2016-04-22T11:15:42.997 回答