Docker Compose :从入门到企业级部署
Docker Compose :从入门到企业级部署
1. Docker Compose 核心概念
1.1 Compose 架构全景图
#mermaid-svg-PNv5W3Moo6dfPs6X {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X .error-icon{fill:#552222;}#mermaid-svg-PNv5W3Moo6dfPs6X .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PNv5W3Moo6dfPs6X .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PNv5W3Moo6dfPs6X .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PNv5W3Moo6dfPs6X .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PNv5W3Moo6dfPs6X .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PNv5W3Moo6dfPs6X .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PNv5W3Moo6dfPs6X .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PNv5W3Moo6dfPs6X .marker.cross{stroke:#333333;}#mermaid-svg-PNv5W3Moo6dfPs6X svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PNv5W3Moo6dfPs6X .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X .cluster-label text{fill:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X .cluster-label span{color:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X .label text,#mermaid-svg-PNv5W3Moo6dfPs6X span{fill:#333;color:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X .node rect,#mermaid-svg-PNv5W3Moo6dfPs6X .node circle,#mermaid-svg-PNv5W3Moo6dfPs6X .node ellipse,#mermaid-svg-PNv5W3Moo6dfPs6X .node polygon,#mermaid-svg-PNv5W3Moo6dfPs6X .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PNv5W3Moo6dfPs6X .node .label{text-align:center;}#mermaid-svg-PNv5W3Moo6dfPs6X .node.clickable{cursor:pointer;}#mermaid-svg-PNv5W3Moo6dfPs6X .arrowheadPath{fill:#333333;}#mermaid-svg-PNv5W3Moo6dfPs6X .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PNv5W3Moo6dfPs6X .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PNv5W3Moo6dfPs6X .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PNv5W3Moo6dfPs6X .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PNv5W3Moo6dfPs6X .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PNv5W3Moo6dfPs6X .cluster text{fill:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X .cluster span{color:#333;}#mermaid-svg-PNv5W3Moo6dfPs6X div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PNv5W3Moo6dfPs6X :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 核心组件 服务(services) 网络(networks) 卷(volumes) 开发者 编写docker-compose.yml 定义服务 配置网络 配置存储 多容器应用 一键部署
三大核心要素:
- 服务:容器化的应用组件(如web、db)
- 网络:定义服务间通信方式
- 卷:持久化数据存储方案
2. 完整开发工作流
2.1 典型开发流程
#mermaid-svg-IXwh0LXGmWKxQQub {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IXwh0LXGmWKxQQub .error-icon{fill:#552222;}#mermaid-svg-IXwh0LXGmWKxQQub .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IXwh0LXGmWKxQQub .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-IXwh0LXGmWKxQQub .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IXwh0LXGmWKxQQub .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IXwh0LXGmWKxQQub .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IXwh0LXGmWKxQQub .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IXwh0LXGmWKxQQub .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IXwh0LXGmWKxQQub .marker.cross{stroke:#333333;}#mermaid-svg-IXwh0LXGmWKxQQub svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IXwh0LXGmWKxQQub .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IXwh0LXGmWKxQQub .cluster-label text{fill:#333;}#mermaid-svg-IXwh0LXGmWKxQQub .cluster-label span{color:#333;}#mermaid-svg-IXwh0LXGmWKxQQub .label text,#mermaid-svg-IXwh0LXGmWKxQQub span{fill:#333;color:#333;}#mermaid-svg-IXwh0LXGmWKxQQub .node rect,#mermaid-svg-IXwh0LXGmWKxQQub .node circle,#mermaid-svg-IXwh0LXGmWKxQQub .node ellipse,#mermaid-svg-IXwh0LXGmWKxQQub .node polygon,#mermaid-svg-IXwh0LXGmWKxQQub .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IXwh0LXGmWKxQQub .node .label{text-align:center;}#mermaid-svg-IXwh0LXGmWKxQQub .node.clickable{cursor:pointer;}#mermaid-svg-IXwh0LXGmWKxQQub .arrowheadPath{fill:#333333;}#mermaid-svg-IXwh0LXGmWKxQQub .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IXwh0LXGmWKxQQub .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IXwh0LXGmWKxQQub .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-IXwh0LXGmWKxQQub .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-IXwh0LXGmWKxQQub .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IXwh0LXGmWKxQQub .cluster text{fill:#333;}#mermaid-svg-IXwh0LXGmWKxQQub .cluster span{color:#333;}#mermaid-svg-IXwh0LXGmWKxQQub div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IXwh0LXGmWKxQQub :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 是 否 关键命令 docker-compose up docker-compose logs docker-compose down 编写应用代码 编写Dockerfile 编写compose文件 启动环境 测试调试 需要修改? 提交部署
2.2 多服务示例项目结构
myapp/├── docker-compose.yml├── backend/│ ├── Dockerfile│ └── src/├── frontend/│ ├── Dockerfile│ └── public/└── db/ └── init.sql
3. 核心配置详解
3.1 服务配置矩阵
build
build: ./dir
image
image: nginx:alpine
ports
\"8000:8000\"
volumes
- ./data:/var/lib/mysql
environment
DEBUG: \"true\"
depends_on
depends_on: [db]
networks
networks: [backend]
3.2 网络拓扑示例
#mermaid-svg-2Ot2Caxhv0FALMJu {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu .error-icon{fill:#552222;}#mermaid-svg-2Ot2Caxhv0FALMJu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2Ot2Caxhv0FALMJu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2Ot2Caxhv0FALMJu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2Ot2Caxhv0FALMJu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2Ot2Caxhv0FALMJu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2Ot2Caxhv0FALMJu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2Ot2Caxhv0FALMJu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2Ot2Caxhv0FALMJu .marker.cross{stroke:#333333;}#mermaid-svg-2Ot2Caxhv0FALMJu svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2Ot2Caxhv0FALMJu .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu .cluster-label text{fill:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu .cluster-label span{color:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu .label text,#mermaid-svg-2Ot2Caxhv0FALMJu span{fill:#333;color:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu .node rect,#mermaid-svg-2Ot2Caxhv0FALMJu .node circle,#mermaid-svg-2Ot2Caxhv0FALMJu .node ellipse,#mermaid-svg-2Ot2Caxhv0FALMJu .node polygon,#mermaid-svg-2Ot2Caxhv0FALMJu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2Ot2Caxhv0FALMJu .node .label{text-align:center;}#mermaid-svg-2Ot2Caxhv0FALMJu .node.clickable{cursor:pointer;}#mermaid-svg-2Ot2Caxhv0FALMJu .arrowheadPath{fill:#333333;}#mermaid-svg-2Ot2Caxhv0FALMJu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2Ot2Caxhv0FALMJu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2Ot2Caxhv0FALMJu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-2Ot2Caxhv0FALMJu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-2Ot2Caxhv0FALMJu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2Ot2Caxhv0FALMJu .cluster text{fill:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu .cluster span{color:#333;}#mermaid-svg-2Ot2Caxhv0FALMJu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2Ot2Caxhv0FALMJu :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 网络划分 公共网络 后端网络 数据库网络 数据库网络 public (bridge) backend (自定义) database (自定义) 前端服务 用户 API服务 MySQL Redis
4. 企业级部署方案
4.1 多环境配置管理
#mermaid-svg-hosF5kRBjDSziNRX {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hosF5kRBjDSziNRX .error-icon{fill:#552222;}#mermaid-svg-hosF5kRBjDSziNRX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hosF5kRBjDSziNRX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hosF5kRBjDSziNRX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hosF5kRBjDSziNRX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hosF5kRBjDSziNRX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hosF5kRBjDSziNRX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hosF5kRBjDSziNRX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hosF5kRBjDSziNRX .marker.cross{stroke:#333333;}#mermaid-svg-hosF5kRBjDSziNRX svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hosF5kRBjDSziNRX .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hosF5kRBjDSziNRX .cluster-label text{fill:#333;}#mermaid-svg-hosF5kRBjDSziNRX .cluster-label span{color:#333;}#mermaid-svg-hosF5kRBjDSziNRX .label text,#mermaid-svg-hosF5kRBjDSziNRX span{fill:#333;color:#333;}#mermaid-svg-hosF5kRBjDSziNRX .node rect,#mermaid-svg-hosF5kRBjDSziNRX .node circle,#mermaid-svg-hosF5kRBjDSziNRX .node ellipse,#mermaid-svg-hosF5kRBjDSziNRX .node polygon,#mermaid-svg-hosF5kRBjDSziNRX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hosF5kRBjDSziNRX .node .label{text-align:center;}#mermaid-svg-hosF5kRBjDSziNRX .node.clickable{cursor:pointer;}#mermaid-svg-hosF5kRBjDSziNRX .arrowheadPath{fill:#333333;}#mermaid-svg-hosF5kRBjDSziNRX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hosF5kRBjDSziNRX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hosF5kRBjDSziNRX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hosF5kRBjDSziNRX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hosF5kRBjDSziNRX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hosF5kRBjDSziNRX .cluster text{fill:#333;}#mermaid-svg-hosF5kRBjDSziNRX .cluster span{color:#333;}#mermaid-svg-hosF5kRBjDSziNRX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hosF5kRBjDSziNRX :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 文件结构 docker-compose.yml docker-compose.override.yml docker-compose.test.yml docker-compose.prod.yml 基础配置 开发覆盖 测试覆盖 生产覆盖
启动命令示例:
# 开发环境(加载override)docker-compose up# 测试环境docker-compose -f docker-compose.yml -f docker-compose.test.yml up# 生产环境docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
4.2 扩展部署架构
#mermaid-svg-jqvp8JpPNhnbp3qd {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd .error-icon{fill:#552222;}#mermaid-svg-jqvp8JpPNhnbp3qd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jqvp8JpPNhnbp3qd .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jqvp8JpPNhnbp3qd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jqvp8JpPNhnbp3qd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jqvp8JpPNhnbp3qd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jqvp8JpPNhnbp3qd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jqvp8JpPNhnbp3qd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jqvp8JpPNhnbp3qd .marker.cross{stroke:#333333;}#mermaid-svg-jqvp8JpPNhnbp3qd svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jqvp8JpPNhnbp3qd .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd .cluster-label text{fill:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd .cluster-label span{color:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd .label text,#mermaid-svg-jqvp8JpPNhnbp3qd span{fill:#333;color:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd .node rect,#mermaid-svg-jqvp8JpPNhnbp3qd .node circle,#mermaid-svg-jqvp8JpPNhnbp3qd .node ellipse,#mermaid-svg-jqvp8JpPNhnbp3qd .node polygon,#mermaid-svg-jqvp8JpPNhnbp3qd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jqvp8JpPNhnbp3qd .node .label{text-align:center;}#mermaid-svg-jqvp8JpPNhnbp3qd .node.clickable{cursor:pointer;}#mermaid-svg-jqvp8JpPNhnbp3qd .arrowheadPath{fill:#333333;}#mermaid-svg-jqvp8JpPNhnbp3qd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jqvp8JpPNhnbp3qd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jqvp8JpPNhnbp3qd .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-jqvp8JpPNhnbp3qd .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-jqvp8JpPNhnbp3qd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jqvp8JpPNhnbp3qd .cluster text{fill:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd .cluster span{color:#333;}#mermaid-svg-jqvp8JpPNhnbp3qd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jqvp8JpPNhnbp3qd :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} compose配置 deploy: replicas: 5 image: redis:6 image: mysql:8 负载均衡 Web集群 Web集群 Redis缓存 MySQL主从
5. 高级技巧与优化
5.1 性能优化策略
#mermaid-svg-gsAUI1eEkb8IiESr {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gsAUI1eEkb8IiESr .error-icon{fill:#552222;}#mermaid-svg-gsAUI1eEkb8IiESr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gsAUI1eEkb8IiESr .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gsAUI1eEkb8IiESr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gsAUI1eEkb8IiESr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gsAUI1eEkb8IiESr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gsAUI1eEkb8IiESr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gsAUI1eEkb8IiESr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gsAUI1eEkb8IiESr .marker.cross{stroke:#333333;}#mermaid-svg-gsAUI1eEkb8IiESr svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gsAUI1eEkb8IiESr .mermaid-main-font{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-gsAUI1eEkb8IiESr .exclude-range{fill:#eeeeee;}#mermaid-svg-gsAUI1eEkb8IiESr .section{stroke:none;opacity:0.2;}#mermaid-svg-gsAUI1eEkb8IiESr .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-gsAUI1eEkb8IiESr .section2{fill:#fff400;}#mermaid-svg-gsAUI1eEkb8IiESr .section1,#mermaid-svg-gsAUI1eEkb8IiESr .section3{fill:white;opacity:0.2;}#mermaid-svg-gsAUI1eEkb8IiESr .sectionTitle0{fill:#333;}#mermaid-svg-gsAUI1eEkb8IiESr .sectionTitle1{fill:#333;}#mermaid-svg-gsAUI1eEkb8IiESr .sectionTitle2{fill:#333;}#mermaid-svg-gsAUI1eEkb8IiESr .sectionTitle3{fill:#333;}#mermaid-svg-gsAUI1eEkb8IiESr .sectionTitle{text-anchor:start;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-gsAUI1eEkb8IiESr .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-gsAUI1eEkb8IiESr .grid .tick text{font-family:\"trebuchet ms\",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-gsAUI1eEkb8IiESr .grid path{stroke-width:0;}#mermaid-svg-gsAUI1eEkb8IiESr .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-gsAUI1eEkb8IiESr .task{stroke-width:2;}#mermaid-svg-gsAUI1eEkb8IiESr .taskText{text-anchor:middle;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutsideRight{fill:black;text-anchor:start;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-gsAUI1eEkb8IiESr .task.clickable{cursor:pointer;}#mermaid-svg-gsAUI1eEkb8IiESr .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-gsAUI1eEkb8IiESr .taskText0,#mermaid-svg-gsAUI1eEkb8IiESr .taskText1,#mermaid-svg-gsAUI1eEkb8IiESr .taskText2,#mermaid-svg-gsAUI1eEkb8IiESr .taskText3{fill:white;}#mermaid-svg-gsAUI1eEkb8IiESr .task0,#mermaid-svg-gsAUI1eEkb8IiESr .task1,#mermaid-svg-gsAUI1eEkb8IiESr .task2,#mermaid-svg-gsAUI1eEkb8IiESr .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutside0,#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutside2{fill:black;}#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutside1,#mermaid-svg-gsAUI1eEkb8IiESr .taskTextOutside3{fill:black;}#mermaid-svg-gsAUI1eEkb8IiESr .active0,#mermaid-svg-gsAUI1eEkb8IiESr .active1,#mermaid-svg-gsAUI1eEkb8IiESr .active2,#mermaid-svg-gsAUI1eEkb8IiESr .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-gsAUI1eEkb8IiESr .activeText0,#mermaid-svg-gsAUI1eEkb8IiESr .activeText1,#mermaid-svg-gsAUI1eEkb8IiESr .activeText2,#mermaid-svg-gsAUI1eEkb8IiESr .activeText3{fill:black!important;}#mermaid-svg-gsAUI1eEkb8IiESr .done0,#mermaid-svg-gsAUI1eEkb8IiESr .done1,#mermaid-svg-gsAUI1eEkb8IiESr .done2,#mermaid-svg-gsAUI1eEkb8IiESr .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-gsAUI1eEkb8IiESr .doneText0,#mermaid-svg-gsAUI1eEkb8IiESr .doneText1,#mermaid-svg-gsAUI1eEkb8IiESr .doneText2,#mermaid-svg-gsAUI1eEkb8IiESr .doneText3{fill:black!important;}#mermaid-svg-gsAUI1eEkb8IiESr .crit0,#mermaid-svg-gsAUI1eEkb8IiESr .crit1,#mermaid-svg-gsAUI1eEkb8IiESr .crit2,#mermaid-svg-gsAUI1eEkb8IiESr .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-gsAUI1eEkb8IiESr .activeCrit0,#mermaid-svg-gsAUI1eEkb8IiESr .activeCrit1,#mermaid-svg-gsAUI1eEkb8IiESr .activeCrit2,#mermaid-svg-gsAUI1eEkb8IiESr .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-gsAUI1eEkb8IiESr .doneCrit0,#mermaid-svg-gsAUI1eEkb8IiESr .doneCrit1,#mermaid-svg-gsAUI1eEkb8IiESr .doneCrit2,#mermaid-svg-gsAUI1eEkb8IiESr .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-gsAUI1eEkb8IiESr .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-gsAUI1eEkb8IiESr .milestoneText{font-style:italic;}#mermaid-svg-gsAUI1eEkb8IiESr .doneCritText0,#mermaid-svg-gsAUI1eEkb8IiESr .doneCritText1,#mermaid-svg-gsAUI1eEkb8IiESr .doneCritText2,#mermaid-svg-gsAUI1eEkb8IiESr .doneCritText3{fill:black!important;}#mermaid-svg-gsAUI1eEkb8IiESr .activeCritText0,#mermaid-svg-gsAUI1eEkb8IiESr .activeCritText1,#mermaid-svg-gsAUI1eEkb8IiESr .activeCritText2,#mermaid-svg-gsAUI1eEkb8IiESr .activeCritText3{fill:black!important;}#mermaid-svg-gsAUI1eEkb8IiESr .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-gsAUI1eEkb8IiESr :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 0 5 10 15 20 25 30 资源限制 健康检查 分布式部署 自动扩展 基础优化 高级优化 优化实施路径
关键配置示例:
services: webapp: deploy: resources: limits: cpus: \'0.50\' memory: 512M restart_policy: condition: on-failure healthcheck: test: [\"CMD\", \"curl\", \"-f\", \"http://localhost\"] interval: 30s
5.2 安全最佳实践
6. 实战案例解析
6.1 微服务架构部署
version: \'3.8\'services: gateway: image: nginx-plus ports: [\"80:80\", \"443:443\"] depends_on: [auth, products] auth: build: ./auth-service environment: JWT_SECRET: ${JWT_SECRET} networks: [backend] products: build: ./product-service networks: [backend, cache] redis: image: redis:6 networks: [cache] volumes: [redis-data:/data]networks: backend: cache:volumes: redis-data:
6.2 CI/CD 集成流程
#mermaid-svg-NHm3FvVTkw64I5Oq {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq .error-icon{fill:#552222;}#mermaid-svg-NHm3FvVTkw64I5Oq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NHm3FvVTkw64I5Oq .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NHm3FvVTkw64I5Oq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NHm3FvVTkw64I5Oq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NHm3FvVTkw64I5Oq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NHm3FvVTkw64I5Oq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NHm3FvVTkw64I5Oq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NHm3FvVTkw64I5Oq .marker.cross{stroke:#333333;}#mermaid-svg-NHm3FvVTkw64I5Oq svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NHm3FvVTkw64I5Oq .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-NHm3FvVTkw64I5Oq text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-NHm3FvVTkw64I5Oq .actor-line{stroke:grey;}#mermaid-svg-NHm3FvVTkw64I5Oq .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq .sequenceNumber{fill:white;}#mermaid-svg-NHm3FvVTkw64I5Oq #sequencenumber{fill:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq .messageText{fill:#333;stroke:#333;}#mermaid-svg-NHm3FvVTkw64I5Oq .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-NHm3FvVTkw64I5Oq .labelText,#mermaid-svg-NHm3FvVTkw64I5Oq .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-NHm3FvVTkw64I5Oq .loopText,#mermaid-svg-NHm3FvVTkw64I5Oq .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-NHm3FvVTkw64I5Oq .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-NHm3FvVTkw64I5Oq .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-NHm3FvVTkw64I5Oq .noteText,#mermaid-svg-NHm3FvVTkw64I5Oq .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-NHm3FvVTkw64I5Oq .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-NHm3FvVTkw64I5Oq .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-NHm3FvVTkw64I5Oq .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-NHm3FvVTkw64I5Oq .actorPopupMenu{position:absolute;}#mermaid-svg-NHm3FvVTkw64I5Oq .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-NHm3FvVTkw64I5Oq .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-NHm3FvVTkw64I5Oq .actor-man circle,#mermaid-svg-NHm3FvVTkw64I5Oq line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-NHm3FvVTkw64I5Oq :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 开发者 Git仓库 CI服务器 镜像仓库 生产服务器 提交代码 触发构建 运行测试 构建推送镜像 执行部署命令 拉取最新镜像 docker-compose up -d 开发者 Git仓库 CI服务器 镜像仓库 生产服务器
7. 常见问题排查
7.1 问题诊断流程图
#mermaid-svg-AUUh4X82E5QoVX7z {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AUUh4X82E5QoVX7z .error-icon{fill:#552222;}#mermaid-svg-AUUh4X82E5QoVX7z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AUUh4X82E5QoVX7z .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AUUh4X82E5QoVX7z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AUUh4X82E5QoVX7z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AUUh4X82E5QoVX7z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AUUh4X82E5QoVX7z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AUUh4X82E5QoVX7z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AUUh4X82E5QoVX7z .marker.cross{stroke:#333333;}#mermaid-svg-AUUh4X82E5QoVX7z svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AUUh4X82E5QoVX7z .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AUUh4X82E5QoVX7z .cluster-label text{fill:#333;}#mermaid-svg-AUUh4X82E5QoVX7z .cluster-label span{color:#333;}#mermaid-svg-AUUh4X82E5QoVX7z .label text,#mermaid-svg-AUUh4X82E5QoVX7z span{fill:#333;color:#333;}#mermaid-svg-AUUh4X82E5QoVX7z .node rect,#mermaid-svg-AUUh4X82E5QoVX7z .node circle,#mermaid-svg-AUUh4X82E5QoVX7z .node ellipse,#mermaid-svg-AUUh4X82E5QoVX7z .node polygon,#mermaid-svg-AUUh4X82E5QoVX7z .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AUUh4X82E5QoVX7z .node .label{text-align:center;}#mermaid-svg-AUUh4X82E5QoVX7z .node.clickable{cursor:pointer;}#mermaid-svg-AUUh4X82E5QoVX7z .arrowheadPath{fill:#333333;}#mermaid-svg-AUUh4X82E5QoVX7z .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AUUh4X82E5QoVX7z .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AUUh4X82E5QoVX7z .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-AUUh4X82E5QoVX7z .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-AUUh4X82E5QoVX7z .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AUUh4X82E5QoVX7z .cluster text{fill:#333;}#mermaid-svg-AUUh4X82E5QoVX7z .cluster span{color:#333;}#mermaid-svg-AUUh4X82E5QoVX7z div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AUUh4X82E5QoVX7z :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 否 是 是 否 诊断命令 docker-compose ps docker-compose logs docker-compose exec service ping 服务异常 检查服务状态 容器运行中? 查看容器日志 测试服务连通性 网络问题? 检查网络配置 检查应用日志 分析启动错误 验证DNS解析 排查应用异常
8. 版本演进与趋势
8.1 Compose特性发展
8.2 未来技术方向
- 云原生集成:更好支持Kubernetes
- 智能扩展:基于指标的自动伸缩
- 策略即代码:内置安全合规检查
- 混合环境:统一管理本地和云资源
通过本指南,您已掌握从基础到高级的Docker Compose技术栈。实际应用中建议:
- 开发环境使用override方便调试
- 生产环境严格配置资源限制
- 结合监控工具实现自动化运维