如何用Docker Compose运行一个多容器(Spring Boot和PostgreSQL)应用程序

530 阅读4分钟

使用Docker Compose运行一个多容器(Spring Boot和PostgreSQL)应用程序

容器技术简化了我们从本地环境到内部数据中心和云端的软件构建、测试和部署的方式。

利用容器技术构建应用程序的好处是,在我们构建多容器应用程序时,手动启动和停止每个容器变得很乏味。

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。我们使用Docker Compose来取代在多容器应用程序中的每个容器上重复运行的run 命令。

使用Docker Compose,我们可以将多容器应用程序的运行简化为两个命令:docker-compose updocker-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数据源。

BlogAPI project directory structure showing application.properties file

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 服务。

  • image key的值是你从克隆的Spring Boot项目中创建的Docker镜像。
  • ports 键告诉Docker将 '的容器端口 暴露给主机(你的机器)端口 。API 8080 8080
  • API 服务的完整启动depends_on PostgreSQL 服务是健康的。
  • 你会在Spring Boot项目application.properties 文件中看到的environment 配置的列表。这些配置将API 服务与PostgreSQL 服务进行连接和验证。

PostgreSQL 服务。

  • image ,你的数据库容器将在其上运行postgres Docker镜像。
  • 该服务将端口5432 暴露给你的主机,端口5432API 服务可以在其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的博客文章。

POST request Test

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

GET request Test

要停止终端中的所有服务,请运行。

$ docker-compose down

现在你可以使用docker-compose updocker-compose down ,分别启动和停止所有的服务。

总结

在本教程中,你已经学会了如何定义Docker Compose yml文件,用它来运行多容器(Spring Boot和PostgreSQL)应用程序,并测试了该应用程序。

你可以在所有的环境中使用Docker Compose:生产、测试、暂存、开发和CI工作流程,以更好地进行软件开发过程。