這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Docker Swarm的join命令的定義:
{ Name: "join", ShortName: "j", Usage: "Join a docker cluster", Flags: []cli.Flag{flJoinAdvertise, flHeartBeat, flTTL, flJoinRandomDelay, flDiscoveryOpt}, Action: join, },
flHeartBeat的預設值是60s,而flTTL預設值是180s:
flHeartBeat = cli.StringFlag{ Name: "heartbeat", Value: "60s", Usage: "period between each heartbeat",}flTTL = cli.StringFlag{ Name: "ttl", Value: "180s", Usage: "set the expiration of an ephemeral node",}
join函數的核心代碼:
......for { log.WithFields(log.Fields{"addr": addr, "discovery": dflag}).Infof("Registering on the discovery service every %s...", hb) if err := d.Register(addr); err != nil { log.Error(err) } time.Sleep(hb)}......
token.Register函數實現:
func (s *Discovery) Register(addr string) error { buf := strings.NewReader(addr) resp, err := http.Post(fmt.Sprintf("%s/%s/%s?ttl=%d", s.url, "clusters", s.token, uint64(s.ttl.Seconds())), "application/json", buf) if err != nil { return err } resp.Body.Close() return nil}
join命令其實就是每隔heartbeat時間(例如,60s),向https://discovery.hub.docker.com/v1/clusters/token/ttl=180(ttl取預設值),註冊一下當前Docker的地址(IP:PORT)。