mirror of https://github.com/docker/docs.git
Merge pull request #232 from vieux/ip_discovery
Proposal: add a `list` discovery service to give a list of ips
This commit is contained in:
commit
59ea9e5681
|
@ -128,6 +128,22 @@ $ swarm list --discovery zk://<zookeeper_addr1>,<zookeeper_addr2>/<path>
|
|||
<node_ip:2375>
|
||||
```
|
||||
|
||||
###### Using a static list of ips
|
||||
|
||||
```bash
|
||||
# start the manager on any machine or your laptop
|
||||
$ swarm manage --discovery <node_ip1:2375>,<node_ip2:2375> -H=<swarm_ip:swarm_port>
|
||||
#or
|
||||
$ swarm manage --discovery nodes://<node_ip1:2375>,<node_ip2:2375> -H=<swarm_ip:swarm_port>
|
||||
|
||||
# use the regular docker cli
|
||||
$ docker -H <swarm_ip:swarm_port> info
|
||||
$ docker -H <swarm_ip:swarm_port> run ...
|
||||
$ docker -H <swarm_ip:swarm_port> ps
|
||||
$ docker -H <swarm_ip:swarm_port> logs ...
|
||||
...
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributing a new discovery backend is easy,
|
||||
|
|
|
@ -55,6 +55,11 @@ func New(rawurl string, heartbeat int) (DiscoveryService, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
// nodes:port,node2:port => nodes://node1:port,node2:port
|
||||
if url.Scheme == "" {
|
||||
url.Scheme = "nodes"
|
||||
}
|
||||
|
||||
if discovery, exists := discoveries[url.Scheme]; exists {
|
||||
log.Debugf("Initializing %q discovery service with %q", url.Scheme, url.Host+url.Path)
|
||||
err := discovery.Initialize(url.Host+url.Path, heartbeat)
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package nodes
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/docker/swarm/discovery"
|
||||
)
|
||||
|
||||
type NodesDiscoveryService struct {
|
||||
nodes []*discovery.Node
|
||||
}
|
||||
|
||||
func init() {
|
||||
discovery.Register("nodes", &NodesDiscoveryService{})
|
||||
}
|
||||
|
||||
func (s *NodesDiscoveryService) Initialize(uris string, _ int) error {
|
||||
for _, ip := range strings.Split(uris, ",") {
|
||||
s.nodes = append(s.nodes, discovery.NewNode(ip))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
func (s *NodesDiscoveryService) Fetch() ([]*discovery.Node, error) {
|
||||
return s.nodes, nil
|
||||
}
|
||||
|
||||
func (s *NodesDiscoveryService) Watch(callback discovery.WatchCallback) {
|
||||
}
|
||||
|
||||
func (s *NodesDiscoveryService) Register(addr string) error {
|
||||
return discovery.ErrNotImplemented
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package nodes
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestInitialise(t *testing.T) {
|
||||
discovery := &NodesDiscoveryService{}
|
||||
discovery.Initialize("1.1.1.1:1111,2.2.2.2:2222", 0)
|
||||
assert.Equal(t, len(discovery.nodes), 2)
|
||||
assert.Equal(t, discovery.nodes[0].String(), "1.1.1.1:1111")
|
||||
assert.Equal(t, discovery.nodes[1].String(), "2.2.2.2:2222")
|
||||
}
|
||||
|
||||
func TestRegister(t *testing.T) {
|
||||
discovery := &NodesDiscoveryService{}
|
||||
assert.Error(t, discovery.Register("0.0.0.0"))
|
||||
}
|
2
flags.go
2
flags.go
|
@ -6,7 +6,7 @@ var (
|
|||
flDiscovery = cli.StringFlag{
|
||||
Name: "discovery",
|
||||
Value: "",
|
||||
Usage: "DiscoveryService to use [token://<token>, etcd://<ip1>,<ip2>/<path>, file://path/to/file, consul://<addr>/<path>, zk://<ip1>,<ip2>/<path>]",
|
||||
Usage: "DiscoveryService to use [token://<token>,\n\t\t\t\t etcd://<ip1>,<ip2>/<path>,\n\t\t\t\t file://path/to/file,\n\t\t\t\t consul://<addr>/<path>,\n\t\t\t\t zk://<ip1>,<ip2>/<path>,\n\t\t\t\t <ip1>,<ip2>]",
|
||||
EnvVar: "SWARM_DISCOVERY",
|
||||
}
|
||||
flAddr = cli.StringFlag{
|
||||
|
|
1
main.go
1
main.go
|
@ -11,6 +11,7 @@ import (
|
|||
_ "github.com/docker/swarm/discovery/consul"
|
||||
_ "github.com/docker/swarm/discovery/etcd"
|
||||
_ "github.com/docker/swarm/discovery/file"
|
||||
_ "github.com/docker/swarm/discovery/nodes"
|
||||
"github.com/docker/swarm/discovery/token"
|
||||
_ "github.com/docker/swarm/discovery/zookeeper"
|
||||
)
|
||||
|
|
44
manage.go
44
manage.go
|
@ -74,29 +74,9 @@ func manage(c *cli.Context) {
|
|||
cluster := cluster.NewCluster(tlsConfig)
|
||||
cluster.Events(&logHandler{})
|
||||
|
||||
go func() {
|
||||
if c.String("discovery") != "" {
|
||||
d, err := discovery.New(c.String("discovery"), c.Int("heartbeat"))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
nodes, err := d.Fetch()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
||||
}
|
||||
cluster.UpdateNodes(nodes)
|
||||
|
||||
go d.Watch(cluster.UpdateNodes)
|
||||
} else {
|
||||
var nodes []*discovery.Node
|
||||
for _, arg := range c.Args() {
|
||||
nodes = append(nodes, discovery.NewNode(arg))
|
||||
}
|
||||
cluster.UpdateNodes(nodes)
|
||||
}
|
||||
}()
|
||||
if !c.IsSet("discovery") {
|
||||
log.Fatal("--discovery required to manage a cluster")
|
||||
}
|
||||
|
||||
s, err := strategy.New(c.String("strategy"))
|
||||
if err != nil {
|
||||
|
@ -112,6 +92,24 @@ func manage(c *cli.Context) {
|
|||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// get the list of nodes from the discovery service
|
||||
go func() {
|
||||
d, err := discovery.New(c.String("discovery"), c.Int("heartbeat"))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
nodes, err := d.Fetch()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
||||
}
|
||||
cluster.UpdateNodes(nodes)
|
||||
|
||||
go d.Watch(cluster.UpdateNodes)
|
||||
}()
|
||||
|
||||
sched := scheduler.NewScheduler(
|
||||
cluster,
|
||||
s,
|
||||
|
|
Loading…
Reference in New Issue