Você pode usar um trio de nginx, etcd & confie para fazer isso. Há um ótimo post intitulado " Balanceamento de carga com CoreOS, confd e nginx " que percorre três contêineres.
- Você precisa de um contêiner de "dados" compartilhado, no qual possa armazenar as configurações nginx geradas dinamicamente
- Você precisa de um contêiner em execução confd , que leia valores de etcd e gere dinamicamente a configuração nginx para você (isso é salvo em um volume dos dados compartilhados) "container"
- Por fim, você precisará do nginx que simplesmente usa esse volume de "dados" compartilhado para suas configurações.
A chave então é ter cada backend HTTP anunciando-se via etcd, e então confd irá pegar as mudanças e reconfigurar o nginx na hora. Este processo é muito parecido com o que @ Julian mencionou na resposta anterior:
ExecStart=<do something>
ExecStartPost=/usr/bin/etcdctl set /services/<your_service>/%i/location '{\"host\": "%H", \"port\": <your containers exposed port>}'
ExecStop=/usr/bin/docker stop <your service>
ExecStopPost=/usr/bin/etcdctl rm --recursive /services/<your_service>/%i
Confira os documentos do modelo confd para obter mais exemplos, mas você terá algo mais ou menos assim:
{{range $dir := lsdir "/services/web"}}
upstream {{base $dir}} {
{{$custdir := printf "/services/web/%s/*" $dir}}{{range gets $custdir}}
server {{$data := json .Value}}{{$data.IP}}:80;
{{end}}
}
server {
server_name {{base $dir}}.example.com;
location / {
proxy_pass {{base $dir}};
}
}
{{end}}
Só para observar, você só precisará de um desses "trios" em execução, a menos que queira uma configuração de disponibilidade mais alta. Nesse caso, você precisará de dois ou mais. Quando você vai HA, você provavelmente vai querer enfrentá-los com uma instância do ELB.