一、认识 Docker Compose

Docker Compose 是 Docker 官方提供的多容器编排工具,用于定义和管理多个容器的运行。
通过一个简单的 docker-compose.yml 文件,即可定义整个项目的服务、网络和存储。

一句话总结:Docker Compose 是让多容器协同工作的“指挥家”。

核心功能:

  • 一键启动、停止、销毁整个项目环境

  • 支持多容器依赖管理

  • 统一网络与卷配置

  • 支持环境变量和构建参数

  • 适合开发、测试、持续集成场景


二、安装 Docker Compose

Ubuntu / Debian

sudo apt update sudo apt install docker-compose -y

CentOS

sudo yum install epel-release -y sudo yum install docker-compose -y

查看版本:


docker-compose -v


三、Docker Compose 文件结构

docker-compose.yml 文件描述整个容器应用的定义。

基本结构:


version: "3.9" services: web: image: nginx db: image: mysql

主要组成部分:

元素说明
versionCompose 文件版本
services定义服务(即容器)
networks自定义网络
volumes挂载存储卷
environment环境变量设置

四、第一个 Compose 项目

创建目录:


mkdir myapp && cd myapp

创建 docker-compose.yml


version: "3.9" services: web: image: nginx ports: - "8080:80"

运行:


docker-compose up -d

访问:


http://localhost:8080

停止:


docker-compose down


五、服务依赖与多容器应用

示例:Nginx + PHP + MySQL


version: "3.9" services: web: image: nginx ports: - "8080:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - php php: image: php:8.1-fpm volumes: - ./code:/var/www/html db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: shop MYSQL_USER: shopuser MYSQL_PASSWORD: shoppass volumes: - db_data:/var/lib/mysql volumes: db_data:

启动:


docker-compose up -d

访问 Nginx 服务自动连接 PHP 与 MySQL。


六、网络配置

Docker Compose 默认会创建独立网络。

查看网络:


docker network ls

定义自定义网络:


networks: app_net: driver: bridge

在服务中指定:


services: web: networks: - app_net db: networks: - app_net


七、数据卷管理

定义持久化卷:


volumes: db_data: driver: local

挂载主机目录:


services: app: volumes: - ./data:/usr/src/app/data

查看卷:


docker volume ls

删除卷:


docker volume rm myapp_db_data


八、环境变量管理

使用 .env 文件存储变量。

.env:


MYSQL_ROOT_PASSWORD=root123 MYSQL_DATABASE=shop

docker-compose.yml:


services: db: image: mysql environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE}

Compose 会自动读取 .env 文件。

参考案例:www.syggyi.cn


九、构建自定义镜像

目录结构:


. ├── app │ ├── Dockerfile │ └── app.py └── docker-compose.yml

Dockerfile:


FROM python:3.10 WORKDIR /app COPY app.py . RUN pip install flask CMD ["python", "app.py"]

docker-compose.yml:


services: web: build: ./app ports: - "5000:5000"

构建与运行:


docker-compose up -d --build


十、Compose 常用命令

命令功能
docker-compose up启动容器
docker-compose down停止并删除容器
docker-compose ps查看运行容器
docker-compose logs查看日志
docker-compose restart重启所有服务
docker-compose exec在容器内执行命令
docker-compose build构建镜像
docker-compose pull拉取镜像
docker-compose config检查配置文件

十一、Compose 文件拆分

不同环境使用多个文件:


docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

示例:

docker-compose.yml:


services: web: image: myapp ports: - "8080:80"

docker-compose.prod.yml:


services: web: environment: - ENV=production


十二、服务伸缩

快速扩容:


docker-compose up --scale web=3 -d

Compose 自动创建:


myapp_web_1 myapp_web_2 myapp_web_3

结合 Nginx 可实现负载均衡。


十三、Compose 与日志管理

查看实时日志:


docker-compose logs -f web

限制日志大小(防止日志爆满):


logging: driver: "json-file" options: max-size: "10m" max-file: "3"


十四、健康检查(Healthcheck)


services: db: image: mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 3

检查服务健康状态:


docker inspect --format='{{json .State.Health}}' myapp_db_1


十五、Compose + Prometheus 监控

增加 Prometheus 容器:


prometheus: image: prom/prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090"

Prometheus 自动监控 Compose 中的容器性能指标。


十六、Compose + Grafana 可视化

添加 Grafana 服务:


grafana: image: grafana/grafana ports: - "3000:3000" depends_on: - prometheus

Grafana 配置数据源:


http://prometheus:9090

即可实时展示容器 CPU、内存、网络流量。


十七、Compose + ELK 日志系统


services: elasticsearch: image: elasticsearch:8.14.0 environment: - discovery.type=single-node logstash: image: logstash depends_on: - elasticsearch kibana: image: kibana ports: - "5601:5601" depends_on: - elasticsearch

Compose 实现日志采集、分析与可视化。


十八、Compose 文件模板变量

使用 ${VAR} 支持灵活部署:

docker-compose.yml:


services: app: image: myapp:${APP_VERSION}

.env:


APP_VERSION=1.2.0

运行时替换成 myapp:1.2.0


十九、Compose 与 CI/CD 集成

在 Jenkins Pipeline 中:


pipeline { agent any stages { stage('Deploy') { steps { sh 'docker-compose -f docker-compose.prod.yml up -d --build' } } } }

实现自动化构建与部署流程。


二十、完整实战项目:一键部署完整网站环境

目标:
使用 Docker Compose 一键部署 Nginx + PHP + MySQL + phpMyAdmin 网站系统。

项目结构:

myweb/ ├── docker-compose.yml ├── code/ │ └── index.php

index.php:

<?php $conn = mysqli_connect("db", "root", "root123", "mydb"); if ($conn) { echo "<h2>连接成功!这是Docker Compose自动部署的网站。</h2>"; } ?>

docker-compose.yml:

version: "3.9" services: web: image: nginx ports: - "8080:80" volumes: - ./code:/var/www/html - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - php - db php: image: php:8.1-fpm volumes: - ./code:/var/www/html db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: mydb volumes: - db_data:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin ports: - "8081:80" environment: PMA_HOST: db volumes: db_data:

启动:


docker-compose up -d

访问:

  • 网站首页:http://localhost:8080

  • 数据库管理:http://localhost:8081

一条命令,搭建完整的 LEMP 架构。

更多推荐