使用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的使用,并应用到实际项目中。

相关推荐
SelectDB15 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker