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查看容器内进程如果这篇文章对你有帮助欢迎收藏、分享也欢迎在评论区交流讨论

相关新闻

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

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

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

2026/7/9 15:32:30阅读更多 →
A3910与MK64FN1M0VDC12在电机控制中的高效应用

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

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

2026/7/9 15:32:30阅读更多 →
从想法到代码:开发者如何系统提升技术转化与工程落地能力

从想法到代码:开发者如何系统提升技术转化与工程落地能力

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 从“想法”到“落地”:开发者面临的核心挑战 在技术领域,我们每天都会产生无数想法:一个优化算…

2026/7/9 15:32:30阅读更多 →
2026 平价入门蓝牙耳机实测测评:五款百元 TWS 全场景使用解析

2026 平价入门蓝牙耳机实测测评:五款百元 TWS 全场景使用解析

引言当下平价入门蓝牙耳机市场覆盖百元主流价位区间,学生群体、职场新人、日常通勤用户都会将 100-300 元价位 TWS 耳机作为首选听音设备,适配通勤、网课、办公、轻运动等多元日常场景。多数普通消费者在选购平价无线耳机时,常会遇到各类使用…

2026/7/9 16:47:52阅读更多 →
macOS 14 Sonoma 网络接口识别:3种命令精准定位 en0/en1 与 IP 地址

macOS 14 Sonoma 网络接口识别:3种命令精准定位 en0/en1 与 IP 地址

macOS 14 Sonoma 网络接口精准定位与自动化 IP 获取指南1. 理解 macOS 网络接口的复杂性在 macOS 系统中,网络接口的命名规则可能会让不少用户感到困惑。特别是从 macOS Ventura 升级到 Sonoma 后,许多用户发现原本熟悉的 en0 接口可能变成了 en1&#x…

2026/7/9 16:47:52阅读更多 →
5分钟终极指南:一次性解决所有Windows C++运行库安装问题

5分钟终极指南:一次性解决所有Windows C++运行库安装问题

5分钟终极指南:一次性解决所有Windows C运行库安装问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"缺少MSVCP140.dll"或"…

2026/7/9 16:47:52阅读更多 →
Proxmox VE 9.1.1部署Windows 11 23H2完整实践指南

Proxmox VE 9.1.1部署Windows 11 23H2完整实践指南

1. 项目概述:在Proxmox VE 9.1.1上部署Windows 11 23H1(非26H1,标题存在笔误需先澄清) 先说清楚一个关键事实:标题里写的“Windows11.26H1”并不存在。微软官方发布的Windows 11版本号体系中,2023年10月发…

2026/7/9 16:47:52阅读更多 →
Error 88716 逼疯了多少NI工程师?cRIO与DAQmx版本不匹配,其实十分钟就能搞定

Error 88716 逼疯了多少NI工程师?cRIO与DAQmx版本不匹配,其实十分钟就能搞定

阅读时间:11 分钟 | 适用人群:嵌入式系统 / 测试平台架构师 / NI 硬件集成专家 💀 你是不是也遇到过这种“灵异事件”? 事情是这样的—— 你在 MAX 里配得好好的 cRIO-9035,下面挂了个 NI-9145 EtherCAT 机箱&#x…

2026/7/9 16:47:52阅读更多 →
计算机毕业设计之基于UGC数据的南京城市旅游形象研究

计算机毕业设计之基于UGC数据的南京城市旅游形象研究

本研究以用户生成内容(UGC)为数据基础,对南京城市旅游形象进行了系统研究。通过采集并分析旅游者在线上发表的评论、图片和视频等UGC数据,本研究揭示了游客对南京旅游形象的感知和评价。研究运用数据挖掘技术和情感分析算法&#…

2026/7/9 16:42:52阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →