Skip to content

Docker Swarm

andyceo edited this page Jun 3, 2022 · 11 revisions

Вводные про Docker Swarm

Команды docker swarm, docker node, docker config, docker secret и docker service имеют отношение только к работе Docker Engine в режиме Swarm и могут выполняться только на ноде-менеджере!

  • docker swarm - управляет самим кластером

    • ca Manage root CA
    • init Initialize a swarm
    • join Join a swarm as a node and/or manager
    • join-token Manage join tokens
    • leave Leave the swarm
    • unlock Unlock swarm
    • unlock-key Manage the unlock key
    • update Update the swarm
  • docker node - управляет нодами в кластере

    • demote Demote one or more nodes from manager in the swarm
    • inspect Display detailed information on one or more nodes
    • ls List nodes in the swarm
    • promote Promote one or more nodes to manager in the swarm
    • ps List tasks running on one or more nodes, defaults to current node
    • rm Remove one or more nodes from the swarm
    • update Update a node
  • docker service - управляет сервисами в кластере

    • create Create a new service
    • inspect Display detailed information on one or more services
    • logs Fetch the logs of a service or task
    • ls List services
    • ps List the tasks of one or more services
    • rm Remove one or more services
    • scale Scale one or multiple replicated services
    • update Update a service

Также, комнада docker system info (или docker info) может показать информацию о статусе текущей ноды и работе кластера.

Разворачиваем Docker Swarm

Инициализация первого менеджера

docker swarm init --advertise-addr [advertise ip]:2377

Присоединение воркеров

docker swarm join --token [token] [manager ip]:[manager port]

Полезные команды

  • Посмотрим список нод в кластере (выполнять только на машине-менеджере):

      docker node ls
    
  • Посмотрим данные о ноде в человекочитаемом формате (выполнять только на машине-менеджере):

      docker node inspect <NODE-ID> --pretty
    

    Если нужен json-формат, уберите флаг --pretty.

  • Уберем ноду-воркер из кластера (выполняется на машине-воркере):

      docker swarm leave
    

    После того, как нода-воркер покинула кластер, на ноде-менеджере можно выполнить команду

      docker node rm worker-node
    

    для удаления ноды из списка нод кластера (docker node ls).

  • Посмотрим все сервисы, которые запущены в кластере (выполняется на менеджере):

      docker service ls
    
  • Запустим простейший сервис:

      docker service create --replicas 1 --name helloworld busybox ping docker.com
    
  • Теперь мы можем посмотреть детали запущенного сервиса:

      docker service inspect --pretty <SERVICE-ID>
    
  • Посмотрим, какие именно ноды выполняют наш сервис:

      docker service ps <SERVICE-ID>
    

    Если мы зайдем на ноду, которая выполняет сервис, по ssh, и запустим команду docker ps, то сможем увидеть контейнер для этой задачи.

  • Удалим сервис из кластера (выполняется на менеджере):

      docker service rm <SERVICE-ID>
    
  • Остановить все экземпляры сервиса, но не удалять его:

      docker service update --replicas=0 <SERVICE-ID>
    
  • Запуск сервиса, объявленного в файле docker-cloud.yml:

      docker stack deploy --compose-file docker-cloud.yml stack_name
    

Misc

Correctly remove node from cluster

On manager node do:

  • Demote node to worker

      sudo docker node demote NODE_ID
    
  • Change node availability to Drain

      sudo docker node update --availability drain NODE_ID
    

On the leaving node:

  • Leave node from Swarm

      sudo docker swarm leave
    

Again on manager node do:

  • Remove node from cluster

      sudo docker node rm NODE_ID
    

Quick config creation for Docker Swarm

sudo docker config create YOUR-CONFIG-NAME-`date --utc --iso-8601=seconds | sed 's/+00:00/Z/g' | sed 's/-//g' | sed 's/://g'` /data/configs/YOUR/CONFIG/NAME

Quick secret creation for Docker Swarm

echo -n "<YOUR-SECRET-GOES-HERE>" | docker secret create <SECRET-NAME> -

Create debugging service on specific node with specific secret to view it and test swarm connectivity

Following command create and run Docker Swarm service that will be listen connections on 5001 port, so you can curl to the container and view logs. Also you can do docker container exec -ti CONTAINER_ID sh -il to the running container and view secrets that you pass into service with cat /run/secrets/YOUR_SECRET_NAME:

sudo docker service create --name 'secrets' --secret 'YOUR_SECRET_NAME' --network='YOUR_NETWORK' --publish 'published=5001,target=5001' --constraint 'node.hostname == YOUR_NODE_ID' --entrypoint='/bin/sh -c' alpine:latest 'while true; do nc -l -p 5001; done'

Change your secret name, constraints, network and used ports. Note that ports would be opened in ingress network. Of course you can use another image instead of alpine:latest, too. You also can change service configuration with docker update command after creation with --secret-rm, secret-add for secrets, --network-add, --network-rm for networks and --publish-add, --publish-rm for publishing ports, and --env-add, --env-rm.

List docker swarm nodes with labels

sudo docker node ls -q | xargs sudo docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ .Spec.Labels }}'

More pretty formatting:

sudo docker node ls -q | xargs sudo docker node inspect -f '{{ .ID }} [{{ .Description.Hostname }}]: {{ range $k, $v := .Spec.Labels }}{{ $k }}={{ $v }} {{end}}'

Source: How to list docker swarm nodes with lables

Ссылки

Sidebar is under construction

Clone this wiki locally