1. 概述

在这篇教程中,我们将学习如何使用Docker Compose重启单个Docker容器。

2. Docker Compose restart 命令

Docker Compose 是一个用于管理多个容器作为单一服务的工具。然而,Docker Compose 的命令行界面包括可以应用于单个容器的命令。例如,restart 命令允许我们提供要重启的服务名称,而不会影响正在运行的其他服务:

docker-compose restart service-name

在执行 restart 命令之前,让我们先设置工作环境。

3. 设置

我们需要一个可以运行Docker Compose命令的Docker容器。我们将使用之前的Baeldung项目,即 spring-cloud-docker,这是一个容器化的Spring Boot应用。这个项目有两个Docker容器,可以帮助我们证明可以在不影响其他服务的情况下仅重启单个服务。

首先,我们需要确认可以从项目的根目录运行两个容器的命令:

docker-compose up --detach --build

现在,通过执行 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

此外,我们还可以在浏览器中访问 localhost:18888localhost:19999,验证应用服务是否显示消息。

4. 单个容器的重启

到目前为止,我们有两个容器正在运行,并由Docker Compose作为一个单一服务进行管理。现在,让我们看看如何使用 restart 命令只重启两个容器中的一个。

首先,我们将探讨如何在不需要重建容器的情况下实现这一目标。 但是,此解决方案无法更新服务以获取最新代码。然后,我们将看到另一种方法,在运行前先构建带有最新代码的容器。

4.1. 不重建的重启

在两个容器都运行时,我们可以选择要重启的一个服务。在这个例子中,我们将使用 message-server 容器:

docker-compose restart message-server

在终端中运行命令后,应该能看到以下信息:

Restarting message-server ... done

终端提示执行另一个命令后,可以通过运行Docker命令 ps 来检查所有正在运行进程的状态,确认 message-server 已成功重启:

$ 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

最后,通过查看 STATUS 列,我们可以确定命令成功重启了 message-server 容器。可以看到 message-server 服务的运行时间比 product-server 服务短,后者自上一次运行 docker-compose up 命令以来一直在运行。

4.2. 重建与重启

如果容器需要更新为最新代码,则仅运行 restart 命令是不够的,因为服务需要先构建以获取代码更改。

在两个容器都运行时,让我们先更改代码,以确认在重启前可以更新服务并获取最新代码。在 DockerProductController 类中,让我们将 return 语句更改为如下:

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

现在,让我们构建Maven包:

mvn clean package

现在,我们已经准备好重启 product-server 容器。我们可以通过类似于启动服务的方式实现这一目标,但这次需要提供要重启的容器的名称。

让我们运行命令来重建和重启容器:

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

现在,可以通过运行 docker ps 并查看输出来验证 product-server 容器已使用最新代码重启:

$ 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

如图所示, product-serverCREATED 值和 STATUS 值都发生了变化,表明服务首先被重建,然后重启,这不会影响 message-server

此外,我们可以通过在浏览器中访问 localhost:19999 并检查输出来进一步确认代码已被更新。

5. 总结

在这篇文章中,我们学习了如何使用Docker Compose重启单个容器。我们覆盖了两种实现这一目标的方法。

首先,我们使用服务名称的 restart 命令来重启。然后,我们通过演示在不影响其他服务的情况下更新最新代码并重启单个容器,展示了另一种方法。