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

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

什么是Docker Compose?

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

安装Docker Compose

在开始之前,请确保你已经安装了Docker和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的实体类:

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 setterspublic 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

package com.example.demo;import org.springframework.data.jpa.repository.JpaRepository;public interface PersonRepository extends JpaRepository<Person, Long> {
}

创建一个简单的控制器PersonController.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 {@Autowiredprivate PersonRepository personRepository;@GetMappingpublic List<Person> getAllPersons() {return personRepository.findAll();}@PostMappingpublic Person createPerson(@RequestBody Person person) {return personRepository.save(person);}
}
创建Dockerfile

backend/目录下创建一个Dockerfile

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

构建Spring Boot应用程序:

cd backend
./mvnw clean package
Step 2: 配置MySQL数据库

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

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

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文件:

version: '3.8'services:db:image: mysql:8.0container_name: mysqlenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbports:- "3306:3306"volumes:- db_data:/var/lib/mysql- ./db/init.sql:/docker-entrypoint-initdb.d/init.sqlbackend:build: ./backendcontainer_name: backendports:- "8080:8080"depends_on:- dbenvironment:SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/mydbSPRING_DATASOURCE_USERNAME: rootSPRING_DATASOURCE_PASSWORD: rootvolumes:db_data:
Step 4: 启动应用

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

docker-compose up --build

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

Step 5: 验证应用

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

售前工程师的AI大模型转型之路

随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;正逐渐成为IT行业的热点。对于售前工程师来说&#xff0c;转行大模型领域不仅意味着新的机遇&#xff0c;也面临着诸多挑战。本文将探讨售前工程师转行大模型领域的机遇与挑战…

关于UTF-64格式的反思

目标 为了让不同语言表达相同意思&#xff0c;所需的编码长度差不多&#xff0c;有了UTF-64编码。 现实 可是&#xff0c;今天刚发现&#xff1a;虽然不同语言用UTF-8表达相同意思&#xff0c;编码长度差很多&#xff0c;但是&#xff0c;压缩之后就差不多了。代码如下&…

嵌入式人工智能(6-树莓派4B按键输入控制LED)

1、按键 按键的原理都是一样&#xff0c;通过按键开关的按下导通&#xff0c;抬起断开的情况&#xff0c;GPIO引脚来检测其是否有电流流入。GPIO有input()方法&#xff0c;对于GPIO引脚检测电流&#xff0c;不能让其引脚悬空&#xff0c;否则引脚会受周边环境电磁干扰产生微弱…

SpringBoot之健康监控(Actuator)

1&#xff0c;基本介绍 Spring Actuator 是 Spring Boot 提供的一个扩展模块&#xff0c;用于监控和管理应用程序的生产环境。它通过 HTTP 端点暴露了大量的监控和管理功能&#xff0c;使得开发者可以在运行时查看应用程序的运行状况、配置信息、性能指标等。 主要功能&#…

探索未来视界:LC201小尺寸红外热成像机芯引领行业新变革

在当今科技飞速发展的时代&#xff0c;红外热成像技术正以前所未有的方式革新着诸多行业&#xff0c;而灵卡技术推出的LC201小尺寸红外热成像机芯&#xff0c;正是这一变革的先锋。专为体积和功耗敏感领域设计&#xff0c;LC201以超紧凑的22x22mm尺寸、轻量化设计&#xff0c;及…

什么是边缘计算技术和边缘计算平台?

随着物联网、5G技术和人工智能的不断发展&#xff0c;数据的规模和种类也在快速增加。在这种背景下&#xff0c;传统的云计算模式面临着一些问题&#xff0c;例如延迟高、网络拥塞等&#xff0c;这些问题限制了数据的处理速度和效率&#xff0c;降低了用户的使用体验。为了解决…

【前端】Web控件与数据感应之模板循环输出

在Web开发中&#xff0c;模板循环输出是一种常见且非常有用的技术&#xff0c;它允许开发者根据后端传递的数据集合动态生成HTML内容。这一过程通常通过前端模板引擎或JavaScript库来实现&#xff0c;如Handlebars、Mustache、EJS&#xff08;在Node.js环境下&#xff09;以及现…

非对称加解密和签名

非对称加解密特点 一对密钥&#xff0c;公钥和私钥。私钥自己持有&#xff0c;公钥公开给通信的对方。 如果公钥用作加密&#xff0c;那么私钥用作解密。 如果私钥用做加密&#xff0c;那么公钥用作解密。 如果数据量少可用非对称加密算法直接加密。 如果数据量大&#xff0c;…

【Python爬虫教程】第7篇-requests模块的cookies保存和使用

文章目录 为什么要保存cookiesrequests.utils工具类保存cookies到本地文件从本地文件解析cookies使用使用实践 为什么要保存cookies 保存cookies是避免每次都登录获取权限&#xff0c;一遍权限是有过期时间的&#xff0c;不需要每次重复登录&#xff0c;可以将cookies保存起来…

sqlalchemy.orm中validates对两个字段进行联合校验

版本 sqlalchemy1.4.37 需求说明 有个场景&#xff0c;需要在orm中对两个字段进行联合校验&#xff0c;当 col1 xxx’时&#xff0c;对 col2的长度进行检查&#xff0c;超过限制&#xff08;500&#xff09;时&#xff0c;进行截断。 网上找了很久&#xff0c;没找到类似的…

MySQL事务隔离级别+共享锁,排他锁,乐观锁,悲观锁

在操作数据库的时候&#xff0c;可能会由于并发问题而引起的数据的不一致性&#xff08;数据冲突&#xff09;。 MySQL事务隔离级别 一个事务的执行&#xff0c;本质上就是一条工作线程在执行&#xff0c;当出现多个事务同时执行时&#xff0c;这种情况则被称之为并发事务&am…

AB 罗克韦尔 1796-AFRAME控制器 处理器 模块

AB 罗克韦尔 1796-AFRAME 控制器专为各种工业自动化应用而设计&#xff0c;包括制造&#xff0c;过程控制等。它具有强大的处理器&#xff0c;以及广泛的连接选项&#xff0c;包括以太网&#xff0c;USB和串行端口 AB 罗克韦尔 1796-AFRAME控制器是一款紧凑而功能强大的控制器…

AI算法16-贝叶斯线性回归算法Bayesian Linear Regression | BLR

贝叶斯线性回归算法简介 频率主义线性回归概述 线性回归的频率主义观点可能你已经学过了&#xff1a;该模型假定因变量&#xff08;y&#xff09;是权重乘以一组自变量&#xff08;x&#xff09;的线性组合。完整的公式还包含一个误差项以解释随机采样噪声。如有两个自变量时…

企业和个人在网络安全方面需承担哪些责任?

企业在网络安全方面的责任 企业在网络安全方面承担着重要的责任&#xff0c;主要包括建立健全网络安全管理体系、制定网络安全政策和规范、加强员工的网络安全意识培训、提高网络安全防护能力等。企业还需要采取有效的技术措施来保护用户数据的安全&#xff0c;如使用加密技术…

华为昇思MindSpore 25天学习打卡-0711

在深入学习和实现深度学习算法时&#xff0c;理解其背后的原理和机制至关重要。通过使用纯Python实现一个简单的神经网络&#xff0c;我们可以更好地理解这些基本概念&#xff0c;而无需依赖诸如PyTorch或TensorFlow等高级深度学习框架。以下是我在编写和研究以上代码时的一些学…

excel系列(二) - 利用 easypoi 快速实现 excel 文件导入导出

一、介绍 在上篇文章中&#xff0c;我们介绍了 apache poi 工具实现 excel 文件的导入导出。 本篇我们继续深入介绍另一款优秀的 excel 工具库&#xff1a;easypoi。 二、easypoi 以前的以前&#xff0c;有个大佬程序员&#xff0c;跳到一家公司之后就和业务人员聊上了&…

springboot项目,指定某些接口不被拦截方法

1、监听器&#xff08;Interceptor&#xff09;拦截处理 在 Spring Boot应用中&#xff0c;如果你希望某些请求地址不被监听器&#xff08;Interceptor&#xff09;拦截处理&#xff0c;可以通过配置拦截器的路径来实现。拦截器通常用于在请求前后进行处理&#xff0c;比如权限…

Parallels Desktop 19 for Mac(PD19虚拟机)详细图文安装教程分享

Parallels Desktop 19是一款功能丰富、性能强大且易于使用的虚拟机软件&#xff0c;它可以让您在Mac上同时运行多个操作系统&#xff0c;为您提供更大的灵活性和兼容性。 Parallels Desktop 19 for Mac(PD19虚拟机)下载安装包 Parallels Desktop 19 for Mac(PD19虚拟机)详细图…

kubernetes v1.29.6集群部署

文章目录 1、配置hostname2、安装k8s的Runtime2.1、安装Docker2.2 安装cri-dockerd 3、安装k8s3.1、安装k8s组件3.2、初始化k8s3.2.1、拉取k8s相关镜像3.2.2、集群初始化 3.3、安装网络组件calico3.3.1、在线安装calico3.3.2、离线安装calico 3.4、节点加入 4、部署应用4.1、命…

linux端口,进程管理,主机状态监控

linux端口&#xff0c;进程管理&#xff0c;主机状态监控 一、端口 1、什么是端口?2、端口的划分2、查看端口占用 二、进程 1、什么是进程2、查看进程信息2、关闭进程 三、主机状态监控 1、查看资源占用2、磁盘信息监控3、查看网络情况 四、命令总结 一、端口 1、什么是端口…