从小白到精通——Docker Compose容器编排全攻略
一、认识 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
主要组成部分:
| 元素 | 说明 |
|---|---|
| version | Compose 文件版本 |
| 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 架构。
更多推荐
所有评论(0)