Generic Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we'll learn how to restart a single Docker container with Docker Compose.

2. Docker Compose restart Command

Docker Compose is a tool to manage multiple containers as a single service. However, the Docker Compose CLI includes commands that can apply to a single container. For example, the restart command lets us provide the name of the service we want to restart without affecting the other services that are running:

docker-compose restart service-name

Before diving into the restart command execution, let's set up a working environment.

3. Setup

We must have a Docker container to run the Docker Compose commands. We'll use a previous Baeldung project, spring-cloud-docker, which is a dockerized Spring Boot application. This project has two Docker containers that will help us prove that we can restart a single service without affecting the other.

First, we must confirm that we can run both containers by running the following command from the root of the project:

docker-compose up --detach --build

Now, we should be able to see both services running by executing docker-compose ps:

$ docker ps
     Name                   Command              State            Ports         
--------------------------------------------------------------------------------
message-server   java -jar /message-server.jar   Up      0.0.0.0:18888->8888/tcp
product-server   java -jar /product-server.jar   Up      0.0.0.0:19999->9999/tcp

Additionally, we could go to localhost:18888 or localhost:19999 in our browser and verify that we see the messages displayed by the application services.

4. Restarting a Single Container

Up to this point, we have two containers running and managed as a single service by Docker Compose. Now, let's see how we can use the restart command to stop and start only one of the two containers.

First, we'll look at how we can achieve this without rebuilding the container. However, this solution will not update the service with the latest code. Then, we'll see another approach where we build the container with the latest code before running.

4.1. Restarting Without Rebuilding

With both containers running, we pick one of the services to restart. In this case, we'll use the message-server container:

docker-compose restart message-server

After we run the command in the terminal, we should be able to see the following message:

Restarting message-server ... done

Once the terminal prompts for another command, we can confirm that message-server has been restarted successfully by running the Docker command ps to check the states of all the running processes:

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                     NAMES
b6541d1c4ddf   product-server:latest   "java -jar /product-…"   10 minutes ago   Up 42 seconds   0.0.0.0:19999->9999/tcp   product-server
1d07d2a7ed7d   message-server:latest   "java -jar /message-…"   10 minutes ago   Up 15 seconds   0.0.0.0:18888->8888/tcp   message-server

Finally, we can determine that the command successfully restarted the message-server container by looking at the STATUS column. We can see how the message-server service has been up and running for a smaller period than the product-server service, which has been up since we ran the docker-compose up command in the previous section.

4.2. Rebuilding and Restarting

If a container needs to be updated with the latest code, running the restart command is not sufficient since the service needs to build first to pick up the code changes.

With both containers running, let's change the code first to confirm we'll update the service with the latest code before restarting. In the DockerProductController class, let's change the return statement to look like this:

public String getMessage() {
    return "This is a brand new product";
}

Now, let's build the Maven package:

mvn clean package

Now, we are ready to restart the product-server container. We can achieve this similarly to how we start the services, but this time by providing the name of the container we want to restart.

Let's run the command to rebuild and restart the container:

docker-compose up --detach --build product-server

Now, we can verify that the product-server container restarted with the latest code by running docker ps and looking at the output:

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                     NAMES
78a4364e75e6   product-server:latest   "java -jar /product-…"   6 seconds ago    Up 5 seconds    0.0.0.0:19999->9999/tcp   product-server
b559f742973b   message-server:latest   "java -jar /message-…"   22 minutes ago   Up 22 minutes   0.0.0.0:18888->8888/tcp   message-server

As we can see, the product-server changed both the CREATED value and STATUS value, indicating that the service was rebuilt first and then restarted without any impact on the message-server.

Additionally, we can further confirm the code was updated by going to localhost:19999 in our browser and checking that the output is the latest.

5. Conclusion

In this article, we've learned how to restart a single container using Docker Compose. We covered two ways to achieve this.

First, we used the restart command with the name of the service to restart. Then, we made code changes to demonstrate we could rebuild the latest code and restart a single container without affecting the other.

Generic bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE
Generic footer banner
guest
0 Comments
Inline Feedbacks
View all comments