Docker Compose实战案例:一键部署WordPress+Prometheus监控平台

在Docker容器化运维中,当需要部署多容器交互的应用时,手动执行docker run命令逐个启动容器、配置网络和挂载目录,不仅繁琐易错,还难以维护容器间的依赖关系。Docker Compose作为Docker官方的容器编排工具,可通过一个YAML配置文件,定义多容器应用的服务、网络、数据卷等信息,实现"一键部署、一键启停、统一维护",大幅提升部署效率。

本文将通过两个高频实战案例,从脚本编写、部署操作、维护管理三个维度,详细讲解Docker Compose的使用方法,覆盖"简单双容器应用(WordPress)"和"复杂三容器应用(Prometheus监控)",适配CentOS、银河麒麟V10等Linux系统,新手也能直接复刻实操。

一、Docker Compose核心优势(前置认知)

  • 统一配置:所有容器的启动参数、网络、数据卷都集中在一个docker-compose.yml文件中,便于版本管理和迁移;

  • 一键操作:通过单条命令实现多容器的启动、停止、重启、删除,无需逐个操作容器;

  • 依赖管理:可配置容器启动顺序,解决多容器间的依赖问题(如先启动数据库,再启动应用);

  • 网络自动配置:自动创建自定义网络,容器间可通过服务名直接通信,无需手动配置网络。

前提:已安装Docker和Docker Compose(安装命令可直接复制执行):

复制代码
# 安装Docker(CentOS7/8通用)
yum install docker -y
systemctl start docker
systemctl enable docker

# 安装Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

二、实战案例一:Docker Compose一键部署WordPress博客系统

WordPress是基于PHP开发的开源博客系统,依赖MySQL数据库存储数据,属于典型的"应用+数据库"双容器架构。本案例使用华为云国内镜像,实现WordPress的一键部署、数据持久化和外网访问。

1. 编写docker-compose.yml配置脚本

创建部署目录,编写配置文件(脚本可直接复制,无需修改核心参数):

复制代码
version: '3'
services:
  # MySQL数据库服务
  wp-mysql:
   image: swr.cn-north-1.myhuaweicloud.com/iivey/mysql:8.0.23  # 国内镜像,下载速度快
   restart: unless-stopped  # 容器异常自动重启,保障服务可用性
   ports:
     - "3306:3306"  # 端口映射:宿主机3306 → 容器3306(可根据需求修改宿主机端口)
   volumes:
     - /etc/localtime:/etc/localtime  # 同步宿主机时区
     - /dockerdata/wp/db:/var/lib/mysql  # 数据持久化:挂载MySQL数据到宿主机
   environment:
     - MYSQL_DATABASE=wordpress  # 自动创建wordpress数据库
     - MYSQL_USER=wordpress      # 自动创建wordpress数据库用户
     - MYSQL_PASSWORD=wordpress123  # 数据库用户密码
     - MYSQL_ROOT_PASSWORD=root123  # MySQL root用户密码
   command:
     - mysqld
     - --default-authentication-plugin=mysql_native_password  # 兼容MySQL8.0密码认证
     - --character-set-server=utf8  # 设置字符集为utf8
     - --collation-server=utf8_bin
   networks:
     - wp_net  # 加入自定义网络wp_net

  # WordPress应用服务
  wordpress:
    image: swr.cn-north-1.myhuaweicloud.com/iivey/wordpress:latest  # 包含Apache+PHP环境
    restart: unless-stopped
    ports:
      - "80:80"  # 端口映射:宿主机80端口(外网可直接访问)
    volumes:
      - /etc/localtime:/etc/localtime  # 同步时区
      - /dockerdata/wp/www:/var/www/html  # 持久化WordPress程序文件
    networks:
      - wp_net  # 与MySQL容器同网络,可通过服务名通信

# 自定义桥接网络(容器间通信)
networks:
  wp_net:
    driver: bridge

2. 一键部署WordPress环境

执行以下命令,完成部署(全程无需手动干预):

复制代码
# 1. 创建部署目录(规范存储配置文件和数据)
mkdir -p /data/wp
# 2. 将编写好的docker-compose.yml文件复制到部署目录
cp docker-compose.yml /data/wp
# 3. 进入部署目录,启动服务
cd /data/wp
docker-compose up -d

关键说明:

  • docker-compose up -d:后台启动所有容器,自动创建wp_net网络和挂载目录;

  • 首次启动会自动拉取镜像,耐心等待(国内镜像约1-3分钟);

  • 查看容器启动状态:docker-compose ps,若两个容器STATUS均为"Up",则部署成功。

启动成功示例:

复制代码
[root@localhost wp]# docker-compose  ps
NAME               IMAGE                                                    COMMAND                  SERVICE         CREATED        STATUS              PORTS
wp-wordpress-1     swr.cn-north-1.myhuaweicloud.com/iivey/wordpress:latest   "docker-entrypoint.s..."   wordpress       12 seconds ago  Up 11 seconds       0.0.0.0:80->80/tcp, :::80->80/tcp
wp-wp-mysql-1      swr.cn-north-1.myhuaweicloud.com/iivey/mysql:8.0.23       "docker-entrypoint.s..."   wp-mysql        12 seconds ago  Up 11 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp

3. Docker Compose常用维护命令

部署完成后,可通过以下命令管理容器服务,无需逐个操作容器:

复制代码
# 1. 查看容器内进程状态
docker-compose top

# 2. 查看所有容器运行日志(排查报错)
docker-compose logs

# 3. 查看指定容器日志(如MySQL容器)
docker-compose logs wp-mysql

# 4. 暂时停止所有容器(不删除容器和数据)
docker-compose stop

# 5. 重启所有容器
docker-compose restart

# 6. 停止并删除所有容器、网络(保留数据卷)
docker-compose down

# 7. 停止并删除所有容器、网络、数据卷(彻底清理)
docker-compose down -v

4. WordPress初始化配置(关键步骤)

容器启动正常后,通过浏览器访问WordPress,完成初始化配置:

  1. 访问地址:http://宿主机IP(无需加端口,默认80端口),进入语言选择界面:

  2. 选择"简体中文",点击"继续",进入数据库信息准备界面:

  3. 点击"现在就开始",进入数据库连接配置界面(参数与docker-compose.yml中一致):

    1. 数据库名:wordpress(与MYSQL_DATABASE一致);

    2. 用户名:wordpress(与MYSQL_USER一致);

    3. 密码:wordpress123(与MYSQL_PASSWORD一致);

    4. 数据库主机:wp-mysql(重点!填写MySQL容器服务名,而非IP,容器间通过服务名通信);

    5. 表前缀:默认wp_(无需修改)。

  4. 点击"提交",完成数据库连接,后续按提示设置站点名称、管理员账号密码,即可完成WordPress初始化,正常使用博客系统。

三、实战案例二:Docker Compose一键部署Prometheus监控平台

Prometheus是开源的监控系统,常用于服务器、容器、应用的指标采集和分析,通常需要配合node-exporter(指标采集)和Grafana(可视化面板)使用,属于"三容器交互"的复杂应用。本案例使用Prometheus官方镜像,实现监控平台的一键部署。

1. 编写docker-compose.yml配置脚本

创建部署目录,编写配置文件(包含node-exporter、prometheus、grafana三个服务):

复制代码
version: '3.8'  # 兼容更多Docker特性,推荐使用

services:
  # 1. node-exporter:采集宿主机系统指标(CPU、内存、磁盘等)
  node-exporter:
    image: prom/node-exporter:v1.9.1  # 官方镜像,稳定可靠
    container_name: node-exporter  # 自定义容器名,便于管理
    ports:
      - "9100:9100"  # 指标采集端口
    volumes:
      - /etc/localtime:/etc/localtime:ro  # 同步时区,只读模式
      - /proc:/host/proc:ro  # 挂载宿主机proc目录,采集系统进程信息
      - /sys:/host/sys:ro    # 挂载宿主机sys目录,采集系统硬件信息
    networks:
      - prom_net
    command:
      - --path.procfs=/host/proc  # 指定procfs路径
      - --path.sysfs=/host/sys    # 指定sysfs路径

  # 2. Prometheus:核心监控服务,存储和分析指标数据
  prometheus:
    image: prom/prometheus:v2.53.4
    container_name: prometheus
    ports:
      - "9090:9090"  # Web UI端口,用于查看监控指标
    volumes:
      - /data/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml  # 挂载自定义配置文件
      - prometheusdata:/prometheus  # 命名卷,持久化监控数据
    networks:
      - prom_net

  # 3. Grafana:可视化面板,展示监控数据(图表化展示)
  grafana:
    image: grafana/grafana:12.0.1
    container_name: grafana
    ports:
      - "3000:3000"  # Grafana Web UI端口
    volumes:
      - grafana:/var/lib/grafana  # 命名卷,持久化Grafana配置和面板数据
    networks:
      - prom_net

# 自定义网络:三个服务同网络,实现相互通信
networks:
  prom_net:
    driver: bridge

# 命名卷:持久化数据,容器删除后数据不丢失
volumes:
  prometheusdata:
  grafana:

2. 配置Prometheus采集规则(关键)

Prometheus需要通过配置文件指定采集目标(如node-exporter的指标),创建配置文件prometheus.yml:

复制代码
# 创建配置文件目录
mkdir -p /data/prometheus/conf

# 编写配置文件
cat /data/prometheus/conf/prometheus.yml
global:
  scrape_interval: 15s  # 指标采集间隔(15秒一次)
  evaluation_interval: 15s  # 告警检测间隔(15秒一次)

scrape_configs:
  # 采集Prometheus自身的监控指标
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  # 采集node-exporter的宿主机指标
  - job_name: "node"
    static_configs:
      - targets: ["node-exporter:9100"]  # 填写node-exporter服务名,无需IP

3. 一键部署Prometheus监控平台

执行以下命令,完成部署:

复制代码
# 1. 创建部署目录
mkdir -p /data/prometheus
# 2. 将docker-compose.yml复制到部署目录
cp docker-compose.yml /data/prometheus
# 3. 进入部署目录,启动服务
cd /data/prometheus
docker-compose up -d

部署完成后,查看容器状态:docker-compose ps,确保三个容器均为"Up"状态,即可访问各服务。

4. 访问监控平台

  • Prometheus Web UI:http://宿主机IP:9090,可查看指标采集情况、执行查询语句;
  • Grafana Web UI:http://宿主机IP:3000,默认账号密码:admin/admin(首次登录需修改密码);
  • node-exporter指标:http://宿主机IP:9100/metrics,可查看采集到的宿主机系统指标。

补充:Grafana配置Prometheus数据源(简单步骤):

  1. 登录Grafana,点击左侧"齿轮"图标(Configuration),选择"Data Sources";

  2. 点击"Add data source",选择"Prometheus";

  3. 在URL中填写:http://prometheus:9090(Prometheus服务名),点击"Save & Test",提示"Data source is working"即配置成功;

  4. 导入官方Node Exporter仪表板(ID:1860),即可查看宿主机CPU、内存、磁盘等指标的图表化展示。

四、核心注意事项(避坑指南)

  • 镜像选择:优先使用国内镜像(如华为云、阿里云),避免官方镜像下载缓慢;

  • 容器通信:同网络内的容器,通过服务名通信(而非IP),IP会随容器重启变化;

  • 数据持久化:必须挂载数据卷(宿主机目录或命名卷),否则容器删除后数据丢失;

  • 端口冲突:部署前检查宿主机端口是否被占用(如80、3306、9090),避免端口冲突导致部署失败;

  • 时区同步:所有容器挂载/etc/localtime,确保容器时间与宿主机一致,避免日志、监控数据时间错乱。

五、总结

本文通过两个实战案例,讲解了Docker Compose在不同复杂度应用中的使用方法:从简单的双容器WordPress博客系统,到复杂的三容器Prometheus监控平台,核心都是通过docker-compose.yml统一配置,实现"一键部署、统一维护"。

Docker Compose的核心价值的是"简化多容器编排",尤其适用于开发环境、测试环境和中小型生产环境,能够大幅减少运维成本,避免手动操作的失误。掌握本文的两个案例,可轻松应对大部分多容器应用的部署需求,后续可扩展到Docker Compose编排LNMP、Zabbix等更复杂的应用。

相关推荐
陈陈CHENCHEN5 小时前
【Linux】Rsync + Inotify 实时文件同步案例
linux·运维·服务器
xhbh6666 小时前
光纤端口映射完全教程:光猫虚拟服务器配置+免费穿透工具实战
运维·服务器·网络·智能路由器·端口映射·流量端口转发·ssh端口转发
初雪云6 小时前
让安卓发版再简单一点,体验一键自动化发布
android·运维·自动化
charlie1145141916 小时前
嵌入式Linux嵌入式Linux驱动开发:设备树驱动改造——从硬编码到设备树的实战之旅
linux·运维·驱动开发
再战300年6 小时前
docker快速部署kafka集群
docker·容器·kafka
春天的菠菜6 小时前
【私服】一步部署 Docker 私服
java·docker·容器
Hoxy.R6 小时前
银河麒麟 V10 离线安装 s3cmd 踩坑记录+存储负载均衡测试
linux·运维·华为·存储
栀椩6 小时前
Docker 命令速查手册
spring cloud·docker
野熊佩骑7 小时前
一文读懂Nginx 之 Ubuntu使用apt方式安装Nginx官方最新版本
linux·运维·服务器·nginx·ubuntu·http