Docker容器化高可用架构部署方案(十八)

17-EFK-Zabbix部署脚本

本文档包含EFK日志收集和Zabbix监控系统的完整部署脚本,作为13-快速部署.md的补充。


EFK部署脚本

在所有节点执行EFK部署脚本。

Node1 EFK部署

复制代码
#!/bin/bash
# Node1 EFK部署脚本
​
set -e
​
echo "============================================"
echo "        Node1 EFK 部署脚本"
echo "============================================"
​
# 1. 创建目录
echo "[1/3] 创建配置目录..."
mkdir -p /opt/cluster-deploy/{config/fluentd,logs/elasticsearch}
​
# 2. 创建Fluentd配置
echo "[2/3] 创建Fluentd配置..."
cat > /opt/cluster-deploy/config/fluentd/fluentd-node1.conf << 'EOF'
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-containers.log.pos
  tag docker.*
  read_from_head true
  <parse>
    @type json
    time_type float
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
​
<filter docker.**>
  @type record_transformer
  <record>
    node_name Node1
  </record>
</filter>
​
<match docker.**>
  @type elasticsearch
  host 172.20.5.21
  port 9200
  logstash_format true
  logstash_prefix docker
  logstash_dateformat %Y.%m.%d
  flush_interval 10s
  buffer_type file
  buffer_path /var/log/fluentd-buffers/elasticsearch.buffer
  buffer_chunk_limit 2M
  buffer_queue_limit 256
</match>
EOF
​
# 3. 创建Docker Compose文件
echo "[3/3] 创建docker-compose-efk-node1.yml..."
cat > /opt/cluster-deploy/docker-compose-efk-node1.yml << 'EOF'
services:
  fluentd:
    image: fluent/fluentd:v1.16-1
    container_name: fluentd
    networks:
      manage-net:
        ipv4_address: 172.20.5.11
    volumes:
      - ./config/fluentd/fluentd-node1.conf:/fluentd/etc/fluent.conf:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - fluentd-buffer:/var/log/fluentd-buffers
    environment:
      - FLUENTD_CONF=fluent.conf
    restart: unless-stopped
    logging:
      driver: none
​
networks:
  manage-net:
    external: true
​
volumes:
  fluentd-buffer:
EOF
​
# 4. 启动服务
echo ""
echo "启动Fluentd..."
cd /opt/cluster-deploy
docker compose -f docker-compose-efk-node1.yml up -d
​
echo ""
echo "Node1 EFK部署完成!"

Node2 EFK部署

复制代码
#!/bin/bash
# Node2 EFK部署脚本
​
set -e
​
echo "============================================"
echo "        Node2 EFK 部署脚本"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/{config/fluentd,logs/elasticsearch}
​
# 2. 创建Fluentd配置
cat > /opt/cluster-deploy/config/fluentd/fluentd-node2.conf << 'EOF'
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-containers.log.pos
  tag docker.*
  read_from_head true
  <parse>
    @type json
    time_type float
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
​
<filter docker.**>
  @type record_transformer
  <record>
    node_name Node2
  </record>
</filter>
​
<match docker.**>
  @type elasticsearch
  host 172.20.5.21
  port 9200
  logstash_format true
  logstash_prefix docker
  logstash_dateformat %Y.%m.%d
  flush_interval 10s
  buffer_type file
  buffer_path /var/log/fluentd-buffers/elasticsearch.buffer
  buffer_chunk_limit 2M
  buffer_queue_limit 256
</match>
EOF
​
# 3. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-efk-node2.yml << 'EOF'
services:
  fluentd:
    image: fluent/fluentd:v1.16-1
    container_name: fluentd
    networks:
      manage-net:
        ipv4_address: 172.20.5.12
    volumes:
      - ./config/fluentd/fluentd-node2.conf:/fluentd/etc/fluent.conf:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - fluentd-buffer:/var/log/fluentd-buffers
    environment:
      - FLUENTD_CONF=fluent.conf
    restart: unless-stopped
    logging:
      driver: none
​
networks:
  manage-net:
    external: true
​
volumes:
  fluentd-buffer:
EOF
​
# 4. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-efk-node2.yml up -d
​
echo "Node2 EFK部署完成!"

Node3 EFK部署

复制代码
#!/bin/bash
# Node3 EFK部署脚本
​
set -e
​
echo "============================================"
echo "        Node3 EFK 部署脚本"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/{config/{elasticsearch,fluentd,kibana},logs/elasticsearch}
​
# 2. 创建Elasticsearch配置
cat > /opt/cluster-deploy/config/elasticsearch/elasticsearch.yml << 'EOF'
cluster.name: docker-cluster
node.name: elasticsearch-node1
discovery.type: single-node
network.host: 0.0.0.0
http.port: 9200
xpack.security.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
​
# 3. 创建Fluentd配置
cat > /opt/cluster-deploy/config/fluentd/fluentd-node3.conf << 'EOF'
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-containers.log.pos
  tag docker.*
  read_from_head true
  <parse>
    @type json
    time_type float
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
​
<filter docker.**>
  @type record_transformer
  <record>
    node_name Node3
  </record>
</filter>
​
<match docker.**>
  @type elasticsearch
  host 172.20.5.21
  port 9200
  logstash_format true
  logstash_prefix docker
  logstash_dateformat %Y.%m.%d
  flush_interval 10s
  buffer_type file
  buffer_path /var/log/fluentd-buffers/elasticsearch.buffer
  buffer_chunk_limit 2M
  buffer_queue_limit 256
</match>
EOF
​
# 4. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-efk-node3.yml << 'EOF'
services:
  fluentd:
    image: fluent/fluentd:v1.16-1
    container_name: fluentd
    networks:
      manage-net:
        ipv4_address: 172.20.5.22
    volumes:
      - ./config/fluentd/fluentd-node3.conf:/fluentd/etc/fluent.conf:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - fluentd-buffer:/var/log/fluentd-buffers
    environment:
      - FLUENTD_CONF=fluent.conf
    restart: unless-stopped
    logging:
      driver: none
​
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    hostname: elasticsearch
    networks:
      manage-net:
        ipv4_address: 172.20.5.21
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - xpack.security.enabled=false
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
      - ./config/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
​
  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    networks:
      manage-net:
        ipv4_address: 172.20.5.23
    environment:
      - ELASTICSEARCH_HOSTS=http://172.20.5.21:9200
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
​
volumes:
  elasticsearch-data:
  fluentd-buffer:
EOF
​
# 5. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-efk-node3.yml up -d
​
echo "Node3 EFK部署完成!"
echo "Kibana访问地址: http://192.168.64.130:5601"

Zabbix部署脚本

在所有节点执行Zabbix部署脚本。

Node1 Zabbix Agent部署

复制代码
#!/bin/bash
# Node1 Zabbix Agent部署
​
set -e
​
echo "============================================"
echo "        Node1 Zabbix Agent 部署"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/config/zabbix
​
# 2. 创建Agent配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_agentd-node1.conf << 'EOF'
Server=172.20.5.31
ServerActive=172.20.5.31
Hostname=Node1-Agent
BufferSend=5
BufferSize=100
Timeout=10
LogType=console
EOF
​
# 3. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-zabbix-node1.yml << 'EOF'
services:
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-7.0-latest
    container_name: zabbix-agent
    networks:
      manage-net:
        ipv4_address: 172.20.5.41
    volumes:
      - ./config/zabbix/zabbix_agentd-node1.conf:/etc/zabbix/zabbix_agent2.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - ZABBIX_SERVER_HOST=172.20.5.31
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
EOF
​
# 4. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-zabbix-node1.yml up -d
​
echo "Node1 Zabbix Agent部署完成!"

Node2 Zabbix Agent部署

复制代码
#!/bin/bash
# Node2 Zabbix Agent部署
​
set -e
​
echo "============================================"
echo "        Node2 Zabbix Agent 部署"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/config/zabbix
​
# 2. 创建Agent配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_agentd-node2.conf << 'EOF'
Server=172.20.5.31
ServerActive=172.20.5.31
Hostname=Node2-Agent
BufferSend=5
BufferSize=100
Timeout=10
LogType=console
EOF
​
# 3. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-zabbix-node2.yml << 'EOF'
services:
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-7.0-latest
    container_name: zabbix-agent
    networks:
      manage-net:
        ipv4_address: 172.20.5.42
    volumes:
      - ./config/zabbix/zabbix_agentd-node2.conf:/etc/zabbix/zabbix_agent2.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - ZABBIX_SERVER_HOST=172.20.5.31
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
EOF
​
# 4. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-zabbix-node2.yml up -d
​
echo "Node2 Zabbix Agent部署完成!"

Node3 Zabbix Server + Web + Agent部署

复制代码
#!/bin/bash
# Node3 Zabbix Server + Web + Agent部署
​
set -e
​
echo "============================================"
echo "        Node3 Zabbix 部署脚本"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/config/{zabbix,zabbix-mysql}
​
# 2. 创建Zabbix MySQL配置
cat > /opt/cluster-deploy/config/zabbix-mysql/my.cnf << 'EOF'
[mysqld]
server-id = 100
bind-address = 0.0.0.0
port = 3306
character-set-server = utf8mb4
max_connections = 200
innodb_buffer_pool_size = 256M
EOF
​
# 3. 创建Zabbix Server配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_server.conf << 'EOF'
LogType=console
EOF
​
# 4. 创建Agent配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_agentd-node3.conf << 'EOF'
Server=172.20.5.31
ServerActive=172.20.5.31
Hostname=Node3-Agent
BufferSend=5
BufferSize=100
Timeout=10
LogType=console
EOF
​
# 5. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-zabbix-node3.yml << 'EOF'
services:
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-7.0-latest
    container_name: zabbix-agent
    networks:
      manage-net:
        ipv4_address: 172.20.5.43
    volumes:
      - ./config/zabbix/zabbix_agentd-node3.conf:/etc/zabbix/zabbix_agent2.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - ZABBIX_SERVER_HOST=172.20.5.31
    restart: unless-stopped
​
  zabbix-mysql:
    image: mysql:8.0
    container_name: zabbix-mysql
    hostname: zabbix-mysql
    networks:
      manage-net:
        ipv4_address: 172.20.5.33
    volumes:
      - zabbix-mysql-data:/var/lib/mysql
      - ./config/zabbix-mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
    environment:
      - MYSQL_ROOT_PASSWORD=RootStr0ng!Pass
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=ZabbixStr0ng!Pass
    command:
      - --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
​
  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-7.0-latest
    container_name: zabbix-server
    hostname: zabbix-server
    networks:
      manage-net:
        ipv4_address: 172.20.5.31
    volumes:
      - zabbix-server-data:/var/lib/zabbix
    environment:
      - DB_SERVER_HOST=zabbix-mysql
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=ZabbixStr0ng!Pass
      - ZBX_CACHESIZE=128M
    ports:
      - "10051:10051"
    depends_on:
      - zabbix-mysql
    restart: unless-stopped
​
  zabbix-web:
    image: zabbix/zabbix-web-apache-mysql:alpine-7.0-latest
    container_name: zabbix-web
    hostname: zabbix-web
    networks:
      manage-net:
        ipv4_address: 172.20.5.32
    volumes:
      - zabbix-web-data:/etc/zabbix/web
    environment:
      - DB_SERVER_HOST=zabbix-mysql
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=ZabbixStr0ng!Pass
      - ZBX_SERVER_HOST=172.20.5.31
      - PHP_TZ=Asia/Shanghai
    ports:
      - "8080:8080"
    depends_on:
      - zabbix-mysql
      - zabbix-server
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
​
volumes:
  zabbix-mysql-data:
  zabbix-server-data:
  zabbix-web-data:
EOF
​
# 6. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-zabbix-node3.yml up -d
​
echo ""
echo "============================================"
echo "        Zabbix 部署完成!"
echo "============================================"
echo ""
echo "Zabbix Web访问地址: http://192.168.64.130:8080"
echo "默认用户名: Admin"
echo "默认密码: zabbix"
echo ""
echo "请在Web界面添加主机监控:"
echo "  - Node1: 172.20.5.41"
echo "  - Node2: 172.20.5.42"
echo "  - Node3: 172.20.5.43"

一键部署完整脚本

将以下内容保存为 deploy-all.sh,在Node3上执行:

复制代码
#!/bin/bash
# 完整集群部署脚本
​
set -e
​
echo "============================================"
echo "    Docker容器化集群 完整部署脚本"
echo "============================================"
​
# 等待用户确认
echo ""
read -p "是否开始部署?(y/n): " confirm
if [ "$confirm" != "y" ]; then
    echo "部署已取消"
    exit 0
fi
​
echo ""
echo "步骤1: 等待业务服务部署完成..."
echo "请确保已在各节点执行基础服务部署"
read -p "基础服务已部署完成?(y/n): " base_ready
if [ "$base_ready" != "y" ]; then
    echo "请先完成基础服务部署"
    exit 1
fi
​
echo ""
echo "步骤2: 部署EFK日志收集系统..."
echo "  - 请在各节点执行 EFK 部署脚本"
​
echo ""
echo "步骤3: 部署Zabbix监控系统..."
echo "  - 请在各节点执行 Zabbix 部署脚本"
​
echo ""
echo "============================================"
echo "    部署完成!访问地址汇总"
echo "============================================"
echo ""
echo "| 服务 | 地址 | 凭据 |"
echo "|------|------|------|"
echo "| Web应用 | http://172.20.1.100 | - |"
echo "| Kibana | http://192.168.64.130:5601 | - |"
echo "| Zabbix | http://192.168.64.130:8080 | Admin/zabbix |"
echo ""

相关推荐
gyx_这个杀手不太冷静2 分钟前
Agent开发进阶指南(第 2 章):Agent 运行全流程拆解、上下文窗口、流式输出、记忆系统与 Function Call 实战
前端·架构·agent
anyup3 分钟前
像这种问题千万别自己动手,否则你可太看不起 AI 了
前端·架构·trae
阳明山水1 小时前
销量预测2026下半年:新架构、新基准与新共识
人工智能·深度学习·算法·机器学习·架构
NutShell Wang2 小时前
DeepSeek-V4-Flash正式版深度拆解:不换架构,后训练如何让Agent能力暴涨7倍
人工智能·ai·架构·agent·后训练·deepseek
码上上班2 小时前
JumpServer 企业完整实操手册
容器
PC2005-cloud2 小时前
Windows 下 WSL2 + Docker Desktop + Ubuntu 开发环境搭建指南
windows·ubuntu·docker
小程故事多_802 小时前
时序检索型AI知识库落地思考,从向量元数据到双架构工程化落地全梳理
人工智能·架构
Zhang~Ling2 小时前
手写进程池:基于匿名管道的 Master-Slave 架构实战
linux·服务器·架构
誰能久伴不乏3 小时前
深入解析 C++ STL 底层原理:从设计哲学到内存收割机
c++·架构·stl
ACP广源盛139246256734 小时前
GSV6155@ACP# Type-C 视频信号转换芯片:技术架构、工程痛点适配与落地场景分析
大数据·c语言·开发语言·人工智能·分布式·嵌入式硬件·架构