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.
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 `<TOKEN-FROM-ABOVE>` 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://<TOKEN-FROM-ABOVE> swarm-node-00`

View File

@ -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) {

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)
}
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
}