使用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 分钟前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
Mitch31128 分钟前
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
elasticsearch·网络安全·docker·漏洞复现
Mitch31133 分钟前
【漏洞复现】CVE-2015-5531 Arbitrary File Reading
web安全·elasticsearch·网络安全·docker·漏洞复现
wanhengidc1 小时前
短视频运营行业该如何选择服务器?
运维·服务器
雨中rain1 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
-KamMinG1 小时前
Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
运维·grafana
Bessssss1 小时前
centos日志管理,xiao整理
linux·运维·centos
豆是浪个1 小时前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&1 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
王铁柱子哟-2 小时前
解决 正在下载VS Code 服务器... 问题
运维·服务器