Deploying a Replicated Service
A replicated service is a Docker Swarm service that has a specified number of replicas running. These replicas consist of multiple instances of the specified Docker container.
To create our new service, we'll use the docker command along with the service create options. The following command will create a service with 4 replicas -
root@master:~# docker service create -d --replicas 4 alpine ping 192.168.0.123
w4iv8lq3q5agl7ee3qmnfeks9
root@master:~#
To check all the containers replicas deployed by the service using the below command -
docker service ps serviceID
example:
root@master:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
w4iv8lq3q5ag crazy_einstein replicated 4/4 alpine:latest
root@master:~# docker service ps w4
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j6ab2gd7dq92 crazy_einstein.1 alpine:latest worker01 Running Running 2 minutes ago
4be0tnamctta crazy_einstein.2 alpine:latest worker02 Running Running 2 minutes ago
gdssk5jzht4o crazy_einstein.3 alpine:latest master Running Running 2 minutes ago
iwinbsa43f2q crazy_einstein.4 alpine:latest worker01 Running Running 2 minutes ago
root@master:~#
In the output you can see, two containers are running on worker01, one on master, and 1 one on worker02.
Now, go to worker01 and remove the underlying containers.
root@worker01:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e02cfc5348e4 alpine:latest "ping 192.168.0.123" 3 minutes ago Up 3 minutes crazy_einstein.1.j6ab2gd7dq92llot347x9y80w
60339b79e95f alpine:latest "ping 192.168.0.123" 3 minutes ago Up 3 minutes crazy_einstein.4.iwinbsa43f2qgg722pb6edci8
root@worker01:~# docker container rm -f e0 60
e0
60
root@worker01:~#
And as a result of this, the docker service on the manager node will again start 2 more containers as the replicas are set as 4.
root@master:~# docker service ps w4
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w1ofqtlfv5ah crazy_einstein.1 alpine:latest worker01 Ready Ready 4 seconds ago
j6ab2gd7dq92 \_ crazy_einstein.1 alpine:latest worker01 Shutdown Failed 4 seconds ago "task: non-zero exit (137)"
4be0tnamctta crazy_einstein.2 alpine:latest worker02 Running Running 3 minutes ago
gdssk5jzht4o crazy_einstein.3 alpine:latest master Running Running 3 minutes ago
g3m2takbws4d crazy_einstein.4 alpine:latest worker01 Ready Ready 4 seconds ago
iwinbsa43f2q \_ crazy_einstein.4 alpine:latest worker01 Shutdown Failed 4 seconds ago "task: non-zero exit (137)"
root@master:~#
In this way, the docker swarm manager makes sure that the cluster is always running in the desired state.