发布时间:2026/8/26 20:18:09
Docker Compose 从入门到实战:多容器编排完全指南 Docker Compose 从入门到实战多容器编排完全指南一、什么是 Docker ComposeDocker Compose 是 Docker 官方提供的多容器编排工具用于定义和运行多个 Docker 容器的应用。通过一个docker-compose.yml文件你可以配置应用程序所需的所有服务容器然后使用一条命令即可启动所有服务。Docker Compose 的核心价值将多个容器的配置、依赖关系、网络、数据卷等集中声明在一个 YAML 文件中实现多容器应用的一键部署和环境一致性。1.1 适用场景场景说明开发环境快速搭建完整的应用依赖数据库、缓存、消息队列等本地测试模拟生产环境进行集成测试CI/CD 流水线自动化构建和测试环境单机生产部署小型项目或微服务部署生产环境一般用 K8s二、安装 Docker Compose安装看这篇二进制安装 Docker 和 Docker-compose三、docker-compose.yml 核心语法详解3.1 基础结构version:3.8# Compose 文件版本services:# 服务定义每个服务对应一个容器web:# 服务名称image:nginx# 使用的镜像ports:# 端口映射-8080:80volumes:# 数据卷挂载-./html:/usr/share/nginx/htmlnetworks:# 网络定义可选default:driver:bridgevolumes:# 卷定义可选data:四、核心配置项详解4.1 image——指定镜像services:web:image:nginx:alpine# 从仓库拉取app:build:./app# 从 Dockerfile 构建# 或指定构建参数build:context:./appdockerfile:Dockerfileargs:VERSION:1.0db:image:mysql:5.74.2 ports——端口映射services:web:ports:-8080:80# 宿主机:容器-127.0.0.1:8081:81# 绑定到指定 IP-8082:80# 多个端口映射# 暴露内部端口但不映射到宿主机仅服务间通信app:expose:-8080-90904.3 volumes——数据卷挂载services:web:volumes:# 绑定挂载宿主机目录:容器目录-./app:/app# 命名卷-data:/var/lib/mysql# 只读挂载-./config:/etc/app/config:ro# 相对路径挂载-./logs:/var/log/appdb:volumes:-db_data:/var/lib/mysql# 定义命名卷volumes:data:db_data:4.4 environment 与 env_file——环境变量services:web:# 直接定义environment:-NODE_ENVproduction-DB_HOSTmysql-APP_PORT8080db:# 从文件加载.env 文件env_file:-.env-./config/db.envenvironment:-MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD}# 引用外部变量.env文件示例MYSQL_ROOT_PASSWORD123456 MYSQL_DATABASEmyapp DB_USERadmin4.5 depends_on——依赖与启动顺序services:web:image:nginxdepends_on:-app-dbapp:build:./appdepends_on:-dbdb:image:mysql:5.7注意depends_on仅控制容器启动顺序不等待服务完全就绪。如需健康检查后才启动需配合conditionservices:web:depends_on:db:condition:service_healthy# 等待 db 健康后才启动db:image:mysql:5.7healthcheck:test:[CMD,mysqladmin,ping,-h,localhost]interval:10stimeout:5sretries:54.6 restart——重启策略services:web:restart:always# 总是重启# restart: unless-stopped # 除非手动停止# restart: on-failure:3 # 失败时重启最多 3 次# restart: no # 不自动重启默认4.7 networks——网络配置services:web:networks:-frontend-backendapp:networks:-backenddb:networks:-backend# 定义网络networks:frontend:driver:bridgebackend:driver:bridgeinternal:true# 内部网络不对外暴露4.8 command 与 entrypoint——启动命令services:web:image:python:3.11command:python app.py# 或数组格式command:[python,app.py]app:build:.entrypoint:[java,-jar]command:[app.jar]# 组合使用实际执行 java -jar app.jar4.9 container_name——指定容器名services:web:container_name:my-web-app# 固定容器名image:nginx注意生产环境尽量不要固定容器名避免冲突。4.10 logging——日志配置services:web:logging:driver:json-file# 日志驱动options:max-size:10m# 单个日志文件最大 10Mmax-file:3# 最多保留 3 个文件五、配置文件完整参考含全部常用字段version:3.8services:# Web 服务 web:image:nginx:alpinecontainer_name:nginx-webrestart:alwaysports:-80:80-443:443volumes:-./html:/usr/share/nginx/html:ro-./nginx.conf:/etc/nginx/conf.d/default.conf:rodepends_on:app:condition:service_healthynetworks:-frontend-backendlogging:driver:json-fileoptions:max-size:10mmax-file:3# 应用服务 app:build:context:./appdockerfile:Dockerfileargs:BUILD_ENV:productioncontainer_name:spring-apprestart:alwaysenvironment:-SPRING_PROFILES_ACTIVEprod-DB_HOSTdb-DB_PORT3306-REDIS_HOSTredisenv_file:-./config/app.envvolumes:-./logs:/app/logs-app_data:/app/dataports:-8080:8080depends_on:db:condition:service_healthyredis:condition:service_healthyhealthcheck:test:[CMD,curl,-f,http://localhost:8080/actuator/health]interval:30stimeout:3sretries:3start_period:30snetworks:-backend-internallogging:driver:json-fileoptions:max-size:50mmax-file:5# 数据库服务 db:image:mysql:5.7container_name:mysql-dbrestart:alwaysenvironment:-MYSQL_ROOT_PASSWORD${MYSQL_ROOT_PASSWORD}-MYSQL_DATABASEmyapp-MYSQL_USERappuser-MYSQL_PASSWORD${MYSQL_USER_PASSWORD}volumes:-db_data:/var/lib/mysql-./init.sql:/docker-entrypoint-initdb.d/init.sql:roports:-3306:3306healthcheck:test:[CMD,mysqladmin,ping,-h,127.0.0.1,-uroot,-p${MYSQL_ROOT_PASSWORD}]interval:10stimeout:5sretries:5networks:-backend-internal# Redis 缓存 redis:image:redis:7.0-alpinecontainer_name:redis-cacherestart:alwayscommand:redis-server--requirepass ${REDIS_PASSWORD}volumes:-redis_data:/dataports:-6379:6379healthcheck:test:[CMD,redis-cli,ping]interval:10stimeout:3sretries:5networks:-backend# 网络定义 networks:frontend:driver:bridgebackend:driver:bridgeinternal:falseinternal:driver:bridgeinternal:true# 内部网络无法访问外部# 卷定义 volumes:db_data:driver:localredis_data:app_data:六、常用命令详解6.1 基础命令命令说明示例up启动所有服务docker-compose up -ddown停止并删除所有容器、网络docker-compose downps查看服务状态docker-compose pslogs查看日志docker-compose logs -f webstop停止服务不删除容器docker-compose stopstart启动已停止的服务docker-compose startrestart重启服务docker-compose restart webexec进入容器执行命令docker-compose exec web bashbuild构建或重新构建服务镜像docker-compose build --no-cachepull拉取服务镜像docker-compose pullpush推送服务镜像到仓库docker-compose pushtop查看容器内进程docker-compose topconfig验证配置文件格式docker-compose config6.2 常用组合示例# 后台启动所有服务docker-composeup-d# 只启动特定服务docker-composeup-dweb db# 查看所有容器状态docker-composeps-a# 实时查看所有服务日志docker-composelogs-f# 查看特定服务日志最近 100 行docker-composelogs--tail100web# 进入 Web 容器终端docker-composeexecweb /bin/sh# 执行数据库备份docker-composeexecdb mysqldump-uroot-p123456myappbackup.sql# 停止并删除所有容器、网络、卷docker-composedown-v# 重新构建并启动docker-composeup-d--build# 验证配置文件docker-composeconfig--quiet七、实战案例7.1 案例一LAMP 环境WordPress MySQLversion:3.8services:# WordPress 服务wordpress:image:wordpress:latestcontainer_name:wordpressrestart:alwaysports:-8080:80environment:WORDPRESS_DB_HOST:dbWORDPRESS_DB_USER:wordpressWORDPRESS_DB_PASSWORD:wordpress_passWORDPRESS_DB_NAME:wordpressvolumes:-wordpress_data:/var/www/html-./wp-content:/var/www/html/wp-contentdepends_on:db:condition:service_healthynetworks:-webnet# MySQL 数据库db:image:mysql:5.7container_name:mysql-wprestart:alwaysenvironment:MYSQL_ROOT_PASSWORD:root_passMYSQL_DATABASE:wordpressMYSQL_USER:wordpressMYSQL_PASSWORD:wordpress_passvolumes:-db_data:/var/lib/mysqlhealthcheck:test:[CMD,mysqladmin,ping,-h,localhost]interval:10stimeout:5sretries:5networks:-webnet# phpMyAdmin可选phpmyadmin:image:phpmyadmin/phpmyadmincontainer_name:phpmyadminrestart:alwaysports:-8081:80environment:PMA_HOST:dbPMA_PORT:3306UPLOAD_LIMIT:100Mdepends_on:-dbnetworks:-webnetvolumes:wordpress_data:db_data:networks:webnet:启动访问WordPress: http://localhost:8080phpMyAdmin: http://localhost:80817.2 案例二微服务架构Spring Boot MySQL Redis Nginxversion:3.8services:# Nginx 网关nginx:image:nginx:alpinecontainer_name:api-gatewayrestart:alwaysports:-80:80volumes:-./nginx/nginx.conf:/etc/nginx/nginx.conf:ro-./nginx/conf.d:/etc/nginx/conf.d:rodepends_on:-user-service-order-service-product-servicenetworks:-frontend-backend# 用户服务user-service:build:./user-servicecontainer_name:user-servicerestart:alwaysenvironment:-SPRING_PROFILES_ACTIVEdocker-DB_HOSTmysql-REDIS_HOSTredisports:-8081:8080depends_on:mysql:condition:service_healthyredis:condition:service_healthyhealthcheck:test:[CMD,curl,-f,http://localhost:8080/actuator/health]interval:30stimeout:3sretries:3start_period:30snetworks:-backend# 订单服务order-service:build:./order-servicecontainer_name:order-servicerestart:alwaysenvironment:-SPRING_PROFILES_ACTIVEdocker-DB_HOSTmysql-REDIS_HOSTredisports:-8082:8080depends_on:mysql:condition:service_healthyredis:condition:service_healthyhealthcheck:test:[CMD,curl,-f,http://localhost:8080/actuator/health]interval:30stimeout:3sretries:3start_period:30snetworks:-backend# 商品服务product-service:build:./product-servicecontainer_name:product-servicerestart:alwaysenvironment:-SPRING_PROFILES_ACTIVEdocker-DB_HOSTmysql-REDIS_HOSTredisports:-8083:8080depends_on:mysql:condition:service_healthyredis:condition:service_healthyhealthcheck:test:[CMD,curl,-f,http://localhost:8080/actuator/health]interval:30stimeout:3sretries:3start_period:30snetworks:-backend# MySQLmysql:image:mysql:5.7container_name:mysql-microrestart:alwaysenvironment:-MYSQL_ROOT_PASSWORDroot123volumes:-mysql_data:/var/lib/mysql-./init.sql:/docker-entrypoint-initdb.d/init.sqlports:-3306:3306healthcheck:test:[CMD,mysqladmin,ping,-h,localhost,-uroot,-proot123]interval:10stimeout:5sretries:5networks:-backend# Redisredis:image:redis:7.0-alpinecontainer_name:redis-microrestart:alwaysvolumes:-redis_data:/dataports:-6379:6379healthcheck:test:[CMD,redis-cli,ping]interval:10stimeout:3sretries:5networks:-backendvolumes:mysql_data:redis_data:networks:frontend:driver:bridgebackend:driver:bridge八、常用环境变量文件 .env# .env 文件与 docker-compose.yml 同目录 # 数据库配置 MYSQL_ROOT_PASSWORDroot123456 MYSQL_DATABASEmyapp MYSQL_USERappuser MYSQL_PASSWORDapppass123 # 应用配置 APP_ENVproduction APP_PORT8080 JWT_SECRETyour-secret-key-here # Redis 配置 REDIS_PASSWORDredispass # 对外域名 DOMAINexample.com在docker-compose.yml中引用services:db:environment:MYSQL_ROOT_PASSWORD:${MYSQL_ROOT_PASSWORD}MYSQL_DATABASE:${MYSQL_DATABASE}MYSQL_USER:${MYSQL_USER}MYSQL_PASSWORD:${MYSQL_PASSWORD}九、最佳实践总结9.1 配置文件规范序号最佳实践说明1使用固定版本号避免latest保证环境一致性2使用.env管理敏感信息不将密码硬编码在 YAML 中3添加healthcheck健康检查确保服务就绪后再启动依赖4合理规划网络隔离前后端分离网络提高安全性5使用restart: always保证容器意外退出后自动恢复6限制日志文件大小避免磁盘爆满7使用命名卷持久化数据容器重启后数据不丢失8配置文件添加注释便于团队协作和维护9使用depends_oncondition确保依赖服务健康后才启动9.2 常用 .gitignore 内容# 环境变量含敏感信息 .env *.env # 日志目录 logs/ *.log # 数据卷目录避免提交大文件 data/ volumes/ # IDE 配置 .idea/ .vscode/ *.iml9.3 生产环境注意事项注意事项说明禁用latest标签指定具体版本号保证可追溯性使用国内镜像加速在docker-compose.yml中配置registry-mirrors设置资源限制使用deploy.resources.limits限制 CPU 和内存配置日志轮转避免日志占满磁盘使用外部卷便于数据备份和迁移定期备份数据数据库卷需要定期备份资源限制示例services:web:deploy:resources:limits:cpus:0.5memory:512Mreservations:cpus:0.25memory:256M十、常用命令速查表分类命令说明启动docker-compose up -d后台启动所有服务停止docker-compose down停止并删除容器、网络docker-compose down -v同时删除数据卷查看docker-compose ps查看服务状态docker-compose logs -f实时查看所有日志操作docker-compose exec web bash进入容器docker-compose restart web重启特定服务构建docker-compose build构建或重建镜像docker-compose build --no-cache不使用缓存构建调试docker-compose config验证配置文件docker-compose top查看容器内进程如果这篇文章对你有帮助欢迎收藏、分享也欢迎在评论区交流讨论

相关新闻

2026/8/26 18:21:50

Apex英雄运行问题全面解决方案:从反作弊修复到性能优化

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 Apex英雄作为一款热门的战术竞技游戏,在7月更新后不少玩家遇到了进不去游戏、掉帧、启动错误、反作弊未运行等问题。这些问…

2026/8/26 21:09:11

A3910与MK64FN1M0VDC12在电机控制中的高效应用

1. 认识A3910与MK64FN1M0VDC12这对黄金搭档在工业控制和嵌入式开发领域,电机驱动与主控MCU的选型往往决定了整个系统的性能上限。A3910作为Allegro MicroSystems推出的全桥式电机驱动芯片,与NXP的MK64FN1M0VDC12(基于ARM Cortex-M4F内核的MCU…

2026/8/27 7:06:40

Origin安装全攻略:无横线Bug修复与首次配置指南

如果说有一款软件,能让论文党、科研党和数据分析师又爱又恨,Origin 一定排在前面。爱的是它做数据拟合、统计分析和论文配图确实顺手;恨的是安装过程并不像普通软件那么省心。这次我们专门聊 Origin 安装,尤其是网上被反复提到的“…

2026/8/27 7:06:40

AI房源信息泛滥,如何用验证流程过滤虚假房源?

AI房源列表已经成了找房过程中最消耗耐心的一环。你打开租房App,满屏都是装修到位的描述:“地铁旁”“家电齐全”“拎包入住”“房东直租无中介费”,连小区绿化、邻里氛围、周边咖啡店都被写得像广告文案。但等你搜一下地址,或者打…

2026/8/27 7:06:40

LLM辅助Linux驱动开发:drivers/staging的准入策略与审查实践

最近在整理内核开发相关笔记时,重新看到了一个很有意思的议题:LLM policy for drivers/staging/ going forward。很多人第一次看到这个标题会下意识以为是“怎么用大模型去写 Linux 驱动”,但如果结合内核社区最近的讨论来读,会发…

2026/8/27 7:06:40

LLM生成代码进入Linux内核drivers/staging:质量门槛与合规审查

这次我们来看的,不是某个新的开源模型或一键启动包,而是 Linux 内核开发社区里正在被认真讨论的一个命题:LLM 生成的代码,未来还能不能进 drivers/staging,进入时应该按什么标准来评估。标题直译就是 “drivers/stagin…

2026/8/27 7:06:40

数学建模实战:从MATLAB基础到竞赛进阶的完整指南

1. 从“练习”到“实战”:电子科大数模实验的进阶之路 很多同学拿到“数学建模练习”或者“数学实验”的题目时,第一反应往往是:打开MATLAB,照着题目要求把代码敲一遍,跑出结果,然后交差。如果你也是这么想…

2026/8/27 7:01:40

SpringBoot对接FISCO BCOS区块链开发实战:Ubuntu部署与Tape配置详解

1. 项目概述:这不是一道“考题”,而是一份真实产业级区块链后端开发任务清单“区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第四套区块链应用后端开发”——这个标题乍看像一份试卷编号,但实打实拆开来看,它背后是一整…

2026/8/26 9:13:28

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 11:48:27

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 16:56:43

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/27 0:01:16

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

2026/8/27 0:01:16

LeetCode Hot100(51-60)算法精解与面试技巧

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

2026/8/27 0:01:16

CRC校验实战:从模2除法到HJ212协议排错

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

2026/8/26 19:34:06

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/26 19:17:08

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/26 19:34:05

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…