diff --git a/README.md b/README.md index f7179c800e..c7dbb2695a 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Machine is still in its early stages. If you'd like to try out a preview build, Machine can create [Docker Swarm](https://github.com/docker/swarm) clusters. -First, create a Swarm token using `docker-machine create-swarm-token`. Optionally, you can use another discovery service. See the Swarm docs for details. +First, create a Swarm token using `docker-machine generate-swarm-token`. Optionally, you can use another discovery service. See the Swarm docs for details. Once you have the token, you can create the cluster. @@ -64,7 +64,7 @@ Replace `` with your random token. This will create the Swarm ### Swarm Nodes -Now, create one or more Swarm nodes: +Now, create more Swarm nodes: `docker-machine create -d virtualbox --swarm --swarm-discovery token:// swarm-node-00` diff --git a/commands.go b/commands.go index 6619440734..e92c6022f6 100644 --- a/commands.go +++ b/commands.go @@ -172,14 +172,20 @@ var Commands = []cli.Command{ Action: cmdCreate, }, { - Name: "create-swarm-token", + Name: "generate-swarm-token", Usage: "Generate a Swarm Cluster Token", - Action: cmdCreateSwarmToken, + Action: cmdGenerateSwarmToken, }, { Name: "config", Usage: "Print the connection config for machine", Action: cmdConfig, + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "swarm", + Usage: "Display the Swarm config instead of the Docker daemon", + }, + }, }, { Name: "inspect", @@ -317,7 +323,7 @@ func cmdCreate(c *cli.Context) { log.Infof("To point your Docker client at it, run this in your shell: $(%s env %s)", c.App.Name, name) } -func cmdCreateSwarmToken(c *cli.Context) { +func cmdGenerateSwarmToken(c *cli.Context) { discovery := &token.TokenDiscoveryService{} discovery.Initialize("", 0) token, err := discovery.CreateCluster() @@ -333,8 +339,30 @@ func cmdConfig(c *cli.Context) { if err != nil { log.Fatal(err) } + dockerHost := cfg.machineUrl + if c.Bool("swarm") { + if !cfg.swarmMaster { + log.Fatalf("%s is not a swarm master", cfg.machineName) + } + u, err := url.Parse(cfg.swarmHost) + if err != nil { + log.Fatal(err) + } + parts := strings.Split(u.Host, ":") + swarmPort := parts[1] + + // get IP of machine to replace in case swarm host is 0.0.0.0 + mUrl, err := url.Parse(cfg.machineUrl) + if err != nil { + log.Fatal(err) + } + mParts := strings.Split(mUrl.Host, ":") + machineIp := mParts[0] + + dockerHost = fmt.Sprintf("tcp://%s:%s", machineIp, swarmPort) + } fmt.Printf("--tls --tlscacert=%s --tlscert=%s --tlskey=%s -H=%q", - cfg.caCertPath, cfg.clientCertPath, cfg.clientKeyPath, cfg.machineUrl) + cfg.caCertPath, cfg.clientCertPath, cfg.clientKeyPath, dockerHost) } func cmdInspect(c *cli.Context) { diff --git a/host.go b/host.go index 54c216856b..2b9ca0666b 100644 --- a/host.go +++ b/host.go @@ -142,25 +142,13 @@ func (h *Host) ConfigureSwarm(discovery string, master bool, host string, addr s addr = fmt.Sprintf("%s:2376", ip) } - var ( - role string - args string - ) - - if master { - role = "manage" - basePath := d.GetDockerConfigDir() - tlsCaCert := path.Join(basePath, "ca.pem") - tlsCert := path.Join(basePath, "server.pem") - tlsKey := path.Join(basePath, "server-key.pem") - args = fmt.Sprintf("--tlsverify --tlscacert=%s --tlscert=%s --tlskey=%s -H %s", - tlsCaCert, tlsCert, tlsKey, host) - } else { - role = "join" - args = fmt.Sprintf("--addr %s", addr) - } - - args = fmt.Sprintf("%s %s", args, discovery) + basePath := d.GetDockerConfigDir() + tlsCaCert := path.Join(basePath, "ca.pem") + tlsCert := path.Join(basePath, "server.pem") + tlsKey := path.Join(basePath, "server-key.pem") + masterArgs := fmt.Sprintf("--tlsverify --tlscacert=%s --tlscert=%s --tlskey=%s -H %s %s", + tlsCaCert, tlsCert, tlsKey, host, discovery) + nodeArgs := fmt.Sprintf("--addr %s %s", addr, discovery) u, err := url.Parse(host) if err != nil { @@ -182,8 +170,25 @@ func (h *Host) ConfigureSwarm(discovery string, master bool, host string, addr s return err } - cmd, err = d.GetSSHCommand(fmt.Sprintf("sudo docker run -d -p %s:%s --restart=always --name swarm-agent -v %s:%s %s %s %s", - port, port, d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, role, args)) + // if master start master agent + if master { + log.Debug("launching swarm master") + log.Debugf("master args: %s", masterArgs) + cmd, err = d.GetSSHCommand(fmt.Sprintf("sudo docker run -d -p %s:%s --restart=always --name swarm-agent-master -v %s:%s %s manage %s", + port, port, d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, masterArgs)) + if err != nil { + return err + } + if err := cmd.Run(); err != nil { + return err + } + } + + // start node agent + log.Debug("launching swarm node") + log.Debugf("node args: %s", nodeArgs) + cmd, err = d.GetSSHCommand(fmt.Sprintf("sudo docker run -d --restart=always --name swarm-agent -v %s:%s %s join %s", + d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, nodeArgs)) if err != nil { return err }