使用Docker Compose运行一个多容器(Spring Boot和PostgreSQL)应用程序
容器技术简化了我们从本地环境到内部数据中心和云端的软件构建、测试和部署的方式。
利用容器技术构建应用程序的好处是,在我们构建多容器应用程序时,手动启动和停止每个容器变得很乏味。
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。我们使用Docker Compose来取代在多容器应用程序中的每个容器上重复运行的run 命令。
使用Docker Compose,我们可以将多容器应用程序的运行简化为两个命令:docker-compose up 和docker-compose down 。
目标
在本教程中,你将学习Docker Compose如何使在本地环境中配置和运行多个Docker容器变得更容易。出于演示目的,本教程将使用一个[Spring Boot]和[PostgreSQL]容器。
前提条件
- 对Spring Boot、Git和终端的基本了解。
- 对Docker和已安装的Docker Compose的基本了解。
- 一个Java IDE - 在本教程中,我们将使用IntelliJ Idea,但你可以使用你选择的任何IDE。
- Postman - Postman是一个API客户端,供开发者用来创建、测试、记录和分享API。
设置一个Spring Boot项目
要开始,从Github上克隆这个Spring Boot项目。这是一个博客REST API,你将使用它来创建和检索你要创建的PostgreSQL数据库中的博客文章。
博客API只有以下几个端点。
| 端点 | 功能 |
|---|---|
| POST /posts | 创建一个新的帖子 |
| GET /posts | 列出所有的todos |
克隆后,在项目目录中,进入src/main/resources/ 目录中的application.properties 文件,配置API数据源。

在application.properties 文件中添加。
spring.datasource.driverClassName=org.postgresql.Driver
上面的配置告诉Spring Boot,数据源将是PostgreSQL,使用PostgreSQL的特定驱动。
通常,在设置连接到数据源的Spring Boot项目时,我们在项目的application.properties 文件中使用类似于下面所示的配置。
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=<database_username>
spring.datasource.password=<database_password>
上述配置将使Spring Boot访问一个PostgreSQL数据库。在这篇文章中,你将用docker-compose.yml 文件来设置上述配置。
接下来,我们将对Spring Boot项目进行dockerize。
Dockerize Spring Boot项目
要dockerize一个Spring Boot项目,你需要生成一个JAR(Java ARchive)文件,将整个项目打包成一个文件。
导航到项目依赖性声明(pom.xml)文件。在该文件的build profile ,添加一个finalName。
<build>
<finalName>blog-api-docker</finalName>
</build>
以生成JAR文件,运行。
$ mvn install -DskipTests
添加-DskipTests ,告诉maven跳过测试应用状态,因为该项目尚未连接到指定的数据源。如果只运行$ mvn install ,会出现由PostgreSQL驱动引起的构建失败。
你可以在项目的target/ 目录中找到该JAR文件。
现在在你的项目目录下创建一个Dockerfile来构建一个Docker镜像,你将作为一个容器运行。
在Dockerfile中,添加。
FROM openjdk:11
ADD target/blog-api-docker.jar blog-api-docker.jar
ENTRYPOINT ["java", "-jar","blog-api-docker.jar"]
EXPOSE 8080
上述Dockerfile告诉Docker在目标目录下构建指定的JAR文件,关闭openjdk:11 基础镜像和EXPOSE 端口8080 。现在你可以构建Docker镜像了。
在项目目录下,运行。
$ docker build -t blog-api-docker.jar .
你可以使用docker run ,运行Spring Boot项目的Docker镜像,这将从该镜像中启动一个Docker容器。但记住,我们要用Docker Compose来启动所有的项目服务(容器)。
现在你已经对Spring Boot项目进行了docker化,你将需要定义一个Docker Composedocker-compose.yml 文件。这个文件将有一个配置,在Docker容器中创建一个PostgreSQL数据库,并将其连接到Spring Boot项目的容器中,作为一个多容器应用程序运行。
定义Docker Compose yml文件
在项目目录中,创建一个docker-compose.yml 文件。用以下定义设置docker-compose.yml 文件。
version: '3.1'
services:
API:
image: 'blog-api-docker.jar'
ports:
- "8080:8080"
depends_on:
PostgreSQL:
condition: service_healthy
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://PostgreSQL:5432/postgres
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=password
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
PostgreSQL:
image: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
上述配置定义了Docker Compose的版本和多容器应用程序中的服务。
API 服务。
imagekey的值是你从克隆的Spring Boot项目中创建的Docker镜像。ports键告诉Docker将 '的容器端口 暴露给主机(你的机器)端口 。API80808080API服务的完整启动depends_onPostgreSQL服务是健康的。- 你会在Spring Boot项目
application.properties文件中看到的environment配置的列表。这些配置将API服务与PostgreSQL服务进行连接和验证。
PostgreSQL 服务。
image,你的数据库容器将在其上运行postgresDocker镜像。- 该服务将端口
5432暴露给你的主机,端口5432。API服务可以在其environment配置中使用SPRING_DATASOURCE_URL连接到数据库。 - 接下来是认证PostgreSQL数据库的
environment配置的列表。 - 最后的配置
healthcheck,在间隔时间内使用命令"pg_isready -U postgres"测试数据库,以确保数据库服务已经完全启动,并且service_healthy,因为API服务depends_on,数据库已经完全启动,以完成其启动。
现在,你可以用Docker Compose运行你的多容器应用程序。
运行多容器应用程序
为了测试你所做的一切,打开终端,导航到你有docker-compose.yml 的Spring Boot项目目录,然后运行。
$ docker-compose up -d
上述命令启动了Spring Boot项目--API和PostgreSQL容器(服务)。额外的-d ,告诉Docker以分离模式运行。
现在你可以测试API端点了。打开Postman,使用下面类似的JSON数据向http://localhost:8080/posts 端点发送一个POST请求。
{
"title": "Test Post",
"post": "This POST request creates a Post"
}
上述请求创建了一个具有唯一ID的博客文章。

要查看你刚刚创建的文章,向同一端点发送一个GET请求。查看你所创建的所有博文。

要停止终端中的所有服务,请运行。
$ docker-compose down
现在你可以使用docker-compose up 和docker-compose down ,分别启动和停止所有的服务。
总结
在本教程中,你已经学会了如何定义Docker Compose yml文件,用它来运行多容器(Spring Boot和PostgreSQL)应用程序,并测试了该应用程序。
你可以在所有的环境中使用Docker Compose:生产、测试、暂存、开发和CI工作流程,以更好地进行软件开发过程。