Skip to content

Commit a48dfd3

Browse files
committed
use swarm master also as node
Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
1 parent 3a3ef6f commit a48dfd3

File tree

3 files changed

+60
-27
lines changed

3 files changed

+60
-27
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Machine is still in its early stages. If you'd like to try out a preview build,
5050

5151
Machine can create [Docker Swarm](https://github.com/docker/swarm) clusters.
5252

53-
First, create a Swarm token using `docker-machine create-swarm-token`. Optionally, you can use another discovery service. See the Swarm docs for details.
53+
First, create a Swarm token using `docker-machine generate-swarm-token`. Optionally, you can use another discovery service. See the Swarm docs for details.
5454

5555
Once you have the token, you can create the cluster.
5656

@@ -64,7 +64,7 @@ Replace `<TOKEN-FROM-ABOVE>` with your random token. This will create the Swarm
6464

6565
### Swarm Nodes
6666

67-
Now, create one or more Swarm nodes:
67+
Now, create more Swarm nodes:
6868

6969
`docker-machine create -d virtualbox --swarm --swarm-discovery token://<TOKEN-FROM-ABOVE> swarm-node-00`
7070

commands.go

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,20 @@ var Commands = []cli.Command{
172172
Action: cmdCreate,
173173
},
174174
{
175-
Name: "create-swarm-token",
175+
Name: "generate-swarm-token",
176176
Usage: "Generate a Swarm Cluster Token",
177-
Action: cmdCreateSwarmToken,
177+
Action: cmdGenerateSwarmToken,
178178
},
179179
{
180180
Name: "config",
181181
Usage: "Print the connection config for machine",
182182
Action: cmdConfig,
183+
Flags: []cli.Flag{
184+
cli.BoolFlag{
185+
Name: "swarm",
186+
Usage: "Display the Swarm config instead of the Docker daemon",
187+
},
188+
},
183189
},
184190
{
185191
Name: "inspect",
@@ -317,7 +323,7 @@ func cmdCreate(c *cli.Context) {
317323
log.Infof("To point your Docker client at it, run this in your shell: $(%s env %s)", c.App.Name, name)
318324
}
319325

320-
func cmdCreateSwarmToken(c *cli.Context) {
326+
func cmdGenerateSwarmToken(c *cli.Context) {
321327
discovery := &token.TokenDiscoveryService{}
322328
discovery.Initialize("", 0)
323329
token, err := discovery.CreateCluster()
@@ -333,8 +339,30 @@ func cmdConfig(c *cli.Context) {
333339
if err != nil {
334340
log.Fatal(err)
335341
}
342+
dockerHost := cfg.machineUrl
343+
if c.Bool("swarm") {
344+
if !cfg.swarmMaster {
345+
log.Fatalf("%s is not a swarm master", cfg.machineName)
346+
}
347+
u, err := url.Parse(cfg.swarmHost)
348+
if err != nil {
349+
log.Fatal(err)
350+
}
351+
parts := strings.Split(u.Host, ":")
352+
swarmPort := parts[1]
353+
354+
// get IP of machine to replace in case swarm host is 0.0.0.0
355+
mUrl, err := url.Parse(cfg.machineUrl)
356+
if err != nil {
357+
log.Fatal(err)
358+
}
359+
mParts := strings.Split(mUrl.Host, ":")
360+
machineIp := mParts[0]
361+
362+
dockerHost = fmt.Sprintf("tcp://%s:%s", machineIp, swarmPort)
363+
}
336364
fmt.Printf("--tls --tlscacert=%s --tlscert=%s --tlskey=%s -H=%q",
337-
cfg.caCertPath, cfg.clientCertPath, cfg.clientKeyPath, cfg.machineUrl)
365+
cfg.caCertPath, cfg.clientCertPath, cfg.clientKeyPath, dockerHost)
338366
}
339367

340368
func cmdInspect(c *cli.Context) {

host.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -142,25 +142,13 @@ func (h *Host) ConfigureSwarm(discovery string, master bool, host string, addr s
142142
addr = fmt.Sprintf("%s:2376", ip)
143143
}
144144

145-
var (
146-
role string
147-
args string
148-
)
149-
150-
if master {
151-
role = "manage"
152-
basePath := d.GetDockerConfigDir()
153-
tlsCaCert := path.Join(basePath, "ca.pem")
154-
tlsCert := path.Join(basePath, "server.pem")
155-
tlsKey := path.Join(basePath, "server-key.pem")
156-
args = fmt.Sprintf("--tlsverify --tlscacert=%s --tlscert=%s --tlskey=%s -H %s",
157-
tlsCaCert, tlsCert, tlsKey, host)
158-
} else {
159-
role = "join"
160-
args = fmt.Sprintf("--addr %s", addr)
161-
}
162-
163-
args = fmt.Sprintf("%s %s", args, discovery)
145+
basePath := d.GetDockerConfigDir()
146+
tlsCaCert := path.Join(basePath, "ca.pem")
147+
tlsCert := path.Join(basePath, "server.pem")
148+
tlsKey := path.Join(basePath, "server-key.pem")
149+
masterArgs := fmt.Sprintf("--tlsverify --tlscacert=%s --tlscert=%s --tlskey=%s -H %s %s",
150+
tlsCaCert, tlsCert, tlsKey, host, discovery)
151+
nodeArgs := fmt.Sprintf("--addr %s %s", addr, discovery)
164152

165153
u, err := url.Parse(host)
166154
if err != nil {
@@ -182,8 +170,25 @@ func (h *Host) ConfigureSwarm(discovery string, master bool, host string, addr s
182170
return err
183171
}
184172

185-
cmd, err = d.GetSSHCommand(fmt.Sprintf("sudo docker run -d -p %s:%s --restart=always --name swarm-agent -v %s:%s %s %s %s",
186-
port, port, d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, role, args))
173+
// if master start master agent
174+
if master {
175+
log.Debug("launching swarm master")
176+
log.Debugf("master args: %s", masterArgs)
177+
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",
178+
port, port, d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, masterArgs))
179+
if err != nil {
180+
return err
181+
}
182+
if err := cmd.Run(); err != nil {
183+
return err
184+
}
185+
}
186+
187+
// start node agent
188+
log.Debug("launching swarm node")
189+
log.Debugf("node args: %s", nodeArgs)
190+
cmd, err = d.GetSSHCommand(fmt.Sprintf("sudo docker run -d --restart=always --name swarm-agent -v %s:%s %s join %s",
191+
d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, nodeArgs))
187192
if err != nil {
188193
return err
189194
}

0 commit comments

Comments
 (0)