Docker Compose 实战:多服务编排、depends_on 与健康检查的正确姿势
Docker Compose 实战:多服务编排、depends_on 与健康检查的正确姿势一个稍微像样的后端项目,本地跑起来往往不止一个容器:一个 web 服务、一个 Postgres、一个 Redis。用docker run一个个手敲命令,端口、网络、环境变量全靠记忆,换台机器重来一遍——这活儿谁干谁烦。Docker Compose 就是把这套「多容器怎么起、怎么连、按什么顺序起」写进一个 YAML 文件,一条docker compose up全部拉起来。这篇不讲 Compose 是什么这种废话,直接从一个能跑的三服务项目出发,重点讲两个最容易踩坑的地方:服务依赖顺序和健康检查。一个最小可用的三服务编排假设项目结构是一个 Node/Python web 服务 Postgres Redis。docker-compose.yml这样写:services:web:build:.# 用当前目录的 Dockerfile 构建ports:-8080:8080# 宿主机:容器environment:DATABASE_URL:postgres://app:secretdb:5432/appdbREDIS_URL:redis://cache:6379depends_on:-db-cachedb:image:postgres:16environment:POSTGRES_USER:appPOSTGRES_PASSWORD:secretPOSTGRES_DB:appdbvolumes:-pgdata:/var/lib/postgresql/data# 数据持久化,别每次 down 就丢库cache:image:redis:7volumes:pgdata:# 具名卷,交给 Docker 管理docker compose up -d后台拉起三个容器。这里有个新手最容易忽略的关键点:web 服务连数据库的地址是db:5432,不是localhost:5432。因为 Compose 会自动建一个网络,把所有服务放进去,服务名(db、cache)就是 DNS 主机名,容器之间用服务名互访。写成localhost会连到容器自己身上,必然连不上——这是排查「本地能跑,Compose 里连不上数据库」的第一嫌疑。depends_on 的真相:它只保证「启动顺序」,不保证「就绪」上面用了depends_on: [db, cache],很多人以为这表示「等数据库准备好接受连接了,再启动 web」。错。depends_on只保证容器启动的先后顺序——db 容器先start,web 容器后start。但 Postgres 容器「进程起来了」和「数据库能接受连接了」之间还有几秒初始化时间。结果就是经典翻车现场:web 容器一启动就去连db:5432,而 Postgres 还在初始化,连接被拒,web 直接崩溃退出。web-1 | Error: connect ECONNREFUSED db:5432 web-1 exited with code 1要真正「等数据库就绪」,得给 db 加健康检查,再让 web 用depends_on的condition: service_healthy语法等它健康。用 healthcheck condition 等服务真正就绪改进版:services:web:build:.ports:-8080:8080environment:DATABASE_URL:postgres://app:secretdb:5432/appdbREDIS_URL:redis://cache:6379depends_on:db:condition:service_healthy# 等 db 健康检查通过再启动cache:condition:service_healthydb:image:postgres:16environment:POSTGRES_USER:appPOSTGRES_PASSWORD:secretPOSTGRES_DB:appdbvolumes:-pgdata:/var/lib/postgresql/datahealthcheck:# pg_isready 是 postgres 自带的探活命令,能连上才算健康test:[CMD-SHELL,pg_isready -U app -d appdb]interval:5s# 每 5s 探一次timeout:3s# 单次探测 3s 超时retries:5# 连续 5 次失败才判定 unhealthystart_period:10s# 前 10s 是启动宽限期,失败不计入 retriescache:image:redis:7healthcheck:test:[CMD,redis-cli,ping]# 返回 PONG 即健康interval:5stimeout:3sretries:5volumes:pgdata:现在的启动流程变成:db、cache 容器启动,Compose 开始跑它们的 healthcheck;pg_isready/redis-cli ping通过后,db、cache 状态变为healthy;此时web 才启动,连数据库时对面已经就绪,不会再 ECONNREFUSED。几个 healthcheck 参数别配错:start_period是关键。数据库启动本身要几秒,这段时间探测失败是正常的。设了start_period: 10s,前 10 秒的失败不算进retries,避免容器还在正常启动就被误判 unhealthy 而重启。interval × retries大致是「最坏多久判定挂掉」。上面是5s × 5 25s,按服务实际启动速度调。test用CMD是直接执行数组里的命令;用CMD-SHELL是丢给/bin/sh -c跑,需要用到管道、变量、时用后者。应用自己的健康检查:光连上不够,要能干活数据库pg_isready只说明「能连」,不代表「表建好了、迁移跑完了」。对你自己的 web 服务,健康检查应该打一个真正反映「能对外服务」的接口:web:build:.ports:-8080:8080healthcheck:# 假设应用暴露了 /healthz,内部会检查 DB 连接池等test:[CMD,curl,-f,http://localhost:8080/healthz]interval:10stimeout:3sretries:3start_period:15scurl -f在 HTTP 状态码非 2xx 时返回非零退出码,正好被 healthcheck 判为失败。这样docker compose ps能直接看出 web 是不是真的活着,而不是「进程在但接口 500」。注意:test里的命令必须是容器镜像里真实存在的。基于alpine的精简镜像可能没有curl,那就用wget -q -O- http://...或在 Dockerfile 里装上 curl,否则健康检查永远失败。常用运维命令速查写完编排,日常就这几条命令:# 构建并后台启动全部服务dockercompose up-d--build# 看每个服务状态(能看到 healthy / unhealthy)dockercomposeps# 跟踪某个服务的日志dockercompose logs-fweb# 进容器排查dockercomposeexecdb psql-Uapp-dappdb# 只重启一个服务(改了代码重新构建)dockercompose up-d--buildweb# 停止并删除容器、网络(具名卷默认保留,数据还在)dockercompose down# 连数据卷一起删(慎用,会清库)dockercompose down-vdown和down -v的区别是新手最爱踩的坑:down保留具名卷(pgdata),数据库数据还在;down -v会把卷也删掉,库就清空了。想重置环境从零来过才用-v,平时别手滑。小结Compose 自动建网络,服务名就是主机名,容器间互访用db:5432而不是localhost。depends_on只管启动顺序,不管就绪;要等服务真正可用,必须配healthcheckdepends_on: condition: service_healthy。healthcheck 的start_period给足启动宽限期,避免正常启动被误判重启;数据库用pg_isready、Redis 用redis-cli ping、web 打自己的/healthz。healthcheck 的test命令必须在镜像里真实存在(精简镜像可能没curl)。down保数据,down -v删卷清库,别搞混。记忆点:depends_on保证「谁先起」,healthcheck才保证「起好了没」——两个一起用,才是真正的按序拉起。

相关新闻

【计算机毕业设计单片机案例】基于单片机阈值可调的婴儿监护设备开发 基于自动手动双模式的婴儿看护装置设计(012201)

【计算机毕业设计单片机案例】基于单片机阈值可调的婴儿监护设备开发 基于自动手动双模式的婴儿看护装置设计(012201)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/7/30 11:12:30 阅读更多 →
Next.js App Router 约定式文件实战:loading、error、not-found 怎么兜住加载态与异常

Next.js App Router 约定式文件实战:loading、error、not-found 怎么兜住加载态与异常

Next.js App Router 约定式文件实战:loading、error、not-found 怎么兜住加载态与异常 用 Next.js App Router 写页面,你迟早会遇到这三个问题: 页面里 await fetch(...) 拉数据时,用户盯着一片空白,不知道是在加载还是卡死了。接口挂了或抛异常,整个页面直接白屏崩掉,还可能…

2026/7/30 11:12:30 阅读更多 →
配电网最优潮流求解:二阶锥松弛技术与Matlab实现

配电网最优潮流求解:二阶锥松弛技术与Matlab实现

1. 项目概述:配电网最优潮流与二阶锥松弛技术配电网最优潮流(Optimal Power Flow, OPF)是电力系统运行与规划中的核心计算问题。传统OPF求解面临非凸非线性带来的计算复杂度挑战,而二阶锥松弛(Second-Order Cone Relax…

2026/7/30 11:11:29 阅读更多 →

最新新闻

WAF+DDoS 双层防护架构!解决应用层混合攻击漏杀误杀问题

WAF+DDoS 双层防护架构!解决应用层混合攻击漏杀误杀问题

很多企业同时被四层流量攻击 七层 CC 攻击混合打击,单靠高防只能防流量、防不住 CC,单靠 WAF 防不住大流量。本篇详解企业标准「DDoS 高防 WAF」双层防护架构,解决漏杀、误杀、业务卡顿难题。一、双层防护分工逻辑外层 DDoS 高防&#xff1…

2026/7/30 11:21:33 阅读更多 →
JavaScript可选链运算符:简化空值处理的终极指南

JavaScript可选链运算符:简化空值处理的终极指南

1. JavaScript中的"?"运算符解析在JavaScript开发中,我们经常会遇到需要处理可能为null或undefined值的情况。传统的做法是通过多层if判断来避免报错,但这会导致代码冗长且难以维护。ES2020引入的可选链运算符(Optional Chaining …

2026/7/30 11:21:33 阅读更多 →
基于Django的洗衣服务电商平台开发实践

基于Django的洗衣服务电商平台开发实践

1. 项目概述:基于Django的洗衣服务电商平台这个项目是一个典型的O2O(线上到线下)洗衣服务平台,采用Django作为后端框架构建。作为从业十多年的全栈开发者,我认为这类项目最核心的价值在于打通传统洗衣行业的数字化闭环…

2026/7/30 11:21:33 阅读更多 →
PHP 大文件上传、断点续传完整实现思路

PHP 大文件上传、断点续传完整实现思路

PHP 大文件上传、断点续传完整实现思路一、为什么需要断点续传?传统上传的痛点假设你要上传一个 2GB 的视频文件:问题表现后果网络中断上传到80%时WiFi断了重新开始,前功尽弃超时限制PHP max_execution_time 默认30秒大文件必然超时内存溢出u…

2026/7/30 11:21:33 阅读更多 →
SpringBoot项目从零搭建:环境配置、项目结构与数据库整合实战

SpringBoot项目从零搭建:环境配置、项目结构与数据库整合实战

1. 项目概述:为什么SpringBoot是Java开发者的“瑞士军刀”如果你是一名Java开发者,或者正准备踏入这个领域,那么“SpringBoot”这个名字你一定不陌生。它几乎成了现代Java企业级应用开发的代名词。但很多新手,甚至一些有经验的开发…

2026/7/30 11:21:33 阅读更多 →
终极指南:用SillyTavern打造有灵魂的AI角色,告别机械对话

终极指南:用SillyTavern打造有灵魂的AI角色,告别机械对话

终极指南:用SillyTavern打造有灵魂的AI角色,告别机械对话 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 你是否厌倦了那些只会机械回答的AI角色?想要创…

2026/7/30 11:20:33 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻