当前位置: 首页 > article >正文

Docker Compose编排微服务

Docker Compose编排微服务引言Docker Compose是Docker官方提供的容器编排工具用于定义和运行多容器Docker应用。通过Compose可以使用YAML文件定义服务、网络、数据卷等资源然后通过简单的命令启动和停止整个应用。Docker Compose特别适合开发、测试和演示环境也是微服务架构中进行本地开发和服务编排的重要工具。本文将详细介绍Docker Compose的使用方法、配置技巧以及在微服务架构中的最佳实践。一、Docker Compose基础1.1 安装和基本概念Docker Compose通过docker-compose.yml文件定义应用的服务拓扑。Compose会自动处理服务间的依赖关系、端口映射和网络配置。# docker-compose.yml version: 3.8 services: web: build: . ports: - 8080:8080 depends_on: - db - redis environment: - SPRING_PROFILES_ACTIVEproduction - DB_HOSTdb - REDIS_HOSTredis networks: - backend db: image: postgres:15-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data networks: - backend redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: - redis_data:/data networks: - backend volumes: postgres_data: redis_data: networks: backend: driver: bridge1.2 常用命令# 启动所有服务 docker-compose up -d # 构建镜像并启动 docker-compose up --build # 启动指定服务 docker-compose up -d web # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f web # 停止服务 docker-compose down # 停止并删除卷 docker-compose down -v # 重启服务 docker-compose restart web # 执行命令 docker-compose exec web java -jar app.jar # 扩容服务 docker-compose up -d --scale web3二、微服务编排实战2.1 多服务架构示例假设我们有一个订单微服务系统包含以下服务API网关服务、订单服务、产品服务、用户服务、MySQL数据库、Redis缓存。version: 3.8 services: # API网关 api-gateway: build: context: ./api-gateway dockerfile: Dockerfile container_name: api-gateway ports: - 8080:8080 environment: - SPRING_CLOUD_GATEWAY_ROUTES[0].urihttp://order-service:8081 - SPRING_CLOUD_GATEWAY_ROUTES[0].predicatesPath/orders/** - SPRING_CLOUD_GATEWAY_ROUTES[1].urihttp://product-service:8082 - SPRING_CLOUD_GATEWAY_ROUTES[1].predicatesPath/products/** - SPRING_CLOUD_GATEWAY_ROUTES[2].urihttp://user-service:8083 - SPRING_CLOUD_GATEWAY_ROUTES[2].predicatesPath/users/** depends_on: order-service: condition: service_healthy product-service: condition: service_started user-service: condition: service_started networks: - microservices restart: unless-stopped # 订单服务 order-service: build: context: ./order-service dockerfile: Dockerfile container_name: order-service expose: - 8081 environment: - SERVER_PORT8081 - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/orders?useSSLfalseserverTimezoneUTC - SPRING_DATASOURCE_USERNAMEroot - SPRING_DATASOURCE_PASSWORDrootpassword - SPRING_REDIS_HOSTredis - SPRING_REDIS_PORT6379 depends_on: mysql: condition: service_healthy redis: condition: service_started healthcheck: test: [CMD, curl, -f, http://localhost:8081/actuator/health] interval: 30s timeout: 10s retries: 3 start_period: 60s networks: - microservices restart: unless-stopped # 产品服务 product-service: build: context: ./product-service dockerfile: Dockerfile container_name: product-service expose: - 8082 environment: - SERVER_PORT8082 - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/products?useSSLfalseserverTimezoneUTC - SPRING_DATASOURCE_USERNAMEroot - SPRING_DATASOURCE_PASSWORDrootpassword - SPRING_REDIS_HOSTredis - SPRING_REDIS_PORT6379 depends_on: mysql: condition: service_healthy redis: condition: service_started networks: - microservices restart: unless-stopped # 用户服务 user-service: build: context: ./user-service dockerfile: Dockerfile container_name: user-service expose: - 8083 environment: - SERVER_PORT8083 - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/users?useSSLfalseserverTimezoneUTC - SPRING_DATASOURCE_USERNAMEroot - SPRING_DATASOURCE_PASSWORDrootpassword depends_on: mysql: condition: service_healthy networks: - microservices restart: unless-stopped # MySQL数据库 mysql: image: mysql:8.0 container_name: mysql environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: orders ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql - ./init-scripts:/docker-entrypoint-initdb.d command: --default-authentication-pluginmysql_native_password healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 5 networks: - microservices restart: unless-stopped # Redis缓存 redis: image: redis:7-alpine container_name: redis ports: - 6379:6379 volumes: - redis_data:/data command: redis-server --appendonly yes --requirepass redispassword networks: - microservices restart: unless-stopped volumes: mysql_data: redis_data: networks: microservices: driver: bridge三、配置管理3.1 环境变量文件创建.env文件管理环境变量避免在docker-compose.yml中硬编码敏感信息。# .env文件 COMPOSE_PROJECT_NAMEmicroservices MYSQL_ROOT_PASSWORDrootpassword MYSQL_DATABASEorders REDIS_PASSWORDredispassword API_GATEWAY_PORT8080# docker-compose.yml services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE}3.2 多环境配置# docker-compose.yml services: app: build: context: . args: JAR_FILE: app.jar environment: - SPRING_PROFILES_ACTIVE${PROFILE:-development}# 使用生产环境配置 PROFILEproduction docker-compose up -d # 使用自定义变量文件 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d3.3 配置继承# docker-compose.base.yml - 基础配置 version: 3.8 services: app: build: . networks: - common networks: common: name: common-network external: true # docker-compose.yml - 继承并扩展 version: 3.8 services: app: extends: file: docker-compose.base.yml service: app ports: - 8080:8080四、健康检查和依赖管理4.1 服务依赖配置depends_on确保服务启动顺序但不能保证服务就绪。services: web: depends_on: db: condition: service_healthy redis: condition: service_started4.2 健康检查配置services: app: healthcheck: test: [CMD, curl, -f, http://localhost:8080/actuator/health] interval: 30s timeout: 10s retries: 3 start_period: 60s disable: false mysql: healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 5 redis: healthcheck: test: [CMD, redis-cli, --raw, incr, ping] interval: 10s timeout: 5s retries: 3五、网络配置5.1 网络隔离为不同环境或不同服务组创建独立的网络。services: frontend: networks: - frontend-network backend: networks: - backend-network - database-network database: networks: - database-network networks: frontend-network: driver: bridge backend-network: driver: bridge database-network: driver: bridge internal: true # 禁止外部访问5.2 DNS配置services: app: dns: - 8.8.8.8 - 8.8.4.4 dns_search: - mydomain.local六、资源限制6.1 内存和CPU限制services: app: deploy: resources: limits: cpus: 0.5 memory: 512M reservations: cpus: 0.25 memory: 256M6.2 重启策略services: app: restart: unless-stopped # 总是重启除非手动停止 # restart: always # 总是重启 # restart: on-failure # 仅在失败时重启 # restart: no # 不自动重启七、日志管理7.1 日志配置services: app: logging: driver: json-file options: max-size: 10m max-file: 3 labels: production compress: true7.2 集中式日志收集services: app: logging: driver: syslog options: syslog-address: tcp://logstash:5000 tag: app logstash: image: logstash:7.17 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf八、持续集成实践8.1 完整的开发环境version: 3.8 services: # 微服务 order-service: build: ./order-service ports: - 8081:8081 environment: - SPRING_PROFILES_ACTIVEdevelopment depends_on: mysql: condition: service_healthy redis: condition: service_started volumes: - ./order-service:/app - maven-cache:/root/.m2 command: mvn spring-boot:run # 数据存储 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: orders ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql - ./order-service/src/main/resources/db/migration:/docker-entrypoint-initdb.d healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - 6379:6379 # 开发工具 prometheus: image: prometheus:latest ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana:latest ports: - 3000:3000 environment: - GF_SECURITY_ADMIN_PASSWORDadmin volumes: - grafana_data:/var/lib/grafana volumes: mysql_data: redis_data: maven-cache: grafana_data:九、最佳实践9.1 镜像优化# 多阶段构建优化 FROM maven:3.8-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --frombuilder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]9.2 安全最佳实践services: app: security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp user: 1000:10009.3 Compose文件组织project/ ├── docker-compose.yml # 主配置 ├── docker-compose.dev.yml # 开发环境覆盖 ├── docker-compose.prod.yml # 生产环境覆盖 ├── docker-compose.test.yml # 测试环境覆盖 ├── .env # 环境变量 ├── .env.prod # 生产环境变量 ├── services/ │ ├── service-a/ │ │ ├── Dockerfile │ │ └── src/ │ └── service-b/ │ ├── Dockerfile │ └── src/ └── config/ ├── prometheus.yml └── grafana/总结Docker Compose是管理和编排微服务的强大工具特别适合开发和测试环境。通过合理的配置可以快速搭建完整的微服务开发环境实现服务的快速启动和停止。掌握Docker Compose的配置技巧和最佳实践能够显著提升开发效率。在实际项目中建议结合环境变量和配置继承来管理不同环境的配置使用健康检查确保服务依赖的正确性并通过日志和资源限制来保证系统的可观测性和稳定性。

相关文章:

Docker Compose编排微服务

Docker Compose编排微服务 引言 Docker Compose是Docker官方提供的容器编排工具,用于定义和运行多容器Docker应用。通过Compose,可以使用YAML文件定义服务、网络、数据卷等资源,然后通过简单的命令启动和停止整个应用。Docker Compose特别适合…...

服务网格Istio实战

服务网格Istio实战 引言 服务网格(Service Mesh)作为微服务架构的基础设施层,提供了对服务间通信的精细控制能力。Istio是目前最流行的开源服务网格解决方案,它通过Sidecar代理拦截所有网络通信,提供流量管理、安全、可…...

Arm Neoverse CMN-700多芯片架构与一致性哈希解析

1. Arm Neoverse CMN-700多芯片架构解析在现代高性能计算领域,多芯片系统架构已成为突破单芯片性能瓶颈的关键技术路径。Arm Neoverse CMN-700作为第二代一致性网状网络控制器,其设计哲学体现在三个维度:首先是通过模块化设计实现计算单元的可…...

Oracle数据库触发器概述

Oracle数据库触发器概述触发器介绍数据库触发器是一个 已编译的存储程序单元 ,使用 PL/SQL 或 Java 编写。 触发器是模式对象,类似于子程序;但其调用方法不同。 子程序由用户、应用程序、或触发器显式运行。而触发器是在触发的事件发生时由 数…...

KMS智能激活终极指南:如何一键永久激活Windows和Office

KMS智能激活终极指南:如何一键永久激活Windows和Office 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?每次重装系统后都要重新激活Office&…...

数据质量保证:确保数据准确性和可靠性

数据质量保证:确保数据准确性和可靠性 一、数据质量保证概述 1.1 数据质量保证的定义 数据质量保证是指通过一系列技术和流程,确保数据的准确性、完整性、一致性和及时性的过程。它涉及数据采集、存储、处理和使用的各个环节,确保数据符合业务…...

成本优化策略:降低云资源支出

成本优化策略:降低云资源支出 一、成本优化策略概述 1.1 成本优化策略的定义 成本优化策略是指通过各种技术和管理手段,降低云资源支出的策略和方法。它包括资源优化、成本监控、预算管理和采购策略等方面。 1.2 成本优化策略的价值 成本降低&#xff1a…...

云原生安全工具:保护云原生环境

云原生安全工具:保护云原生环境 一、云原生安全工具概述 1.1 云原生安全工具的定义 云原生安全工具是指专为云原生环境设计的安全工具和解决方案。它们用于保护容器、Kubernetes集群、微服务和Serverless应用的安全。 1.2 云原生安全工具的价值 安全防护&#xff1a…...

CI/CD安全最佳实践:保护软件交付流程

CI/CD安全最佳实践:保护软件交付流程 一、CI/CD安全最佳实践概述 1.1 CI/CD安全最佳实践的定义 CI/CD安全最佳实践是指在持续集成和持续部署流程中实施的安全策略和措施。它涵盖代码提交、构建、测试、部署等各个阶段的安全防护。 1.2 CI/CD安全最佳实践的价值 安全…...

Tea印相失效诊断清单:从--v 6.2到--v 6.6,6个版本兼容性断点及降级回滚方案(含JSON config快照备份包)

更多请点击: https://intelliparadigm.com 第一章:Tea印相失效诊断清单:从--v 6.2到--v 6.6,6个版本兼容性断点及降级回滚方案(含JSON config快照备份包) Tea印相(TeaYinXiang)在 v…...

基于CLUE与加速度计的鸡蛋坠落实验:从传感器数据到缓冲设计优化

1. 项目概述:用传感器数据为物理实验“上保险” 鸡蛋坠落实验,一个听起来就充满童年乐趣和“悲剧”风险的经典物理项目。它的核心挑战在于,如何设计一个缓冲装置,让一枚脆弱的生鸡蛋从高处坠落而不破裂。传统上,我们依…...

OCT-X算法:早期胃癌AI检测的技术突破与应用

1. OCT-X算法:早期胃癌AI检测的技术突破在医疗影像分析领域,胃癌早期检测一直面临着巨大挑战。传统内窥镜检查依赖医生经验判断,存在主观性强、漏诊率高等问题。我们团队开发的OCT-X(One Class Twin Cross Learning)算…...

从二维到三维:DIY LED视频立方体构建全攻略

1. 项目概述:从平面到立体的视觉革命几年前,当我第一次成功点亮一整面由32x32 RGB LED面板组成的视频墙时,那种由1024个像素点共同编织出的动态画面所带来的震撼,至今记忆犹新。但作为一个热衷于将技术推向边界的创作者&#xff0…...

基于React的记忆管理UI组件库:openclaw-memory-ui实战指南

1. 项目概述:一个为记忆管理而生的开源UI组件库最近在折腾一个需要处理大量结构化记忆数据的项目,比如知识库、笔记应用或者智能助手的历史对话管理。这类应用的核心痛点在于,数据本身是复杂的、多维的,但传统的列表或表格展示方式…...

Arm Neoverse CMN-700互连架构与寄存器编程详解

1. Arm Neoverse CMN-700架构概览在现代高性能计算系统中,处理器核心数量的快速增长对互连架构提出了严峻挑战。作为Arm Neoverse平台的核心组件,CMN-700一致性互连网络采用创新的Mesh拓扑结构,解决了多核处理器间的通信瓶颈问题。我在实际芯…...

开源提示词管理工具:本地化部署与AI工作流效率提升实践

1. 项目概述:一个为AI工作流设计的提示词管理利器如果你和我一样,每天都在和ChatGPT、Claude、Midjourney这些AI模型打交道,那你一定有过这样的烦恼:昨天精心调试好的、能稳定输出高质量代码的提示词,今天想用的时候&a…...

面试鸭:程序员面试备战工作台,构建结构化知识图谱与智能复习系统

1. 项目概述:一个面向求职者的“面试鸭”最近在技术社区里,看到不少朋友在讨论一个叫“mianshiya”的开源项目。乍一看这个名字,还以为是哪个美食博主分享的菜谱。点进去才发现,这其实是一个为程序员,特别是正在准备面…...

移动端Shell集成AI助手:ShellGPTMobile部署与实战指南

1. 项目概述:当ShellGPT遇见移动端如果你是一个重度命令行用户,同时又对AI助手(比如ChatGPT)的便利性爱不释手,那么你很可能面临一个尴尬的境地:在终端里敲命令时,突然需要AI帮忙解释一段日志、…...

Cursor与Figma通过MCP协议实现AI辅助设计与开发同步

1. 项目概述:当代码编辑器与设计工具“开口说话”最近在开发者社区里,一个名为“cursor-talk-to-figma-mcp”的项目引起了我的注意。这个由开发者“hamadoun1760”开源的仓库,名字直译过来就是“Cursor与Figma对话的MCP”。乍一看&#xff0c…...

AI控制协议标准(ACPS):构建智能体与工具交互的通用语言

1. 项目概述与核心价值最近在开源社区里,一个名为“AI-Control-Protocol-Standard”的项目引起了我的注意。这个由DaibinThink发起的项目,名字听起来就很有分量——“AI控制协议标准”。乍一看,你可能觉得这又是一个关于AI模型如何被调用的技…...

Windows Terminal 预览版:从安装到深度配置,打造现代化命令行工作流

1. 项目概述:为什么我们需要一个现代化的Windows终端?如果你和我一样,在Windows上敲了十几年命令行,从古老的cmd.exe到后来的PowerShell,一个绕不开的痛点就是:这终端工具,用起来总感觉差点意思…...

Arduino驱动128x64 VFD显示屏:SPI像素回读与图形应用实战

1. 项目概述:为什么选择128x64图形VFD?如果你玩过各种OLED、LCD或者TFT屏幕,可能会觉得显示技术已经足够成熟,亮度、对比度似乎都够用。但当你第一次点亮一块真空荧光显示屏时,那种独特的、带着一丝复古科技感的蓝色辉…...

MQ-3与MiCS-5524气体传感器对比:从原理到实战的选型指南

1. 项目概述与核心价值在嵌入式开发、环境监测乃至一些创意DIY项目中,气体检测是一个常见且关键的需求。无论是为了安全预警(如天然气泄漏),还是进行环境质量评估(如VOC监测),选择一款合适的传感…...

基于Feather微控制器的智能灯光系统:颜色感应与BLE遥控实现

1. 项目概述与核心价值又到了折腾点节日氛围的时候了。往年都是买现成的彩灯串,总觉得少了点意思,今年决定自己动手,做个能“听懂”指令、甚至能“看见”颜色的智能灯光系统。这个项目的核心,就是用一块小小的微控制器&#xff0c…...

MATLAB/Simulink模型化设计驱动树莓派:从LED闪烁到快速原型开发

1. 项目概述:当MATLAB/Simulink遇见树莓派 如果你是一名算法工程师、控制工程师,或者正在学习嵌入式系统,那么“模型化设计”和“快速原型开发”这两个词对你来说一定不陌生。它们听起来很高大上,但核心目标其实很朴素&#xff1…...

构建团队技能仓库:从知识管理到可执行技能包的系统化实践

1. 项目概述:从“技能包”到高效能工具箱最近在梳理团队内部的技术资产时,我反复思考一个问题:如何让那些散落在个人电脑、项目文档和口头交流中的“隐性知识”和“高效技能”,变成一个团队可以随时取用、持续进化的公共资产&…...

Otter多模态大模型实战:从Flamingo架构到指令调优与部署优化

1. 项目概述:一个能“看懂”世界的多模态大模型最近在折腾多模态大模型(Multimodal Large Language Models, MLLMs)的朋友,应该对 Otter 这个名字不陌生。它不是一个独立的产品,而是一个开源的研究项目,全称…...

FastAPI+AI应用脚手架:模块化架构与生产级实践指南

1. 项目概述:一个为AI应用量身定制的FastAPI脚手架如果你正在寻找一个能快速启动、结构清晰且功能强大的AI应用后端框架,那么fastapi-genai-boilerplate这个项目绝对值得你花时间研究。它不是一个简单的“Hello World”示例,而是一个面向生产…...

基于RP2040的客制化宏键盘:从硬件设计到KMK固件开发全攻略

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫clawdpad,作者是kudretyilmazz。乍一看这个名字,可能有点摸不着头脑,但如果你对机械键盘、客制化输入设备或者桌面自动化感兴趣,那这个项目绝对值得你花时间…...

MedAgentBench:大语言模型在医学诊断中的动态评估与智能体构建实践

1. 项目概述:当大语言模型成为医学诊断的“实习生”最近在医学人工智能的圈子里,一个名为MedAgentBench的项目引起了我的注意。它来自斯坦福大学机器学习组,这个名字本身就自带光环。简单来说,这不是一个直接看病的AI,…...