From a76dd2227ee2f9d8828abb92cd0b65670e0896e1 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Mon, 26 May 2025 16:01:16 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=85=8D=E7=BD=AE=E7=9B=91?= =?UTF-8?q?=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-demo/ReadMe.md | 484 ++++++------------ .../f69073a0-a94a-437a-b555-1abe9914556f.png | Bin 0 -> 56785 bytes .../service/OrderServiceApplication.java | 29 ++ cloud-demo/环境搭建.md | 237 +++++++++ 4 files changed, 410 insertions(+), 340 deletions(-) create mode 100644 cloud-demo/images/f69073a0-a94a-437a-b555-1abe9914556f.png create mode 100644 cloud-demo/环境搭建.md diff --git a/cloud-demo/ReadMe.md b/cloud-demo/ReadMe.md index c31a46f..1e29f4d 100644 --- a/cloud-demo/ReadMe.md +++ b/cloud-demo/ReadMe.md @@ -1,241 +1,4 @@ -# 微服务 - -## 环境搭建 - -### Docker镜像源设置 - -```bash -# 创建目录 -sudo mkdir -p /etc/docker -# 写入配置文件 -sudo tee /etc/docker/daemon.json <<-'EOF' -{ - "registry-mirrors": [ - "https://docker-0.unsee.tech", - "https://docker-cf.registry.cyou", - "https://docker.1panel.live" - ] -} -EOF - -# 重启docker服务 -sudo systemctl daemon-reload && sudo systemctl restart docker -``` - -使用docker-compose有的时候会因为版本不同,但是配置文件主要内容就是这些。需要注意版本问题 - -### 配置相关 - -#### MySQL配置问题 - -| **特性** | `**my.cnf**` | `**conf.d**` **目录** | -|----------|:--------------------|:-------------------:| -| **文件类型** | 单个文件 | 目录,包含多个 `.cnf` 文件 | -| **配置方式** | 集中式配置 | 分布式配置 | -| **优先级** | 高(覆盖 `conf.d` 中的配置) | 低(被 `my.cnf` 覆盖) | -| **适用场景** | 全局配置,核心配置 | 模块化配置,便于扩展和维护 | - -#### MongoDB配置 - -```bash -sudo mkdir -p ~/docker/docker_data/mongo/conf -sudo mkdir -p ~/docker/docker_data/mongo/logs -sudo chmod 777 ~/docker/docker_data/mongo/logs -sudo chmod 777 ~/docker/docker_data/mongo/conf - -cd ~/docker/docker_data/mongo/logs -sudo touch mongod.log -sudo chmod 777 mongod.log - -cd ~/docker/docker_data/mongo/conf -sudo vim mongod.conf - -cd ~ -``` - -##### 配置文件 - -```bash -# 数据库文件存储位置 -dbpath = /data/db -# log文件存储位置 -logpath = /data/log/mongod.log -# 使用追加的方式写日志 -logappend = true -# 是否以守护进程方式运行 -# fork = true -# 全部ip可以访问 -bind_ip = 0.0.0.0 -# 端口号 -port = 27017 -# 是否启用认证 -auth = true -# 设置oplog的大小(MB) -oplogSize=2048 -``` - -##### 设置账户密码 - -```shell -#进入容器 -docker exec -it mongodb /bin/bash - -#进入mongodb shell -mongosh --port 27017 - -#切换到admin库 -use admin - -#创建账号/密码 -db.createUser({ user: 'admin', pwd: '02120212', roles: [ { role: "root", db: "admin" } ] }); -# db.createUser({ user: 'admin', pwd: '123456', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); -``` - -### docker-compose.yml - -如果休要所有的微服务环境,可以直接复制下面的内容,看清楚目录是否和自己需要的一样。 - -| 功能 | 旧版 (docker-compose) | 新版 (docker compose) | -|--------------|-------------------------|-------------------------| -| **启动服务** | docker-compose up -d | docker compose up -d | -| **停止服务** | docker-compose down | docker compose down | -| **查看日志** | docker-compose logs -f | docker compose logs -f | -| **列出容器** | docker-compose ps | docker compose ps | -| **停止不删除容器** | docker-compose stop | docker compose stop | -| **启动已停止的容器** | docker-compose start | docker compose start | -| **重启服务** | docker-compose restart | docker compose restart | -| **构建镜像** | docker-compose build | docker compose build | - -```yaml -name: cloud-services -services: - mysql: - container_name: mysql_master - image: mysql:8.0.33 - ports: - - "3306:3306" - environment: - - MYSQL_ROOT_PASSWORD=123456 - - TZ=Asia/Shanghai - volumes: - # - ~/docker/docker_data/mysql/mysql_master/etc/my.cnf:/etc/my.cnf # 如果需要创建配置文件 - - ~/docker/docker_data/mysql/mysql_master/etc/mysql:/etc/mysql/conf.d - - ~/docker/docker_data/mysql/mysql_master/data:/var/lib/mysql - - ~/docker/docker_data/mysql/mysql_master/backup:/backup - command: - - "--log-bin=mysql-bin" - - "--server-id=1" - - "--collation-server=utf8mb4_unicode_ci" - - "--character-set-server=utf8mb4" - - "--lower-case-table-names=1" - restart: always - privileged: true - networks: - - cloud - - redis: - container_name: redis_master - image: redis:7.0.10 - ports: - - "6379:6379" - volumes: - # - ~/docker/docker_data/redis_master/redis.conf:/etc/redis/redis.conf # 需要创建配置文件 - - ~/docker/docker_data/redis_master:/etc/redis # 之后要配置文件可以直接在这里创建 redis.conf - - ~/docker/docker_data/redis_master/data:/data - command: - - "--appendonly yes" - - "--daemonize no" - - "--requirepass 123456" - - "--tcp-keepalive 300" - restart: always - networks: - - cloud - - minio: - image: minio/minio - container_name: minio_master - ports: - - "9000:9000" - - "9090:9090" - volumes: - - ~/docker/docker_data/minio/data:/data - environment: - - MINIO_ROOT_USER=bunny - - MINIO_ROOT_PASSWORD=02120212 - command: "server /data --console-address :9090" - restart: always - networks: - - cloud - - mongodb: - image: mongo:latest - container_name: mongodb - restart: always - privileged: true - ports: - - "27017:27017" - volumes: - - ~/docker/docker_data/mongo/data:/data/db - - ~/docker/docker_data/mongo/conf:/data/configdb - - ~/docker/docker_data/mongo/logs:/data/log - command: "mongod --config /data/configdb/mongod.conf" - networks: - - cloud - - rabbitmq: - image: rabbitmq:management - container_name: rabbitmq - restart: unless-stopped - ports: - - "5672:5672" - - "15672:15672" - volumes: - - ~/docker/docker_data/rabbitmq/data:/var/lib/rabbitmq - - ~/docker/docker_data/rabbitmq/conf:/etc/rabbitmq - - ~/docker/docker_data/rabbitmq/log:/var/log/rabbitmq - environment: - - RABBITMQ_DEFAULT_USER=admin - - RABBITMQ_DEFAULT_PASS=admin - - RABBITMQ_DEFAULT_VHOST=/ - networks: - - cloud - - nacos: - image: nacos/nacos-server:v2.4.3 - container_name: nacos - ports: - - "8848:8848" - - "9848:9848" - environment: - - MODE=standalone - restart: always - networks: - - cloud - - sentinel: - image: bladex/sentinel-dashboard:1.8.8 - container_name: sentinel - ports: - - "8858:8858" - privileged: true - restart: always - networks: - - cloud - - seata-server: - image: apache/seata-server:2.3.0.jdk21 - container_name: seata-server - ports: - - "8091:8091" - restart: always - networks: - - cloud - -networks: # 定义网络 - cloud: # 定义名为 auth 的网络 - name: cloud # 网络名称为 auth - driver: bridge # 使用 bridge 驱动(默认) -``` +# 微服务文档 ## 注册中心 @@ -255,24 +18,25 @@ public class DiscoveryTest { @Test void discoveryClientTest() { + // 使用Spring Cloud标准DiscoveryClient for (String service : discoveryClient.getServices()) { - System.out.println(service); + System.out.println("服务名称: " + service); for (ServiceInstance instance : discoveryClient.getInstances(service)) { - System.out.println("IP地址:" + instance.getHost()); - System.out.println("端口号" + instance.getPort()); + System.out.println("实例IP地址: " + instance.getHost()); + System.out.println("实例端口号: " + instance.getPort()); } } System.out.println("----------------------------------------------"); - // 两个方式一样,DiscoveryClient 是 Spring自带的 NacosDiscoveryClient是 Nacos + // 使用Nacos专用DiscoveryClient for (String service : nacosDiscoveryClient.getServices()) { - System.out.println(service); + System.out.println("服务名称: " + service); for (ServiceInstance instance : nacosDiscoveryClient.getInstances(service)) { - System.out.println("IP地址:" + instance.getHost()); - System.out.println("端口号" + instance.getPort()); + System.out.println("实例IP地址: " + instance.getHost()); + System.out.println("实例端口号: " + instance.getPort()); } } } @@ -281,11 +45,11 @@ public class DiscoveryTest { ### 远程调用 -订单模块调用远程商品模块,使用了nacos,可以使用`RestTemplate`,其中`RestTemplate`是线程安全的,只要注册一次全局都是可以使用。 +订单模块调用远程商品模块,使用Nacos作为注册中心,可以使用`RestTemplate`进行远程调用。`RestTemplate`是线程安全的,只需注册一次即可全局使用。 -**RestTemplate源码** +**RestTemplate线程安全说明** -继承了`InterceptingHttpAccessor`,在`InterceptingHttpAccessor`中,使用了单例模式。 +`RestTemplate`继承了`InterceptingHttpAccessor`,其中使用了单例模式保证线程安全: ```java public ClientHttpRequestFactory getRequestFactory() { @@ -296,7 +60,6 @@ public ClientHttpRequestFactory getRequestFactory() { factory = new InterceptingClientHttpRequestFactory(super.getRequestFactory(), interceptors); this.interceptingRequestFactory = factory; } - return factory; } else { return super.getRequestFactory(); @@ -306,9 +69,9 @@ public ClientHttpRequestFactory getRequestFactory() { #### 实现远程调用 -##### 普通方式调用 +##### 基础调用方式 -注册`RestTemplate` +1. 注册`RestTemplate` Bean: ```java @Bean @@ -317,26 +80,27 @@ public RestTemplate restTemplate() { } ``` -如果我们的服务启动了多个,在下面代码中即使一个服务宕机也可以做到远程调用。 +2. 实现远程调用: ```java private Product getProductFromRemote(Long productId) { - // 获取商品服务所有及其的 IP+port + // 获取商品服务所有实例 List instances = discoveryClient.getInstances("service-product"); + if (instances.isEmpty()) { + throw new RuntimeException("未找到可用的商品服务实例"); + } + ServiceInstance instance = instances.get(0); - - // 远程URL String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/api/product/" + productId; - // 2. 远程发送请求 - log.info("远程调用:{}", url); + log.info("远程调用商品服务: {}", url); return restTemplate.getForObject(url, Product.class); } ``` ##### 负载均衡调用 -注册`RestTemplate` +1. 注册`RestTemplate` Bean: ```java @Bean @@ -345,39 +109,32 @@ public RestTemplate restTemplate() { } ``` -使用负载均衡`LoadBalancerClient`,通过负载均衡算法动态调用远程服务。 +2. 使用`LoadBalancerClient`实现负载均衡: ```java /** - * 远程调用商品模块 --- 负载均衡 + * 使用负载均衡调用远程商品服务 * - * @param productId 商品id - * @return 商品对象 + * @param productId 商品ID + * @return 商品信息 */ private Product getProductFromRemoteWithLoadBalancer(Long productId) { - // 1. 获取商品服务所有及其的 IP+port ServiceInstance instance = loadBalancerClient.choose("service-product"); - - // 远程URL String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/api/product/" + productId; - // 2. 远程发送请求 - log.info("负载均衡远程调用:{}", url); + log.info("负载均衡远程调用商品服务: {}", url); return restTemplate.getForObject(url, Product.class); } ``` -##### 负载均衡注解调用 +##### 注解式负载均衡调用 > [!TIP] -> -> 如果远程注册中心宕机是否可以调用? -> -> 调用过:远程调用不在依赖注册中心,可以通过。 -> -> 没调用过:第一次发起远程调用;不能通过。 +> 关于注册中心宕机的影响: +> - 已调用过的服务:可以继续调用,因为客户端有缓存 +> - 未调用过的服务:首次调用会失败,因为需要从注册中心获取服务列表 -在`RestTemplate`上加上`@LoadBalanced`注解使用负载均衡。 +1. 注册带负载均衡的`RestTemplate`: ```java @Bean @@ -387,49 +144,45 @@ public RestTemplate restTemplate() { } ``` -在实际的调用中并不需要再显式调用,将URL替换成服务名称即可。 +2. 直接使用服务名进行调用: ```java /** - * 远程调用商品模块 --- 负载均衡注解调用 + * 使用注解式负载均衡调用远程商品服务 * - * @param productId 商品id - * @return 商品对象 + * @param productId 商品ID + * @return 商品信息 */ private Product getProductFromRemoteWithLoadBalancerAnnotation(Long productId) { - // 远程URL,实现动态替换 String url = "http://service-product/api/product/" + productId; - - // 远程发送请求 - log.info("负载均衡注解调用:{}", url); + log.info("负载均衡注解调用商品服务: {}", url); return restTemplate.getForObject(url, Product.class); } ``` -### 远程配置读取 +### 远程配置管理 -#### 1、引入依赖 +#### 基础配置 + +1. 添加依赖: ```xml com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery + spring-cloud-starter-alibaba-nacos-config ``` -#### 2、在nacos中配置 +2. 在Nacos中配置: -![image-20250526152842107](./images/image-20250526152842107.png) - -![image-20250526152904745](./images/image-20250526152904745.png) - -```yml +配置内容示例: +```yaml order: timeout: 30min auto-confirm: true ``` -#### 3、创建接口访问 +3. 创建配置读取接口: ```java @RestController @@ -437,8 +190,6 @@ order: @RequiredArgsConstructor public class OrderController { - private final OrderService orderService; - @Value("${order.timeout}") private String timeout; @@ -448,38 +199,12 @@ public class OrderController { @Operation(summary = "读取配置") @GetMapping("config") public String config() { - return "timeout:" + timeout + "\nautoConfirm:" + autoConfirm; + return "timeout: " + timeout + "\nautoConfirm: " + autoConfirm; } } ``` -#### 4、SpringBoot中配置 - -> [!CAUTION] -> -> 需要注意的是,不要在`server-addr`地址中写`${nacos.server-addr}`,否则无法访问正确的地址。 - -> [!NOTE] -> -> 如果某个项目模块暂时不需要动态配置,但是引入了,可以在配置中加上,导入检查。 -> -> ```yaml -> cloud: -> nacos: -> server-addr: 192.168.95.135:8848 -> config: -> import-check: -> enabled: false -> ``` -> -> 如果某个配置是可选也可以在前面加上`ptional:`。 -> -> ```yaml -> spring: -> config: -> import: -> - optional:nacos:service-order.yml -> ``` +4. 应用配置: ```yaml server: @@ -500,9 +225,14 @@ spring: enabled: false ``` -#### 5、动态刷新读取 +> [!CAUTION] +> 注意事项: +> - 不要在`server-addr`中使用变量引用如`${nacos.server-addr}`,这可能导致连接失败 +> - 对于不需要动态配置的模块,可以禁用配置检查 -如果需要动态刷新需要在控制器或者是启动类上加上`@RefreshScope` +#### 动态刷新配置 + +1. 添加`@RefreshScope`注解: ```java @SpringBootApplication @@ -515,29 +245,26 @@ public class ProductServiceApplication { } ``` -#### 6、批量配置刷新读取 +#### 批量配置绑定 > [!TIP] -> -> 配置批量绑定无需 @RefreshScope 实现动态刷新。 -> -> 中划线写法会自动映射为小驼峰。 +> 使用`@ConfigurationProperties`批量绑定配置: +> - 无需`@RefreshScope`即可实现动态刷新 +> - 支持中划线命名自动转为驼峰命名 + +1. 创建配置类: ```java @Configuration -// 配置批量绑定无需 @RefreshScope 实现动态刷新 @ConfigurationProperties(prefix = "order") public class OrderProperties { - private String timeout; - - // 中划线写法会自动映射为小驼峰 private String autoConfirm; - + // getters and setters } ``` -测试读取内容 +2. 使用配置: ```java @RestController @@ -545,15 +272,92 @@ public class OrderProperties { @RequiredArgsConstructor public class OrderController { - private final OrderService orderService; private final OrderProperties orderProperties; @Operation(summary = "读取配置") @GetMapping("config") public String config() { - String timeout = orderProperties.getTimeout(); - String autoConfirm = orderProperties.getAutoConfirm(); - return "timeout:" + timeout + "\nautoConfirm:" + autoConfirm; + return "timeout: " + orderProperties.getTimeout() + + "\nautoConfirm: " + orderProperties.getAutoConfirm(); } } ``` + +#### 高级配置管理 + +1. 多环境配置: + +```yaml +spring: + profiles: + active: @profileActive@ + config: + import: + - nacos:service-order-${spring.profiles.active}.yml +``` + +2. 共享配置: + +```yaml +spring: + config: + import: + - nacos:common-config.yml + - nacos:service-order.yml +``` + +3. 命名空间和分组: + +```yaml +cloud: + nacos: + config: + namespace: dev + group: DEFAULT_GROUP +``` + +4. 配置优先级: + - 应用名-profile.yml (最高优先级) + - 应用名.yml + - 扩展配置 + - 共享配置 (最低优先级) + +### 配置监听 + +![f69073a0-a94a-437a-b555-1abe9914556f](./images/f69073a0-a94a-437a-b555-1abe9914556f.png) + +#### 实现配置监听 + +1. 项目启动时注册监听器: + +```java +@SpringBootApplication +@EnableDiscoveryClient +public class OrderServiceApplication { + public static void main(String[] args) { + SpringApplication.run(OrderServiceApplication.class, args); + } + + @Bean + public ApplicationRunner runner(NacosConfigManager nacosConfigManager) { + return args -> { + ConfigService configService = nacosConfigManager.getConfigService(); + configService.addListener("service-order.yml", "DEFAULT_GROUP", new Listener() { + @Override + public Executor getExecutor() { + return Executors.newFixedThreadPool(10); + } + + @Override + public void receiveConfigInfo(String configInfo) { + System.out.println("配置变更内容: " + configInfo); + // 实现配置变更后的处理逻辑 + System.out.println("发送配置变更通知邮件..."); + } + }); + System.out.println("订单服务启动完成,配置监听已注册"); + }; + } +} +``` + diff --git a/cloud-demo/images/f69073a0-a94a-437a-b555-1abe9914556f.png b/cloud-demo/images/f69073a0-a94a-437a-b555-1abe9914556f.png new file mode 100644 index 0000000000000000000000000000000000000000..453c7f4308df22c9c1c9f2cdd8ccfcd5f1f2672d GIT binary patch literal 56785 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

{a6~vJINk>D8&~ly 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μYp8}IB|0iBX=($gh(V)! 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 P@b8MY-i7y?_X7V5n%tyD literal 0 HcmV?d00001 diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/OrderServiceApplication.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/OrderServiceApplication.java index 8d2d02e..1b74aba 100644 --- a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/OrderServiceApplication.java +++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/OrderServiceApplication.java @@ -1,9 +1,17 @@ package cn.bunny.service; +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.nacos.api.config.ConfigService; +import com.alibaba.nacos.api.config.listener.Listener; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; @SpringBootApplication @EnableDiscoveryClient @@ -12,4 +20,25 @@ public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } + + @Bean + public ApplicationRunner runner(NacosConfigManager nacosConfigManager) { + return args -> { + ConfigService configService = nacosConfigManager.getConfigService(); + configService.addListener("service-order.yml", "DEFAULT_GROUP", new Listener() { + @Override + public Executor getExecutor() { + return Executors.newFixedThreadPool(10); + } + + @Override + public void receiveConfigInfo(String configInfo) { + System.out.println("监听配置信息:" + configInfo); + System.out.println("发送邮件..."); + } + }); + + System.out.println("Order Service Is Running..."); + }; + } } diff --git a/cloud-demo/环境搭建.md b/cloud-demo/环境搭建.md new file mode 100644 index 0000000..12454eb --- /dev/null +++ b/cloud-demo/环境搭建.md @@ -0,0 +1,237 @@ +## 环境搭建 + +### Docker镜像源设置 + +```bash +# 创建目录 +sudo mkdir -p /etc/docker +# 写入配置文件 +sudo tee /etc/docker/daemon.json <<-'EOF' +{ + "registry-mirrors": [ + "https://docker-0.unsee.tech", + "https://docker-cf.registry.cyou", + "https://docker.1panel.live" + ] +} +EOF + +# 重启docker服务 +sudo systemctl daemon-reload && sudo systemctl restart docker +``` + +使用docker-compose有的时候会因为版本不同,但是配置文件主要内容就是这些。需要注意版本问题 + +### 配置相关 + +#### MySQL配置问题 + +| **特性** | `**my.cnf**` | `**conf.d**` **目录** | +| ------------ | :--------------------------- | :------------------------: | +| **文件类型** | 单个文件 | 目录,包含多个 `.cnf` 文件 | +| **配置方式** | 集中式配置 | 分布式配置 | +| **优先级** | 高(覆盖 `conf.d` 中的配置) | 低(被 `my.cnf` 覆盖) | +| **适用场景** | 全局配置,核心配置 | 模块化配置,便于扩展和维护 | + +#### MongoDB配置 + +```bash +sudo mkdir -p ~/docker/docker_data/mongo/conf +sudo mkdir -p ~/docker/docker_data/mongo/logs +sudo chmod 777 ~/docker/docker_data/mongo/logs +sudo chmod 777 ~/docker/docker_data/mongo/conf + +cd ~/docker/docker_data/mongo/logs +sudo touch mongod.log +sudo chmod 755 mongod.log + +cd ~/docker/docker_data/mongo/conf +sudo vim mongod.conf + +cd ~ +``` + +##### 配置文件 + +```bash +# 数据库文件存储位置 +dbpath = /data/db +# log文件存储位置 +logpath = /data/log/mongod.log +# 使用追加的方式写日志 +logappend = true +# 是否以守护进程方式运行 +# fork = true +# 全部ip可以访问 +bind_ip = 0.0.0.0 +# 端口号 +port = 27017 +# 是否启用认证 +auth = true +# 设置oplog的大小(MB) +oplogSize=2048 +``` + +##### 设置账户密码 + +```shell +#进入容器 +docker exec -it mongodb /bin/bash + +#进入mongodb shell +mongosh --port 27017 + +#切换到admin库 +use admin + +#创建账号/密码 +db.createUser({ user: 'admin', pwd: '02120212', roles: [ { role: "root", db: "admin" } ] }); +# db.createUser({ user: 'admin', pwd: '123456', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); +``` + +### docker-compose.yml + +如果休要所有的微服务环境,可以直接复制下面的内容,看清楚目录是否和自己需要的一样。 + +| 功能 | 旧版 (docker-compose) | 新版 (docker compose) | +| -------------------- | ----------------------- | ----------------------- | +| **启动服务** | docker-compose up -d | docker compose up -d | +| **停止服务** | docker-compose down | docker compose down | +| **查看日志** | docker-compose logs -f | docker compose logs -f | +| **列出容器** | docker-compose ps | docker compose ps | +| **停止不删除容器** | docker-compose stop | docker compose stop | +| **启动已停止的容器** | docker-compose start | docker compose start | +| **重启服务** | docker-compose restart | docker compose restart | +| **构建镜像** | docker-compose build | docker compose build | + +```yaml +name: cloud-services +services: + mysql: + container_name: mysql_master + image: mysql:8.0.33 + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=123456 + - TZ=Asia/Shanghai + volumes: + # - ~/docker/docker_data/mysql/mysql_master/etc/my.cnf:/etc/my.cnf # 如果需要创建配置文件 + - ~/docker/docker_data/mysql/mysql_master/etc/mysql:/etc/mysql/conf.d + - ~/docker/docker_data/mysql/mysql_master/data:/var/lib/mysql + - ~/docker/docker_data/mysql/mysql_master/backup:/backup + command: + - "--log-bin=mysql-bin" + - "--server-id=1" + - "--collation-server=utf8mb4_unicode_ci" + - "--character-set-server=utf8mb4" + - "--lower-case-table-names=1" + restart: always + privileged: true + networks: + - cloud + + redis: + container_name: redis_master + image: redis:7.0.10 + ports: + - "6379:6379" + volumes: + # - ~/docker/docker_data/redis_master/redis.conf:/etc/redis/redis.conf # 需要创建配置文件 + - ~/docker/docker_data/redis_master:/etc/redis # 之后要配置文件可以直接在这里创建 redis.conf + - ~/docker/docker_data/redis_master/data:/data + command: + - "--appendonly yes" + - "--daemonize no" + - "--requirepass 123456" + - "--tcp-keepalive 300" + restart: always + networks: + - cloud + + minio: + image: minio/minio + container_name: minio_master + ports: + - "9000:9000" + - "9090:9090" + volumes: + - ~/docker/docker_data/minio/data:/data + environment: + - MINIO_ROOT_USER=bunny + - MINIO_ROOT_PASSWORD=02120212 + command: "server /data --console-address :9090" + restart: always + networks: + - cloud + + mongodb: + image: mongo:latest + container_name: mongodb + restart: always + privileged: true + ports: + - "27017:27017" + volumes: + - ~/docker/docker_data/mongo/data:/data/db + - ~/docker/docker_data/mongo/conf:/data/configdb + - ~/docker/docker_data/mongo/logs:/data/log + command: "mongod --config /data/configdb/mongod.conf" + networks: + - cloud + + rabbitmq: + image: rabbitmq:management + container_name: rabbitmq + restart: unless-stopped + ports: + - "5672:5672" + - "15672:15672" + volumes: + - ~/docker/docker_data/rabbitmq/data:/var/lib/rabbitmq + - ~/docker/docker_data/rabbitmq/conf:/etc/rabbitmq + - ~/docker/docker_data/rabbitmq/log:/var/log/rabbitmq + environment: + - RABBITMQ_DEFAULT_USER=admin + - RABBITMQ_DEFAULT_PASS=admin + - RABBITMQ_DEFAULT_VHOST=/ + networks: + - cloud + + nacos: + image: nacos/nacos-server:v2.4.3 + container_name: nacos + ports: + - "8848:8848" + - "9848:9848" + environment: + - MODE=standalone + restart: always + networks: + - cloud + + sentinel: + image: bladex/sentinel-dashboard:1.8.8 + container_name: sentinel + ports: + - "8858:8858" + privileged: true + restart: always + networks: + - cloud + + seata-server: + image: apache/seata-server:2.3.0.jdk21 + container_name: seata-server + ports: + - "8091:8091" + restart: always + networks: + - cloud + +networks: # 定义网络 + cloud: # 定义名为 auth 的网络 + name: cloud # 网络名称为 auth + driver: bridge # 使用 bridge 驱动(默认) +``` +