assim que usar o comando de join abaixo serah um manager
$ docker swarm join-token manager
docker swarm join \
--token SWMTKN-1-2jylbfdn5mt55yp0khqd55ryr6f9sqww4e81s9yz4afz52zvmy-5gy57cgjwpbxffc2i3thdv4hy \
192.168.1.103:2377
assim quem usar o comando de join serah um worker
$ docker swarm join-token worker
docker swarm join \
--token SWMTKN-1-2jylbfdn5mt55yp0khqd55ryr6f9sqww4e81s9yz4afz52zvmy-598k8ie5dnfrzc7d54cdby8it \
192.168.1.103:2377
uma vez criados os nos voce pode faze-los virarem managers ou workers com o comando abaixo
$ docker node --help
Usage: docker node COMMAND
Manage Docker Swarm nodes
Options:
--help Print usage
Commands:
demote Demote one or more nodes from manager in the swarm
promote Promote one or more nodes to manager in the swarm
Porque quando tenho <=50% dos managers de pe o docker não elege um novo líder?
De a acordo com os links acima o docker precisa de disponibilidade quorum para poder decidir quem será o líder
O que fazer quando não tenho mais quorum Volte as máquinas que caíram ou force um novo cluster
Recuperando o docker, fazendo backup e instalando denvo com o estado do antigo
Assim basta criar um service e baseado no healthcheck do dockerfile tudo ira funcionar
$ docker swarm init --advertise-addr `ifconfig | grep -A1 -E "enp3s0|eth0" | grep -o -P 'inet addr:\K([0-9.]+)'`
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
172.17.0.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
onde 192.168.99.121 é o ip da maquina
$ docker swarm join-token worker
Quando voce roda o proprio manger gera o comando para que os slaves possam se conectar
$ docker swarm join \
--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
172.17.0.2:2377
This node joined a swarm as a worker.
Ver quais sao os nós do cluster
docker node ls
Pegar os IPs de todos os nodes do cluster
echo docker node inspect `docker node ls --format '{{ .ID }}'` --format '{{ .Status.Addr }}' && \
docker node inspect `docker node ls --format '{{ .ID }}'` --format '{{ .ManagerStatus.Addr }}'
ERRO[0301] Bulk sync to node typer-pc-c769453f8c12 timed out
Se voce subir uma versao zuada e fiz scale correra o risco do swarm matar as instancias que ja estavam funcionando
O docker sempre tenta jogar a nova versao no primeiro container do service eg: go-server1.1
e entao aplica tambem a todos os outros que estiverem restartando assim que eles desistirem da versao que estavam tentando instalar
erro:
error response from daemon: rpc error: code = 13 desc = connection error: desc = "transport: x509: certificate has expired or is not yet valid"
aparentemente a solucao foi deletar todos os ips da placa (ela estava com mais de um) e criar uma faixa de ip isolada
ip addr flush dev eth0
Relacionados
Passos:
Para remover um no que nao esta down voce precisa rodar com -f
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ibh4kr8q0eq85zs7lu6gkdv14 * CI-80279-0 Ready Active Leader
mj93cvm1u6twbrf22b2577jmf kmymoney-compiler Down Active
$ docker node rm mj93cvm1u6twbrf22b2577jmf
mj93cvm1u6twbrf22b2577jmf
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ibh4kr8q0eq85zs7lu6gkdv14 * CI-80279-0 Ready Active Leader
A ideia eh criar uma VM que tenha um servidor NFS, entao em cada node do cluster swarm rodar uma app que basicamente vai conectar nesse servidor NFS e expor essa montagem via volume
version: '3'
services:
alpine:
image: alpine:3.7
command: sh -c 'apk add --update curl && tail -f /dev/null'
networks:
- swarm
nginx-1:
image: nginx:1.10
hostname: nginx1
networks:
- swarm
networks:
swarm:
driver: overlay
Criando um service
# cria o service
docker service create --name mydebian --detach=false debian:9 tailf -f /usr/bin/tail -f /dev/null
# ver como esta o processo de start
docker ps mydebian
# ver como os services estao
docker service ls mydebian
docker service ps --no-trunc {serviceName}
$ docker service create --replicas 2 --name helloworld alpine ping docker.com
9uk4639qpg7npwf3fn2aasksr
criar service passando network para poder resolver dns internamente
$ docker service create --network services --name go-be-server3 --replicas 3 defreitas/test-http-count-server:latest
Os outros services vao poder resolver este service chamando pelo nome deste service
curl go-be-server3
criar a network
docker network create \
--driver overlay \
--subnet 10.10.1.0/24 \
--opt encrypted \
services
$ sudo docker service scale hellworld=10
helloworld scaled to 10
Para ver em quais maquinas as instancias do service estao, estavam
sudo docker service ps helloworld-2
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9dpspmfwx5tt helloworld-2.1 alpine:latest typer-pc Running Running 21 minutes ago
ifeoixiolset helloworld-2.2 alpine:latest typer-pc Running Running 12 minutes ago
gc4pqkyfwwf4 \_ helloworld-2.2 alpine:latest localhost.localdomain Shutdown Running 12 minutes ago
Listando os services do meu cluster
$ sudo docker service ls
Criando config
echo 'some data' | docker config create test -
Pegando conteudo da config
docker config inspect -f '{{json .Spec.Data }}' test | cut -d'"' -f2 | base64 -d
Creating service
docker service create --name tmp-service -d=false --config test --config src=test,target="/myconfig" debian:9 /usr/bin/tail -f /dev/null
Testing config
docker exec -it tmp-service.1.lyvotf79pb91hf9z6n246s6qv tail -n+1 /test /myconfig
Criando config no docker-compose
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
Criando e apontando-a para um arquivo
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config
target: /redis_config
uid: '103'
gid: '103'
mode: 0440
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
keywords
docker swarm commands