Menu

Configure Swarm Manager hosts

Use the ryba.swarm_primary for setting which host should be the primary swarm manager. This host will be used when rendering default DOCKER_HOST ENV variable on swarm nodes.

module.exports = (service) ->
  options = service.options

Docker Daemon options

  options.docker ?= {}
  options.docker[opt] ?= service.deps.docker.options[opt] for opt in [
    'host'
    'default_port'
    'tlscacert'
    'tlscert'
    'tlskey'
    'tlsverify'
    'conf_dir'
  ]
  options.fqdn ?= service.node.fqdn

Swarm Image

  options.image ?= 'swarm'
  options.tag ?= 'latest'
  options.conf_dir ?= '/etc/docker-swarm'
  options.iptables ?= service.deps.iptables and service.deps.iptables.options.action is 'start'

Service Discovery

Configures the docker daemon engine start options for swarm. For now only zookeeper is supported for discovery backend.

Note: The listen address and advertise adress are different:

  • the advertise address configures which address CLI should use to communicate with the swarm manager's docker engine

  • the listen address configures the docker engine to listen to all interfaces of the machine.

    options.cluster ?= {} options.cluster.discovery ?= 'zookeeper' options ?= {} options.name ?= 'swarm_manager' options.advertise_host ?= service.node.ip options.advertise_port ?= options.docker.default_port options.listen_host ?= '0.0.0.0' options.listen_port ?= 3376 switch options.cluster.discovery #TODO add etcd when 'zookeeper' options.cluster.zk_node ?= '/swarm-nodes' options.cluster.zk_urls ?= if service.deps.zookeeper_server then service.deps.zookeeper_server.filter( (srv) -> srv.options.config['peerType'] is 'participant').map( (srv) -> "#{srv.node.fqdn}:#{srv.options.config['clientPort']}").join ',' else options.cluster.zk_urls throw Error 'Missing options.cluster.zk_urls for discovery mode as zookeeper' unless options.cluster.zk_urls options.cluster.zk_store ?= "zk://#{options.cluster.zk_urls}#{options.cluster.zk_node}" else throw Error "Ryba does not support service discovery backend #{options.cluster.discovery} for swarm"

Docker Deamon Configuration

Pass docker start option to docker daemon to use it with swarm.

TCP Socket

Swarm manager uses the advertise address to communicate. It must be specified in the start option of the local daemon engine to enable it.

  tcp_socket = "#{service.node.fqdn}:#{options.advertise_port}"
  if service.deps.docker?.options.sockets.tcp.indexOf(tcp_socket) is -1
  then service.deps.docker.options.sockets.tcp.push tcp_socket

Swarm Cluster

This starting options should be injected to serivce.use.docker variable. For now ryba/swarm/manager modify the starting options and restart docker engine.

  # @config.docker.other_args['cluster-store'] ?= options.cluster.zk_store
  # @config.docker.other_args['cluster-advertise'] ?= "#{options.advertise_host}:#{options.advertise_port}"
  options.other_args ?= { }
  options.other_args['cluster-store'] ?= options.cluster.zk_store
  options.other_args['cluster-advertise'] ?= "#{options.advertise_host}:#{options.advertise_port}"
  service.deps.docker.options.other_args = merge service.deps.docker.options.other_args, options.other_args if service.deps.docker?

SSL

Inherits properties from local docker daemon

  options.ssl ?= merge {}, service.deps.docker.options.ssl
  if options.ssl.enabled
    options.other_args['tlscacert'] ?= service.deps.docker.options.other_args['tlscacert']
    options.other_args['tlscert'] ?= service.deps.docker.options.other_args['tlscert']
    options.other_args['tlskey'] ?= service.deps.docker.options.other_args['tlskey']
  service.deps.docker.options.daemon ?= {}
  service.deps.docker.options.daemon['cluster-advertise'] ?= options.other_args['cluster-advertise']
  service.deps.docker.options.daemon['cluster-store'] ?= options.other_args['cluster-store']

Wait

  options.wait ?= {}
  options.wait.tcp ?= for srv in service.deps.swarm_manager
    host: srv.node.fqdn
    port: srv.options.advertise_port or options.advertise_port
  options.wait_zookeeper ?=  if service.deps.zookeeper_server
  then service.deps.zookeeper_server?[0].options.wait
  else tcp: options.cluster.zk_urls.split(',').map (config) ->
    [server,port] = config.split(':')
    host: server
    port : port or 2181

Dependencies

{merge} = require '@nikitajs/core/lib/misc'