Day 40 : Docker Swarm Commands #90DaysofDevOps
Ayushi Tiwari
Java Software Developer | Certified Microsoft Technology Associate (MTA)
Swarm is Docker’s in built containers orchestrator solution, its main purpose is to manage containers in a computer cluster, i.e. a set of connected computers that work together. Swarm comes built into the Docker Engine, you don’t need to install anything to get started.
In Docker, there are many layers of encapsulation: the OS kernel, containers, tasks that encapsulate containers as units of work, services or Pods that represent application components, and stacks(collection of services) that represent full applications.
Install docker with
curl -ssl https://get.docker.com | bash
Preparing the server
Create several instances of the one-click docker image on Ubuntu 14.
Initialize the swarm
Log into the server you want to be your manager and run:
docker swarm init --advertise-addr server_ip_address
It will give you a command to paste into the other servers. Paste the worker command into the other instances to join this server as a worker and the manager command to join as a manager.
Get worker join command
If you forgot the command or didn’t save it somewhere you can ssh back into a manager server and run.
docker swarm join-token worker
Get manager join command
docker swarm join-token manager
Enabling experimental features
Some commands won’t work in the default Digital Ocean instances. You can enable some of these commands by editing /etc/default/docker file.
nano /etc/default/dockerDOCKER_OPTS="--experimental=true"
After making edits restart docker
service docker restart
How to setup your domain name
When you connect a domain name to your ip, add A records for a few ip addresses in the swarm so if one fails the domain can connect through the other. The built-in load-balancer runs on every instance so even pointing your domain to a worker node ip will work.
Upload files to server
scp -r environment.env .env production.yml root@server_ip:~/
Deploy a new stack or update an existing stack from a compose file
SSH into your manager server. These commands only work from a manager.
ssh root@server_ip
NOTE: The new prune feature removes services no longer referenced in the compose file on updates. It may not work on your version of docker.
NOTE: Each time you run deploy it will override any manual scaling you have done to individual services and instead match the yml file scale parameters.
env $(cat .env | grep ^[A-Z] | xargs) docker stack deploy -c production.yml --with-registry-auth --prune stack_name
env $(cat .env | grep ^[A-Z] | xargs) will read variables in the .env file into your deployment.
领英推è
See services running
docker stack services stack_name
See Logs for a service
stack_name_ + service_name
docker service logs stack_name_service_name
Scale a service
Creates more instances of a services containers and distributes them across qualified nodes.
docker service scale STACK_NAME_SERVICE_NAME=REPLICAS
Ex:
docker service scale main_api=3
Find out what nodes there are and which are managers
docker node ls
Promote a worker node to manager
You get the node_name from docker node ls
docker node promote node_name
List running swarms
docker stack ls
Remove an entire swarm
WARNING: Deletes all volume data (such as database information)
docker stack rm stack_name
Have a node leave a swarm
docker swarm leave
If you lose a majority of managers
Docker swarm always requires a majority of mangers out of the total number of managers to be running. So if you have 5 managers, you can only lose two and still have a majority. If you have 3 managers you can only lose 1 and still have a majority.
However if you lose the majority you can reinitialize a majority by forcing a new swarm. Just go to 1 manager node still running and run
docker swarm init --force-new-cluster --advertise-addr your_ip
This will remove all other managers and leave only the one you’re in as a manager, which will be the new majority. Then you can promote other nodes to managers. It will still be aware of your containers and running services and volumes and shouldn’t interfere. However until you force a new cluster you can’t alter, add, or remove any of the running services.
Force a rebalance of containers after adding a new node to the stack
It’s better to use scale services to gradually add containers to a new node, however you can relaunch all containers to distribute to all nodes including the one added.
NOTE: This will disrupt production
docker service ls -q > dkr_svcs && for i in `cat dkr_svcs`; do docker service update "$i" --detach=false --force ; done