使用Docker Compose进行多容器应用部署

在现代软件开发中,容器化技术改变了我们部署和管理应用程序的方式。Docker作为容器化技术的领导者,提供了一个轻量级且高效的方式来打包和运行应用程序。而Docker Compose则进一步简化了多容器应用的管理,它允许你使用一个docker-compose.yml文件来定义和运行多个Docker容器。本文将详细介绍如何使用Docker Compose进行多容器应用的部署,并提供一个Java示例项目来帮助理解。

什么是Docker Compose?

Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过一个YAML文件,你可以配置应用程序的服务,然后使用一个单独的命令启动和运行所有服务。

安装Docker Compose

在开始之前,请确保你已经安装了Docker和Docker Compose。如果尚未安装,请参考官方文档进行安装:

示例项目:Spring Boot + MySQL

我们将构建一个简单的Spring Boot应用程序,并使用MySQL作为数据库。通过Docker Compose,我们将这两个服务整合在一起。

项目结构

首先,创建一个新的目录结构:

复制代码
multi-container-app/
│
├── docker-compose.yml
├── backend/
│   ├── Dockerfile
│   ├── src/
│   ├── pom.xml
│   └── ...
└── db/
    └── Dockerfile
Step 1: 创建Spring Boot后端

我们将使用Spring Initializr来生成一个简单的Spring Boot应用程序。访问Spring Initializr,选择以下依赖项:

  • Spring Web
  • Spring Data JPA
  • MySQL Driver

下载生成的项目并解压到backend/目录中。

修改application.properties

src/main/resources/application.properties文件中,添加以下内容以配置MySQL连接:

复制代码
spring.datasource.url=jdbc:mysql://db:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

这里,我们将数据库主机名设置为db,这将在Docker Compose中定义。

创建一个简单的实体和存储库

src/main/java/com/example/demo/目录中,创建一个名为Person.java的实体类:

java 复制代码
package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Getters and setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

创建一个存储库接口PersonRepository.java

java 复制代码
package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

public interface PersonRepository extends JpaRepository<Person, Long> {
}

创建一个简单的控制器PersonController.java

java 复制代码
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/persons")
public class PersonController {
    @Autowired
    private PersonRepository personRepository;

    @GetMapping
    public List<Person> getAllPersons() {
        return personRepository.findAll();
    }

    @PostMapping
    public Person createPerson(@RequestBody Person person) {
        return personRepository.save(person);
    }
}
创建Dockerfile

backend/目录下创建一个Dockerfile

java 复制代码
FROM openjdk:11-jdk-slim
VOLUME /tmp
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

构建Spring Boot应用程序:

java 复制代码
cd backend
./mvnw clean package
Step 2: 配置MySQL数据库

db/目录下创建一个空的Dockerfile。我们将使用官方的MySQL镜像,因此这个文件可以留空。

我们需要为MySQL数据库创建一个初始化脚本。创建一个名为init.sql的文件:

java 复制代码
CREATE DATABASE IF NOT EXISTS mydb;
USE mydb;
CREATE TABLE IF NOT EXISTS person (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);
Step 3: 创建docker-compose.yml

在项目的根目录下,创建一个docker-compose.yml文件:

java 复制代码
version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql

  backend:
    build: ./backend
    container_name: backend
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydb
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root

volumes:
  db_data:
Step 4: 启动应用

在项目根目录下,运行以下命令来启动应用:

java 复制代码
docker-compose up --build

这将构建Spring Boot应用程序并启动两个容器:一个用于MySQL数据库,另一个用于Spring Boot应用程序。

Step 5: 验证应用

当容器启动后,你可以通过浏览器或Postman访问Spring Boot应用程序:

  • 获取所有人员信息:GET http://localhost:8080/persons
  • 添加一个新的人员:POST http://localhost:8080/persons,请求体如下:
java 复制代码
{
    "name": "John Doe"
}
结论

通过Docker Compose,我们能够轻松地定义和管理多容器应用程序。在本文中,我们创建了一个简单的Spring Boot应用程序,并将其与MySQL数据库结合在一起,通过Docker Compose实现了多容器部署。希望这个示例项目能够帮助你更好地理解Docker Compose的使用,并应用到实际项目中。

相关推荐
吴声子夜歌12 分钟前
Shell编程实例——脚本编程的附加特性
linux·运维·shell
叶总没有会25 分钟前
Docker 基础+实战
运维·docker·云原生·容器
蓝速科技44 分钟前
会议室门牌显示模板选型与品牌视觉适配落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
指尖的爷1 小时前
【地狱级难度】ubuntu系统GOCV编译安装
linux·运维·ubuntu
KKKlucifer1 小时前
跨中台安全业务编排:融合4A平台原子化安全能力的创新实践
运维·人工智能·安全·自动化
j7~1 小时前
【C++微服务项目开发脚手架】(环境篇)虚拟机 + Docker + MySQL/Redis/RabbitMQ/ES/etcd/FastDFS 全套配齐
linux·c++·ubuntu·docker·vmware·项目开发·微服务脚手架
邪修king1 小时前
Re:Linux 系统篇(三十一):库的制作与原理Chapter2:静态链接与程序加载 —— 从磁盘 ELF 到运行中进程的完整旅程
android·linux·运维·开发语言
天天喝旺仔1 小时前
Go 泛型实战:从类型参数、约束到可复用泛型容器与函数
数据结构·算法·容器·go
A-刘晨阳1 小时前
普通摄像头怎么加上 AI 监控?用 Frigate 把识别和事件管理放到绿联 NAS
运维
小马同学-2 小时前
docker容器
docker·容器