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

别再手动一个个启动容器了!用Docker Compose编排一个Web+MySQL+Redis的完整项目(附yml文件详解)

别再手动一个个启动容器了用Docker Compose编排一个WebMySQLRedis的完整项目附yml文件详解每次部署多容器项目时最头疼的就是手动启动每个服务、配置网络、挂载数据卷。想象一下先启动MySQL容器设置root密码和存储卷再启动Redis配置持久化最后部署Web应用确保能连接到数据库和缓存。这种重复劳动不仅低效还容易出错。而Docker Compose正是解决这一痛点的利器——它允许你用一份YAML文件定义整个应用栈然后通过一条命令启动所有服务。1. 为什么需要Docker Compose在真实开发场景中几乎没有应用是单一容器能支撑的。以典型的Web项目为例核心服务应用服务器如Spring Boot、数据库MySQL、缓存Redis辅助服务消息队列RabbitMQ、搜索引擎Elasticsearch基础设施负载均衡Nginx、监控Prometheus手动管理这些容器的痛点包括启动顺序依赖数据库必须先于应用启动网络配置复杂容器间需要互通但又要隔离外部访问环境变量传递数据库连接字符串需要注入到Web容器数据持久化数据库文件、缓存数据需要挂载到宿主机Docker Compose通过声明式配置解决这些问题。下面是一个对比传统方式和Compose方式的典型流程操作步骤手动操作命令示例Compose方式创建网络docker network create app_net在yml中定义networks块启动MySQLdocker run --name mysql -e MYSQL_ROOT_PASSWORD123456...services.mysql.environment启动Redisdocker run --name redis -v redis_data:/data...services.redis.volumes启动Web应用docker run --name web --link mysql --link redis...services.web.depends_on提示Compose的depends_on只能控制启动顺序不能确保服务已就绪。对于数据库这类需要等待初始化完成的服务建议结合健康检查使用。2. 实战编写docker-compose.yml让我们构建一个Spring Boot MySQL Redis的完整项目。假设项目结构如下myapp/ ├── docker-compose.yml ├── backend/ │ ├── Dockerfile │ └── target/app.jar # Spring Boot打包结果 ├── mysql/ │ └── init.sql # 数据库初始化脚本 └── redis/ └── redis.conf # Redis自定义配置2.1 基础结构解析每个Compose文件包含三个核心部分version: 3.8 # 指定Compose语法版本 services: # 定义所有服务容器 web: build: ./backend ports: - 8080:8080 volumes: # 声明数据卷 db_data: networks: # 定义网络 app_net: driver: bridge关键版本选择建议3.x版本支持Swarm模式扩展生产环境建议使用3.8以获得最新功能不同Docker Engine版本有兼容性要求2.2 完整配置详解以下是带详细注释的yml文件version: 3.8 services: # Spring Boot应用服务 webapp: build: context: ./backend dockerfile: Dockerfile # 指定Dockerfile路径 container_name: myapp_web ports: - 8080:8080 environment: - SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/mydb - SPRING_REDIS_HOSTredis depends_on: - mysql - redis networks: - app_net restart: unless-stopped # 异常退出时自动重启 # MySQL数据库服务 mysql: image: mysql:8.0 container_name: myapp_mysql environment: - MYSQL_ROOT_PASSWORDmysecret - MYSQL_DATABASEmydb volumes: - db_data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化脚本 ports: - 3306:3306 networks: - app_net healthcheck: # 健康检查 test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 3s retries: 5 # Redis缓存服务 redis: image: redis:6 container_name: myapp_redis command: redis-server --requirepass mypassword # 设置密码 volumes: - redis_data:/data - ./redis/redis.conf:/usr/local/etc/redis/redis.conf # 挂载自定义配置 ports: - 6379:6379 networks: - app_net volumes: db_data: redis_data: networks: app_net: driver: bridge2.3 关键配置项解析服务依赖与启动顺序depends_on: - mysql - redis虽然depends_on定义了启动顺序但更好的实践是为MySQL添加健康检查在应用启动命令中添加等待脚本例如# 在Dockerfile中添加健康检查等待脚本 HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost:8080/actuator/health || exit 1数据持久化方案对比方式优点缺点适用场景匿名卷自动创建简单难以维护删除容器会丢失开发环境临时数据命名卷推荐生命周期独立于容器需要显式声明生产环境数据库存储宿主机目录绑定直接访问宿主机文件路径依赖宿主机环境配置文件、初始化脚本网络隔离策略默认创建的app_net具有以下特性所有服务通过服务名如mysql互相访问对外暴露的只有webapp服务的8080端口可通过networks定义多个网络实现更细粒度隔离3. 高效开发技巧3.1 常用操作命令启动并构建所有服务开发环境docker-compose up -d --build仅重建并启动特定服务docker-compose up -d --no-deps --build webapp查看服务日志docker-compose logs -f webapp执行数据库迁移docker-compose exec webapp ./migrate.sh3.2 性能优化配置对于生产环境建议添加以下配置services: mysql: deploy: resources: limits: cpus: 2 memory: 2G ulimits: nproc: 65535 nofile: soft: 20000 hard: 400003.3 多环境配置方案通过环境变量和多个Compose文件实现docker-compose.yml # 基础配置 docker-compose.override.yml # 开发环境配置默认加载 docker-compose.prod.yml # 生产环境配置启动时指定配置docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d4. 常见问题排查4.1 容器启动失败排查步骤查看日志docker-compose logs service_name检查配置docker-compose config进入容器docker-compose exec service_name sh验证网络docker network inspect myapp_app_net4.2 典型错误解决方案问题1MySQL连接被拒绝解决确保depends_on配合健康检查使用或在应用启动脚本中添加等待逻辑问题2端口冲突解决检查ports配置或使用docker-compose ps查看运行状态问题3卷权限问题解决在Dockerfile中正确设置用户权限例如RUN mkdir -p /var/lib/mysql chown -R mysql:mysql /var/lib/mysql问题4环境变量未生效解决使用docker-compose exec service_name env验证环境变量注意修改docker-compose.yml后需要重新运行docker-compose up -d使更改生效。对于某些配置如环境变量可能需要先执行docker-compose down再重新启动。

相关文章:

别再手动一个个启动容器了!用Docker Compose编排一个Web+MySQL+Redis的完整项目(附yml文件详解)

别再手动一个个启动容器了!用Docker Compose编排一个WebMySQLRedis的完整项目(附yml文件详解) 每次部署多容器项目时,最头疼的就是手动启动每个服务、配置网络、挂载数据卷。想象一下:先启动MySQL容器,设置…...

NUMA架构与Linux内存策略优化实践

1. NUMA架构与内存策略基础 NUMA(Non-Uniform Memory Access)架构是现代多核处理器系统中的重要设计范式。与传统的UMA(Uniform Memory Access)架构不同,NUMA系统中每个处理器核心或处理器组(称为NUMA节点&…...

VCS仿真中用好断言debug选项,让你的验证效率翻倍(附避坑指南)

VCS仿真中高效断言调试的进阶技巧与实战指南 在复杂SoC验证环境中,断言(Assertion)作为设计意图的"活文档",其调试效率直接影响项目周期。本文将从VCS仿真器的编译选项配置、断言控制文件编写技巧、波形分析策略三个维度…...

不只是hosts问题:Git clone失败背后的网络原理与安全风险(附Wireshark抓包分析)

Git Clone失败背后的网络协议全景解析:从DNS到TLS的安全实践 当你输入git clone https://github.com/example/repo.git后终端抛出"Could not resolve hostname"时,多数开发者会条件反射地修改hosts文件。但这个看似简单的报错背后&#xff0c…...

星链4SAPI中转枢纽深度技术解构:架构优势、工程实践与演进脉络

在当下的技术圈层中,围绕大模型接口调用、API密钥管理与中转网关的讨论热度居高不下。几乎每隔一段时间,就会有关于“黑盒优化”或“算力调度霸权”的新观点浮现。这背后的技术实体——星链4SAPI所代表的模型接口聚合层,正成为开发者工具链中…...

动态上下文发现:Cursor的最新思路,重新定义AI上下文管理

核心结论:当所有人都在比拼谁的上下文窗口更大时,Cursor团队反其道而行之,提出了动态上下文发现(Dynamic Context Discovery) 范式。它彻底摒弃了"把所有东西都塞进提示词"的传统做法,让AI智能体…...

【会议征稿通知 | 衢州学院主办 | IET出版 | EI 、Scopus稳定检索】第三届人工智能与电力系统国际学术会议(AIPS 2026)

第三届人工智能与电力系统国际学术会议(AIPS 2026) 2026 3rd International Conference on Artificial Intelligence and Power System 2026年5月22-24日 | 中国-浙江-衢州 大会官网:www.icaips.org 截稿时间:见官网(早投稿&am…...

Visual C++运行库终极修复指南:5分钟解决Windows软件运行错误

Visual C运行库终极修复指南:5分钟解决Windows软件运行错误 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过软件无法启动&#xff0…...

终极指南:使用115proxy-for-kodi高效实现115云盘视频电视播放

终极指南:使用115proxy-for-kodi高效实现115云盘视频电视播放 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 想要在电视上直接流畅播放115云盘中的视频内容?115pr…...

VIC水文模型深度解析:从基础内容处理到模型参数率定的全程视频教学指南

vic水文模型 VIC水文模型径流模拟 全程视频教学指导,讲解详细 从基础内容处理讲解到模型参数率定全程教学。 零基础可学。 自用模型,从零到实践,历时两周左右 全套教程 最近在折腾VIC水文模型的径流模拟,发现这玩意儿就像搭乐高—…...

避开安川MP3300通讯的那些坑:服务端/客户端模式选择、地址分配与MSG函数配置详解

安川MP3300工业通讯实战:服务端/客户端模式深度解析与高阶配置 在工业自动化系统集成中,安川MP3300控制器与上位机的稳定通讯往往是项目成败的关键分水岭。许多工程师在完成基础配置后,仍会在实际调试阶段遭遇各种"幽灵问题"——通…...

3分钟实战:用VoiceFixer拯救受损语音的完整应用手册

3分钟实战:用VoiceFixer拯救受损语音的完整应用手册 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否曾为会议录音中的杂音而苦恼?是否为老磁带转录的嘶嘶声感到无奈&…...

达芬奇剪辑效率翻倍秘籍:深入解读F9到F11(插入、覆盖、替换)的区别与实战应用场景

达芬奇剪辑效率翻倍秘籍:深入解读F9到F11(插入、覆盖、替换)的区别与实战应用场景 在专业视频剪辑领域,DaVinci Resolve凭借其强大的功能和流畅的工作流程,已成为众多剪辑师的首选工具。然而,许多中级用户在…...

不止于连线:用Logisim仿真深入理解ALU运算器背后的计算机组成原理

从逻辑门到运算器:用Logisim拆解ALU设计的底层智慧 在计算机组成原理的学习中,运算器(ALU)的设计往往是最令人着迷也最令人困惑的部分。许多学习者能够按照实验指导书完成线路连接,却对"为什么这样设计"感到迷茫——为什么加法器要…...

别再纠结选型了!CH9101与FT232R/FT230X实战对比,从引脚兼容到驱动配置的保姆级指南

CH9101与FT232R/FT230X终极选型指南:硬件兼容与驱动配置全解析 当硬件工程师面对USB转串口芯片选型时,CH9101系列与FTDI的FT232R/FT230X总是绕不开的对比选项。这两类芯片在市场上占据重要地位,但究竟该如何选择?更重要的是&#…...

Dactyl Lynx分体式人体工学键盘设计与实践

1. 项目概述:Dactyl Lynx分体式人体工学键盘作为一名长期受腕管综合征困扰的开发者,我在过去三年里尝试了市面上几乎所有号称"人体工学"的键盘,最终发现开源社区的Dactyl系列才是真正的解决方案。Dactyl Lynx是我基于原版Dactyl进行…...

为什么你的Dify知识库召回率低于62%?文档解析配置中被低估的7个语义锚点参数(附AB测试压测报告)

第一章:Dify知识库召回率失衡的根因诊断Dify知识库召回率失衡并非单一模块故障所致,而是语义理解、向量化策略与检索逻辑三者耦合失效的结果。典型表现为高相关文档未被召回(漏召),或低相关文档大量混入(误…...

【车载场景专属】Dify调试避坑手册:92%工程师忽略的3类时序错位(RT-Thread+TensorRT环境实测)

第一章:Dify车载问答调试的核心挑战与定位在车载智能座舱场景中,Dify作为低代码LLM应用开发平台,其问答能力需同时满足低延迟响应、离线可用性、车规级稳定性及多模态上下文理解等严苛要求。调试过程并非单纯调整提示词或模型参数&#xff0c…...

Hypnos-i1-8B惊艳案例:用自然语言描述→自动生成LaTeX+Python可执行代码

Hypnos-i1-8B惊艳案例:用自然语言描述→自动生成LaTeXPython可执行代码 1. 模型能力概览 Hypnos-i1-8B是一款基于量子噪声注入训练的8B参数开源大模型,专为复杂逻辑推理和数学问题求解而设计。它能够理解自然语言描述,并直接生成可执行的La…...

为什么企业智能体必须告别“对话框”:拆解 Agentic UI 与交互重构

自从 ChatGPT 确立了“对话框(Chat UI)”作为 AI 的默认交互形态后,几乎所有的企业级 AI 应用都陷入了这种路径依赖:无论是在 ERP 里查库存,还是在 OA 里提报销,系统统统弹出一个聊天窗口让员工去打字提问。…...

解锁ReFS潜能:在Windows 8.1与10中安全配置与故障规避指南

1. 认识ReFS:为什么值得冒险启用它? 第一次听说ReFS这个文件系统时,我正被NTFS频繁的磁盘错误折腾得焦头烂额。作为Windows 8.1和10内置的新一代文件系统,ReFS(弹性文件系统)就像个自带修复功能的智能管家。…...

手把手教你用Python搞定CTF中的文件逆序与LSB隐写(附emoji解密)

手把手教你用Python破解CTF中的文件逆序与LSB隐写术 第一次接触CTF比赛中的MISC题目时,很多人会被那些看似普通的文件难住。一个没有后缀名的"zip"文件,一张看似平常的PNG图片,背后可能隐藏着需要层层解密的flag。本文将带你从零开…...

老系统安全加固指南:以久草CMS V1.9为例,手把手教你修复后台文件写入与CSRF组合漏洞

老系统安全加固实战:从漏洞分析到修复的完整方案 当企业运维人员接手一个历史悠久的CMS系统时,面临的不仅是技术债务,更是一场与时间赛跑的安全保卫战。以某CMS V1.9为例,这个发布于多年前的系统至今仍在不少中小型网站服役&#…...

抖音批量下载助手完整教程:三步实现自动化视频采集

抖音批量下载助手完整教程:三步实现自动化视频采集 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动保存抖音视频而烦恼?面对心仪创作者的精彩内容,却只能一个个…...

HTTrack网站镜像工具:从入门到精通的完整使用指南

HTTrack网站镜像工具:从入门到精通的完整使用指南 【免费下载链接】httrack HTTrack Website Copier, copy websites to your computer (Official repository) 项目地址: https://gitcode.com/gh_mirrors/ht/httrack HTTrack是一款强大的网站镜像工具和离线浏…...

易语言实战:绕过‘Content-Type’陷阱,手把手教你上传图片到任意表单

易语言实战:HTTP文件上传协议深度解析与边界处理技巧 在自动化工具开发中,文件上传功能几乎是每个开发者都会遇到的常规需求。但当你用易语言实现图片上传时,是否遇到过服务器返回"Invalid Content-Type"或"Missing boundary&…...

别再花钱买插件了!用这3个免费3dMAX脚本,轻松搞定砖墙、屋顶和地板生成

3D建筑建模效率革命:3款免费脚本深度解析与实战应用 在建筑可视化与室内设计领域,时间就是竞争力。当项目周期压缩到以小时计算时,传统手动建模方式往往成为瓶颈——一面石墙可能需要调整数十次UV贴图,屋顶瓦片的排列耗费整个下午…...

企业未来需要“首席 AI Agent Harness Engineering 官”吗?

《从CIO到CAHEO:为什么2027年80%的世界500强都会设立「首席AI Agent驾驭工程官」?》 关键词 首席AI Agent驾驭工程官(CAHEO)、AI Agent治理、企业AI落地ROI、Agent工程化、大模型应用架构、数字员工管理、AI合规风险防控 摘要 2024年,AI Agent已经从实验室概念演变为企…...

SDXL 1.0多模态协同:灵感画廊输出图像与配套生成的诗意文案同步创作演示

SDXL 1.0多模态协同:灵感画廊输出图像与配套生成的诗意文案同步创作演示 1. 引言:当AI成为你的艺术搭档 想象一下,你脑海中浮现出一个绝美的画面:黄昏时分,一位身着长裙的舞者,在空旷的剧院里&#xff0c…...

告别特征提取!用FAST-LIO2和ikd-Tree,让你的机器人直接啃‘原始点云’大餐

FAST-LIO2与ikd-Tree:原始点云处理的革命性突破 当Livox固态激光雷达在茂密的竹林间穿梭,传统SLAM算法正在为提取有效的边缘和平面特征而焦头烂额时,FAST-LIO2却气定神闲地处理着每秒数十万的原始点云数据——这不是魔法,而是直接…...