Docker Compose编排多容器应用实战指南
1. 项目背景与核心价值多容器应用编排是现代云原生开发中的必备技能。去年我在迁移公司老旧单体架构时第一次真正体会到Docker Compose的威力——原本需要3天手动部署的NginxMySQLRedis服务栈用Compose文件20分钟就搞定了。这种基础设施即代码的体验让我彻底成为容器化部署的信徒。这个方案特别适合需要快速搭建LNMP/LAMP开发环境的全栈开发者准备将传统应用容器化的运维工程师想学习服务编排的DevOps初学者2. 环境准备与工具选型2.1 基础环境配置推荐使用Ubuntu 22.04 LTS作为基础系统这是我实测最稳定的组合# 安装必要工具 sudo apt update sudo apt install -y git curl wget # 安装Docker引擎 curl -fsSL https://get.docker.com | sudo sh # 当前用户加入docker组需重新登录生效 sudo usermod -aG docker $USER重要提示生产环境务必配置docker daemon的TLS加密通信开发环境可暂时跳过2.2 Docker Compose安装虽然现在Docker Desktop自带Compose但服务器环境我更推荐独立安装# 获取最新稳定版截至2023年7月为v2.18.1 DOCKER_COMPOSE_VERSION$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | cut -d -f 4) sudo curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose验证安装docker-compose version # 应输出类似Docker Compose version v2.18.13. 服务栈架构设计3.1 组件交互关系我们的目标架构客户端 → Nginx (80端口) ↳ 静态文件 ↳ 动态请求 → 应用容器 ↳ MySQL (3306) ↳ Redis (6379)3.2 网络拓扑规划默认情况下Compose会创建1个自定义bridge网络服务间通信每个服务的独立容器建议显式声明网络配置networks: app_net: driver: bridge ipam: config: - subnet: 172.20.0.0/244. 编写Compose文件4.1 基础模板结构创建docker-compose.ymlversion: 3.8 services: # 各服务定义将放在这里 networks: app_net: driver: bridge volumes: mysql_data: redis_data:4.2 Nginx服务配置nginx: image: nginx:1.23-alpine ports: - 80:80 - 443:443 volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./static:/var/www/html depends_on: - app networks: - app_net配套的Nginx配置文件示例./nginx/conf.d/default.confserver { listen 80; location / { proxy_pass http://app:3000; proxy_set_header Host $host; } location /static/ { alias /var/www/html/; } }4.3 MySQL服务配置mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_secure_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: user_password volumes: - mysql_data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - app_net healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 3s retries: 34.4 Redis服务配置redis: image: redis:7-alpine command: redis-server --requirepass your_redis_password volumes: - redis_data:/data networks: - app_net healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 3s retries: 35. 应用容器示例假设我们有个Node.js应用app: build: ./app environment: DB_HOST: mysql DB_USER: app_user DB_PASSWORD: user_password REDIS_URL: redis://default:your_redis_passwordredis:6379 depends_on: mysql: condition: service_healthy redis: condition: service_healthy networks: - app_net对应的Dockerfile./app/DockerfileFROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD [npm, start]6. 运维管理实战6.1 常用操作命令启动整个栈后台模式docker-compose up -d查看日志可指定服务名docker-compose logs -f nginx执行一次性命令如在mysql中执行SQLdocker-compose exec mysql mysql -uapp_user -p app_db6.2 配置热重载修改Nginx配置后无需重启容器docker-compose exec nginx nginx -s reload6.3 备份与恢复MySQL数据备份docker-compose exec mysql sh -c exec mysqldump --all-databases -uroot -p$MYSQL_ROOT_PASSWORD backup.sqlRedis数据持久化已在配置中自动启用docker-compose exec redis redis-cli save7. 性能调优技巧7.1 资源限制services: mysql: deploy: resources: limits: cpus: 2 memory: 2G reservations: memory: 1G7.2 MySQL优化参数通过自定义配置文件./mysql/my.cnf[mysqld] innodb_buffer_pool_size 1G innodb_log_file_size 256M在compose中挂载volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/custom.cnf8. 常见问题排查8.1 容器启动顺序问题症状应用启动时报数据库连接失败解决方案使用depends_on healthcheck组合应用添加重试逻辑8.2 端口冲突症状docker-compose up时报端口被占用排查sudo netstat -tulnp | grep 808.3 数据卷权限问题症状MySQL无法写入数据目录解决方法docker-compose down sudo chown -R 999:999 ./mysql_data9. 生产环境建议使用单独的.env文件管理敏感信息echo MYSQL_ROOT_PASSWORD$(openssl rand -base64 12) .env启用Swarm模式获得更高可用性docker swarm init docker stack deploy -c docker-compose.yml my_stack配置日志轮转logging: options: max-size: 10m max-file: 3这个配置方案已经在我们的预发布环境稳定运行了6个月期间经历过3次平滑升级。最让我惊喜的是当需要新增一个Elasticsearch服务时只需要在compose文件中添加20行配置就完成了集成。

相关新闻

AI编程助手统一管理方案设计与实践

AI编程助手统一管理方案设计与实践

1. 多代码助手统一管理痛点解析作为每天要同时使用多种AI编程助手的开发者,我深刻体会到管理不同工具的配置有多令人抓狂。Claude Code、Codex、Gemini CLI这些工具各有各的API密钥存储位置、不同的配置文件格式、五花八门的参数设置方式。上周为了调试一个跨工具的…

2026/10/12 10:06:01 阅读更多 →
酒店评论情感分析系统:Python文本挖掘与可视化实践

酒店评论情感分析系统:Python文本挖掘与可视化实践

1. 项目背景与核心价值酒店评论情感分析系统是当前旅游行业数字化转型中的关键工具。去年帮某连锁酒店集团做咨询时,他们的市场总监给我看了一沓厚厚的顾客意见表——这些沉睡在档案柜里的宝贵数据,其实藏着提升服务质量的密码。传统人工分析500条评论需…

2026/10/12 10:06:27 阅读更多 →
猎豹移动AI转型:从工具到智能的商业实践

猎豹移动AI转型:从工具到智能的商业实践

1. 猎豹移动的AI转型之路猎豹移动作为中国互联网出海企业的代表,其业务转型轨迹颇具行业参考价值。从工具类应用起家到全面拥抱AI技术,这家公司近期的扭亏为盈引发了业界对"工具AI"商业模式的重新思考。2023年财报显示,猎豹移动实现…

2026/9/29 5:47:44 阅读更多 →

最新新闻

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

Windows下MySQL安装配置与卸载全攻略:从版本选择到残留清理

如果你也在Windows上折腾过MySQL,应该能理解那种感受:下载页面一堆版本不知道选哪个,安装到一半卡住,装完了服务起不来,或者换版本时残留文件清不干净,重装总报错。这些坑我基本都踩过一遍,花了…

2026/10/13 11:04:15 阅读更多 →
Thingsboard接入Modbus协议的工程实践与稳定架构设计

Thingsboard接入Modbus协议的工程实践与稳定架构设计

1. 项目概述:为什么一个工业协议接入模块值得单独深挖?“Thingsboard modbus协议”——这六个字背后,不是一句轻飘飘的配置说明,而是一条横跨工业现场与云端管理的真实数据链路。我第一次在某智能配电柜远程监控项目里碰上这个组合…

2026/10/13 11:04:15 阅读更多 →
MySQL与Redis缓存一致性实战:从原理到架构选型

MySQL与Redis缓存一致性实战:从原理到架构选型

做后端这几年,我算是把“缓存和数据库数据对不上”这件事踩透了。团队经常半夜被叫醒,一查原因,十有八九是 Redis 里的旧数据还在服务,而 MySQL 里的记录早就改了。这问题听着朴素,真要讲清楚,背后牵扯到读…

2026/10/13 11:04:15 阅读更多 →
电商数据分析实战:从CLV到营收预测的完整链路

电商数据分析实战:从CLV到营收预测的完整链路

这种预测需求,在如今做电商数据分析的人手里,几乎每周都会撞上一次:老板在周会上盯着营收曲线,问"下个月能不能回到峰值""这批流失客户还值不值得砸券召回";运营拿着用户分群报表,却不…

2026/10/13 11:04:15 阅读更多 →
SpringBoot直连Hive:JDBC接入全流程与常见坑详解

SpringBoot直连Hive:JDBC接入全流程与常见坑详解

最近在给一个数据平台做数据接口,需要让SpringBoot服务通过JDBC直连Hive,把数仓里的离线结果表实时捞过来给前端展示。这个说起来好像就是连个数据库,但实际操作中,Hive和MySQL这些传统关系型数据库在驱动、依赖、协议、会话管理上…

2026/10/13 11:04:15 阅读更多 →
Java全栈演唱会售票系统开发与高并发优化实践

Java全栈演唱会售票系统开发与高并发优化实践

1. 项目概述与核心价值演唱会售票系统是连接演出主办方与观众的关键数字化桥梁。这个基于Java技术栈的全栈解决方案,通过SpringBoot/SSM后端Vue前端uniapp多端的组合架构,实现了从票务管理、在线选座到移动端购票的完整闭环。我在实际票务系统开发中发现…

2026/10/13 11:03:11 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →