2. Services
About services
In a distributed application, different pieces of the app are called “services”.
Containers in production
A service only runs one image, but it codifies the way that image runs—what ports it should use, how many replicas of the container should run so the service has the capacity it needs, and so on.
Scaling a service changes the number of container instances running that piece of software, assigning more computing resources to the service in the process.
The true implementation of a container in production is running it as a service.
Services codify a container’s behavior in a Compose file, and this file can be used to scale, limit, and redeploy our app. Changes to the service can be applied in place, as it runs, using the same command that launched the service: docker stack deploy
Easy to define, run, and scale services with the Docker platform: write a docker-compose.yml
docker-compose.yml
file
docker-compose.yml
fileYAML file that defines how Docker containers should behave in production.
docker-compose.yml
docker-compose.yml
Example:
This docker-compose.yml
file tells Docker to do the following:
Pull the image from the registry.
Run 5 instances of that image as a service called
web
, limiting each one to use, at most, 10% of a single core of CPU time, and 50MB of RAM.Immediately restart containers if one fails.
Map port 4000 on the host to
web
’s port 80.Instruct
web
’s containers to share port 80 via a load-balanced network calledwebnet
. (Internally, the containers themselves publish toweb
’s port 80 at an ephemeral port.)Define the
webnet
network with the default settings (which is a load-balanced overlay network).
Run your new load-balanced app
Before we can use the docker stack deploy
command we first run:
Now let’s run it. You need to give your app a name. Here, it is set to getstartedlab
:
Our single service stack is running 5 container instances of our deployed image on one host. Let’s investigate.
Get the service ID for the one service in our application:
Look for output for the web
service, prepended with your app name. If you named it the same as shown in this example, the name is getstartedlab_web
. The service ID is listed as well, along with the number of replicas, image name, and exposed ports.
Alternatively, you can run docker stack services
, followed by the name of your stack.
Example: view all services associated with thegetstartedlab
stack:
Tasks
A single container running in a service.
Have unique IDs that numerically increment, up to the number of replicas
you defined indocker-compose.yml
.
List the tasks for your service:
Tasks also show up if you just list all the containers on your system, though that is not filtered by service:
Run curl -4 http://localhost:4000
several times in a row, or go to that URL in your browser and hit refresh a few times.
Either way, the container ID changes, demonstrating the load-balancing.
Load-balancing
With each request, one of the 5 tasks is chosen, in a round-robin fashion, to respond. The container IDs match your output from the previous command (docker container ls -q
).
View all tasks of a stack: run docker stack ps
followed by your app name::
Slow response times?
Depending on your environment’s networking configuration, it may take up to 30 seconds for the containers to respond to HTTP requests. This is not indicative of Docker or swarm performance, but rather an unmet Redis dependency that we address later in the tutorial. For now, the visitor counter isn’t working for the same reason; we haven’t yet added a service to persist data.
Scale the app
Change the replicas
value in docker-compose.yml
Re-run docker stack deploy
:
Docker performs an in-place update, no need to tear the stack down first or kill any containers.
Now, re-run docker container ls -q
to see the deployed instances reconfigured. If you scaled up the replicas, more tasks, and hence, more containers, are started.
Take down the app and the swarm
Take the app down with
docker stack rm
:Take down the swarm.
It’s as easy as that to stand up and scale your app with Docker.
Last updated