介绍

使用 Docker Compose 快速部署一个完整的 LNMP(Linux + Nginx + MySQL + PHP)环境,并在此基础上部署 Zabbix 监控系统。通过分阶段部署,可以先验证基础 Web 服务环境,再搭建功能强大的监控平台。整个过程基于容器化技术,确保环境隔离与部署可重复性。

环境规划

在开始部署前,请确保您已准备好以下环境与资源:

  1. 服务器要求

    • 操作系统:建议使用 CentOS 7/8、Ubuntu 20.04/22.04 或其它主流 Linux 发行版。
    • Docker 与 Docker Compose:已安装并配置完成。这是运行所有服务的基础。
    • 资源:建议至少 2 核 CPU,4GB 内存,20GB 可用磁盘空间。Zabbix 服务对内存有一定要求。
  2. 网络与端口规划

    • LNMP 阶段:将临时占用 80 (HTTP) 和 3306 (MySQL) 端口用于测试。
    • Zabbix 阶段:将永久使用 8080 (Web 界面)、10051 (Server) 和 10050 (Agent) 端口。3306 端口同样被 Zabbix 的 MySQL 容器使用,因此两个阶段不能同时运行。
    • 重要提醒:请确保服务器的防火墙或安全组已放行上述端口。
  3. 目录结构规划
    为保持清晰,我们将创建两个独立的项目目录:

    • /opt/lnmp:存放 LNMP 环境的所有配置、数据和代码。
    • /opt/zabbix:存放 Zabbix 监控系统的所有配置、数据和脚本。
  4. 部署流程概述
    本文将分为两个清晰的阶段进行:

    • 第一阶段:部署并测试 LNMP 基础环境,完成后将其停止以释放端口。
    • 第二阶段:在同一个服务器上部署完整的 Zabbix 监控套件(包含 MySQL、Server、Web 和 Agent)。

第一阶段:部署 LNMP 环境 (Nginx + PHP + MySQL)

一阶段搭建一个基础的 Web 服务环境,并测试 PHP 是否能正常解析。

1. 创建目录并编写配置文件

首先,需要创建项目目录结构,并写入 docker-compose.yml 以及 Nginx、PHP 的相关配置。

请在终端中依次执行以下命令:

# 1. 创建目录结构
mkdir -pv /opt/lnmp/{nginx/conf.d,php,mysql/data,www}
cd /opt/lnmp

# 2. 创建 Docker Compose 主配置文件
cat > docker-compose.yml <<'EOF'
services:
  nginx:
    image: nginx:1.24-alpine
    container_name: lnmp_nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./www:/usr/share/nginx/html
      - ./nginx/logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - lnmp_net
    restart: always
  php:
    image: php:8.1-fpm-alpine
    container_name: lnmp_php
    volumes:
      - ./www:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro
    networks:
      - lnmp_net
    restart: always
  mysql:
    image: mysql:8.0
    container_name: lnmp_mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: RootPass!123
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: AppPass!123
    volumes:
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - lnmp_net
    restart: always
networks:
  lnmp_net:
    driver: bridge
EOF

# 3. 创建 Nginx 虚拟主机配置 (default.conf)
cat > ./nginx/conf.d/default.conf <<'EOF'
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF

# 4. 创建 PHP 配置文件 (php.ini)
mkdir -p ./php
cat > ./php/php.ini <<'EOF'
upload_max_filesize = 64M
post_max_size = 64M
date.timezone = Asia/Shanghai
EOF

# 5. 创建测试页面 (index.php)
cat > ./www/index.php <<'EOF'
<?php
phpinfo();
?>
EOF
2. 启动并测试 LNMP

配置完成后,启动容器并验证服务是否正常。

# 启动服务 (在 /opt/lnmp 目录下执行)
docker compose up -d

# 查看运行状态,确保三个容器状态均为 Up
docker compose ps

# 测试 PHP 解析 (如果返回 PHP 信息页面代码,说明成功)
curl http://localhost
3. 停止 LNMP (为 Zabbix 腾出端口)

因为 Zabbix 也需要使用 80 和 3306 端口,测试完 LNMP 后,请务必执行关闭操作。

docker compose down

第二阶段:部署 Zabbix 监控系统

这一阶段我们将部署包含 MySQL、Zabbix Server、Web 前端和 Agent 的完整监控套件。

1. 创建目录并编写配置文件

切换到 Zabbix 目录,并写入包含所有组件的 docker-compose.yml

# 1. 创建目录并进入
mkdir -pv /opt/zabbix/{mysql-data,alertscripts,externalscripts,zbx_env}
cd /opt/zabbix

# 2. 创建 Zabbix 的 Docker Compose 配置文件
cat > docker-compose.yml <<'EOF'
services:
  mysql:
    image: mysql:8.0
    container_name: zabbix-mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_bin
      - --default-authentication-plugin=mysql_native_password
      - --log_bin_trust_function_creators=1
    environment:
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: ZabbixPass!123
      MYSQL_ROOT_PASSWORD: RootPass!123
    volumes:
      - ./mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - zabbix-net
    restart: always
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pRootPass!123"]
      interval: 10s
      timeout: 5s
      retries: 5
  zabbix-server:
    image: zabbix/zabbix-server-mysql:6.0-centos-latest
    container_name: zabbix-server
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: ZabbixPass!123
      MYSQL_ROOT_PASSWORD: RootPass!123
    ports:
      - "10051:10051"
    volumes:
      - ./alertscripts:/usr/lib/zabbix/alertscripts
      - ./externalscripts:/usr/lib/zabbix/externalscripts
      - ./zbx_env:/var/lib/zabbix
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - zabbix-net
    restart: always
  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:6.0-centos-latest
    container_name: zabbix-web
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: ZabbixPass!123
      MYSQL_ROOT_PASSWORD: RootPass!123
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Asia/Shanghai
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - zabbix-server
    networks:
      - zabbix-net
    restart: always
  zabbix-agent:
    image: zabbix/zabbix-agent:6.0-centos-latest
    container_name: zabbix-agent
    environment:
      ZBX_HOSTNAME: Zabbix server
      ZBX_SERVER_HOST: zabbix-server
      ZBX_SERVER_PORT: 10051
    ports:
      - "10050:10050"
    depends_on:
      - zabbix-server
    networks:
      - zabbix-net
    restart: always
networks:
  zabbix-net:
    driver: bridge
EOF
2. 启动 Zabbix

执行启动命令,由于 Zabbix 初始化数据库需要一点时间,启动过程可能稍慢。

# 启动 Zabbix 全家桶
docker compose up -d
3. 访问与登录

服务启动后(建议等待 1-2 分钟让数据库初始化完成),即可通过浏览器访问。

  • 访问地址http://<你的服务器IP>:8080
  • 登录账号Admin (注意首字母大写)
  • 登录密码zabbix

更多推荐