从零构建高可用Nacos集群:Docker Compose全栈部署指南

引言:为什么选择Docker Compose部署Nacos?

在微服务架构盛行的今天,服务发现与配置中心已成为基础设施的关键组件。Nacos作为阿里巴巴开源的动态服务发现、配置和服务管理平台,凭借其轻量级、高可用和易扩展的特性,逐渐成为云原生时代的标配工具。然而,传统的手动部署方式往往面临环境不一致、配置复杂、维护困难等痛点。

Docker Compose作为容器编排的利器,能够通过声明式YAML文件定义多容器应用,完美解决上述问题。本教程将带您从零开始,用Docker Compose搭建一个生产级Nacos集群,实现配置、日志和数据的持久化存储,并集成MySQL数据库作为后端存储。相比原始的Docker run命令,Compose方案具有以下优势:

  • 一键部署:单个命令即可启动整个Nacos生态系统
  • 版本控制友好:YAML文件可纳入Git等版本控制系统
  • 环境一致性:消除"在我机器上能运行"的问题
  • 可扩展性:轻松调整实例数量和资源配置

1. 环境准备与前置条件

1.1 硬件与软件需求

在开始部署前,请确保您的系统满足以下最低要求:

组件 最低配置 推荐配置
CPU 2核 4核
内存 4GB 8GB
存储 20GB 50GB
操作系统 Linux (CentOS 7+/Ubuntu 18.04+) -
Docker 20.10.0+ 最新稳定版
Docker Compose 2.0.0+ 最新稳定版

提示:生产环境建议使用SSD存储以提高数据库性能

1.2 安装必要工具

如果您的系统尚未安装Docker和Docker Compose,可执行以下命令:

# 安装Docker
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker

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

验证安装是否成功:

docker --version
docker-compose --version

2. 构建Nacos集群架构

2.1 项目目录结构规划

合理的目录结构是维护性的基础,建议按以下方式组织:

nacos-cluster/
├── docker-compose.yml      # 主编排文件
├── .env                    # 环境变量配置
├── mysql/
│   ├── conf.d/             # MySQL自定义配置
│   ├── initdb.d/           # 初始化SQL脚本
│   └── data/               # 数据库持久化数据
└── nacos/
    ├── conf/               # Nacos配置文件
    ├── logs/               # 日志目录
    └── data/               # 临时数据存储

创建基础目录:

mkdir -p nacos-cluster/{mysql/{conf.d,initdb.d,data},nacos/{conf,logs,data}}

2.2 MySQL数据库配置

Nacos支持多种数据库,我们选择MySQL作为持久化存储。在mysql/initdb.d目录下创建nacos-init.sql

CREATE DATABASE IF NOT EXISTS nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE nacos_config;

-- 以下是Nacos官方提供的建表语句
-- 来源:https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
-- 此处应包含完整的建表语句,限于篇幅省略具体内容

mysql/conf.d目录下创建custom.cnf优化MySQL配置:

[mysqld]
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000
innodb_buffer_pool_size=1G

2.3 Docker Compose核心配置

创建docker-compose.yml文件,这是整个部署的核心:

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: nacos-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: nacos_config
      TZ: Asia/Shanghai
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 10s
      retries: 10
    networks:
      - nacos-net

  nacos:
    image: nacos/nacos-server:${NACOS_VERSION}
    container_name: nacos-server
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      - MODE=standalone
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - JVM_XMS=512m
      - JVM_XMX=512m
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/data:/home/nacos/data
      - ./nacos/conf:/home/nacos/conf
    ports:
      - "8848:8848"
      - "9848:9848"
    restart: always
    networks:
      - nacos-net

networks:
  nacos-net:
    driver: bridge

创建.env环境变量文件:

# MySQL配置
MYSQL_ROOT_PASSWORD=your_secure_password

# Nacos配置
NACOS_VERSION=2.2.3

3. 部署与验证

3.1 启动Nacos集群

执行以下命令启动整个服务栈:

cd nacos-cluster
docker-compose up -d

观察日志确认服务正常启动:

docker-compose logs -f nacos

3.2 访问与基础配置

服务启动后,通过浏览器访问:

http://<your-server-ip>:8848/nacos

默认登录凭证:

  • 用户名:nacos
  • 密码:nacos

首次登录后,建议立即修改管理员密码:

  1. 点击右上角用户图标
  2. 选择"修改密码"
  3. 输入新密码并确认

3.3 防火墙配置

如果系统启用了防火墙,需要开放相关端口:

sudo firewall-cmd --permanent --add-port=8848/tcp
sudo firewall-cmd --permanent --add-port=9848/tcp
sudo firewall-cmd --reload

4. 高级配置与优化

4.1 Nacos配置文件定制

Nacos的核心配置文件是application.properties,我们可以通过挂载方式自定义配置。在nacos/conf目录下创建该文件:

# 服务器配置
server.servlet.contextPath=/nacos
server.port=8848

# 认证配置
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

# 数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=${MYSQL_ROOT_PASSWORD}

4.2 JVM内存调优

对于生产环境,建议调整Nacos的JVM参数。修改.env文件:

# JVM配置
JVM_XMS=2g
JVM_XMX=2g
JVM_XMN=1g

然后在docker-compose.yml中更新nacos服务的environment部分:

environment:
  - JVM_XMS=${JVM_XMS}
  - JVM_XMX=${JVM_XMX}
  - JVM_XMN=${JVM_XMN}

4.3 日志配置优化

Nacos使用Logback记录日志,我们可以自定义日志级别和输出格式。创建nacos/conf/logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    
    <property name="LOG_PATH" value="/home/nacos/logs"/>
    <property name="LOG_FILE" value="nacos.log"/>
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/nacos-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>5GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %thread | %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <root level="info">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

4.4 定期备份策略

为确保数据安全,建议设置定期备份。创建备份脚本backup_nacos.sh

#!/bin/bash

BACKUP_DIR="/opt/backups/nacos"
DATE=$(date +%Y%m%d)

# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE

# 备份MySQL数据
docker exec nacos-mysql mysqldump -uroot -p"${MYSQL_ROOT_PASSWORD}" nacos_config > $BACKUP_DIR/$DATE/nacos-mysql.sql

# 备份Nacos配置
tar -czf $BACKUP_DIR/$DATE/nacos-conf.tar.gz -C ./nacos/conf .
tar -czf $BACKUP_DIR/$DATE/nacos-data.tar.gz -C ./nacos/data .

# 保留最近7天备份
find $BACKUP_DIR -type d -mtime +7 | xargs rm -rf

设置定时任务(每天凌晨2点执行):

chmod +x backup_nacos.sh
(crontab -l ; echo "0 2 * * * /path/to/backup_nacos.sh") | crontab -

5. 常见问题排查

5.1 容器启动失败

如果Nacos容器无法启动,首先检查日志:

docker-compose logs nacos

常见问题及解决方案:

  • 数据库连接失败:确认MySQL服务已正常启动,检查连接参数是否正确
  • 权限问题:确保挂载目录对容器用户可写(Nacos默认使用nacos用户,UID=1000)
  • 端口冲突:确认8848和9848端口未被其他服务占用

5.2 性能优化建议

当Nacos响应变慢时,可考虑以下优化措施:

  1. 数据库优化

    • 为nacos_config数据库添加适当索引
    • 定期执行OPTIMIZE TABLE维护
    • 考虑使用读写分离架构
  2. Nacos配置调整

    # 增加工作线程数
    server.tomcat.max-threads=200
    
    # 调整心跳间隔
    nacos.core.raft.election.timeout.ms=5000
    
  3. 资源扩容

    • 增加容器内存分配
    • 为MySQL单独部署更高性能的服务器

5.3 版本升级策略

升级Nacos版本时的推荐步骤:

  1. 备份所有数据和配置
  2. 修改.env中的NACOS_VERSION
  3. 执行滚动更新:
    docker-compose pull
    docker-compose up -d
    
  4. 验证新版本功能正常

注意:跨大版本升级(如1.x到2.x)可能需要执行额外的数据迁移步骤,请参考官方升级指南

更多推荐