use swarm master also as node

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
Evan Hazlett 2015-02-19 08:47:05 -08:00
parent 3a3ef6f45e
commit a48dfd3448
3 changed files with 60 additions and 27 deletions

View File

@ -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. 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. Once you have the token, you can create the cluster.
@ -64,7 +64,7 @@ Replace `<TOKEN-FROM-ABOVE>` with your random token. This will create the Swarm
### Swarm Nodes ### Swarm Nodes
Now, create one or more Swarm nodes: Now, create more Swarm nodes:
`docker-machine create -d virtualbox --swarm --swarm-discovery token://<TOKEN-FROM-ABOVE> swarm-node-00` `docker-machine create -d virtualbox --swarm --swarm-discovery token://<TOKEN-FROM-ABOVE> swarm-node-00`

View File

@ -172,14 +172,20 @@ var Commands = []cli.Command{
Action: cmdCreate, Action: cmdCreate,
}, },
{ {
Name: "create-swarm-token", Name: "generate-swarm-token",
Usage: "Generate a Swarm Cluster Token", Usage: "Generate a Swarm Cluster Token",
Action: cmdCreateSwarmToken, Action: cmdGenerateSwarmToken,
}, },
{ {
Name: "config", Name: "config",
Usage: "Print the connection config for machine", Usage: "Print the connection config for machine",
Action: cmdConfig, Action: cmdConfig,
Flags: []cli.Flag{
cli.BoolFlag{
Name: "swarm",
Usage: "Display the Swarm config instead of the Docker daemon",
},
},
}, },
{ {
Name: "inspect", 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) 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 := &token.TokenDiscoveryService{}
discovery.Initialize("", 0) discovery.Initialize("", 0)
token, err := discovery.CreateCluster() token, err := discovery.CreateCluster()
@ -333,8 +339,30 @@ func cmdConfig(c *cli.Context) {
if err != nil { if err != nil {
log.Fatal(err) 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", 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) { func cmdInspect(c *cli.Context) {

47
host.go
View File

@ -142,25 +142,13 @@ func (h *Host) ConfigureSwarm(discovery string, master bool, host string, addr s
addr = fmt.Sprintf("%s:2376", ip) addr = fmt.Sprintf("%s:2376", ip)
} }
var ( basePath := d.GetDockerConfigDir()
role string tlsCaCert := path.Join(basePath, "ca.pem")
args string 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",
if master { tlsCaCert, tlsCert, tlsKey, host, discovery)
role = "manage" nodeArgs := fmt.Sprintf("--addr %s %s", addr, discovery)
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)
u, err := url.Parse(host) u, err := url.Parse(host)
if err != nil { if err != nil {
@ -182,8 +170,25 @@ func (h *Host) ConfigureSwarm(discovery string, master bool, host string, addr s
return err 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", // if master start master agent
port, port, d.GetDockerConfigDir(), d.GetDockerConfigDir(), swarmDockerImage, role, args)) 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 { if err != nil {
return err return err
} }