Skip to content

Docker Compose 部署 Nacos

Nacos 作为阿里巴巴开源的服务发现和配置管理平台,在微服务架构中扮演着重要角色。使用 Docker Compose 部署 Nacos 可以简化安装过程,提高部署效率。以下是详细的部署指南:

一、环境准备

在开始部署 Nacos 之前,需要确保系统满足以下要求:

  1. 硬件要求

    • 至少 4GB RAM(推荐 8GB 或更多)
    • 至少 2 个 CPU 核心
    • 至少 5GB 硬盘空间
  2. 软件要求

    • Docker 19.03 或更高版本
    • Docker Compose 1.25 或更高版本
  3. 安装 Docker 和 Docker Compose(如未安装):

    bash
    # 在Ubuntu上安装
    sudo apt-get update
    sudo apt-get install -y docker.io
    sudo systemctl start docker
    sudo systemctl enable docker
    sudo apt-get install -y docker-compose

二、单机模式部署

基本单机部署

  1. 创建项目目录并进入:

    bash
    mkdir nacos-docker && cd nacos-docker
  2. 创建docker-compose.yml文件,内容如下:

    yaml
    version: "3"
    services:
      nacos:
        image: nacos/nacos-server:latest
        container_name: nacos
        environment:
          - MODE=standalone # 单机模式
        ports:
          - "8848:8848" # Web控制台端口
          - "9848:9848" # gRPC通信端口(Nacos 2.0+需要)
        volumes:
          - ./data:/home/nacos/data # 数据持久化
          - ./logs:/home/nacos/logs # 日志持久化
        restart: always
  3. 启动 Nacos 服务:

    bash
    docker-compose up -d
  4. 验证部署: 访问http://localhost:8848/nacos,默认用户名/密码为nacos/nacos

带 MySQL 持久化的单机部署

对于生产环境,建议配置 MySQL 作为持久化存储:

yaml
version: "3.9"
services:
  nacos:
    image: nacos/nacos-server:v2.3.0
    container_name: nacos
    environment:
      MODE: standalone
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: db_mysql
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: nacos_user
      MYSQL_SERVICE_PASSWORD: nacos_passwd
      MYSQL_SERVICE_DB_NAME: nacos_config
    ports:
      - "8848:8848"
      - "9848:9848"
    volumes:
      - ./conf:/home/nacos/conf
      - ./logs:/home/nacos/logs
    depends_on:
      - db_mysql
    networks:
      - nacos_network

  db_mysql:
    image: mysql:5.7.30
    container_name: mysql_for_nacos
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: nacos_config
      MYSQL_USER: nacos_user
      MYSQL_PASSWORD: nacos_passwd
    ports:
      - "3306:3306"
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - nacos_network

networks:
  nacos_network:

三、集群模式部署

对于生产环境,建议使用集群模式提高可用性:

基础集群配置

yaml
version: "3"
services:
  nacos1:
    image: nacos/nacos-server:v2.5.0
    container_name: nacos-server-1
    hostname: nacos-server-1
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
    volumes:
      - ./cluster/nacos1/logs:/home/nacos/logs
      - ./cluster/nacos1/data:/home/nacos/data
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"

  nacos2:
    image: nacos/nacos-server:v2.5.0
    container_name: nacos-server-2
    hostname: nacos-server-2
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
    volumes:
      - ./cluster/nacos2/logs:/home/nacos/logs
      - ./cluster/nacos2/data:/home/nacos/data
    ports:
      - "8849:8848"
      - "9849:9848"
      - "9850:9849"

  nacos3:
    image: nacos/nacos-server:v2.5.0
    container_name: nacos-server-3
    hostname: nacos-server-3
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=123456
    volumes:
      - ./cluster/nacos3/logs:/home/nacos/logs
      - ./cluster/nacos3/data:/home/nacos/data
    ports:
      - "8850:8848"
      - "9851:9848"
      - "9852:9849"

带 Nginx 负载均衡的集群配置

yaml
version: "3"
networks:
  nacos:
    ipam:
      driver: default
      config:
        - subnet: "172.22.0.0/24"

services:
  nginx:
    image: nginx:1.21.1
    container_name: nacos-nginx
    volumes:
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8880:8880"
    networks:
      nacos:
        ipv4_address: 172.22.0.80
    depends_on:
      - nacos-server-1

  nacos-server-1:
    image: nacos/nacos-server:2.0.3
    container_name: nacos-server-1
    hostname: nacos-server-1
    env_file:
      - ./env/nacos-hostname.env
    environment:
      - NACOS_SERVERS=nacos-server-1:8848,nacos-server-2:8848,nacos-server-3:8848
      - PREFER_HOST_MODE=hostname
    ports:
      - "7848:7848"
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
      - "9555:9555"
    networks:
      nacos:
        ipv4_address: 172.22.0.11
    depends_on:
      - nacos-server-2
    mem_limit: 2000m

四、安全配置

开启鉴权功能

在 Nacos 2.x 版本中,可以通过以下环境变量开启鉴权:

yaml
environment:
  - NACOS_AUTH_ENABLE=true
  - NACOS_AUTH_TOKEN=base64编码的32位密钥
  - NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000
  - NACOS_AUTH_IDENTITY_KEY=nacos
  - NACOS_AUTH_IDENTITY_VALUE=自定义值

生成密钥的方法:

bash
# 生成32位密钥
openssl rand -hex 32
# 再进行base64编码

五、常见问题与优化

常见问题解决

  1. Nacos 服务未能启动

    • 检查docker-compose.yml中的环境变量设置是否正确,特别是MODE参数
  2. 端口被占用

    • 使用netstat -tulnp | grep 8848查看端口占用情况
    • 修改docker-compose.yml中的端口映射
  3. 数据库连接失败

    • 确保数据库容器正在运行
    • 检查网络配置是否正确

性能优化

  1. JVM 参数调整

    yaml
    environment:
      - JVM_XMS=512m # 初始堆内存
      - JVM_XMX=1024m # 最大堆内存
      - JVM_XMN=256m # 年轻代大小
  2. 数据库优化

    • 配置连接池参数
    • 优化 SQL 查询
  3. 资源限制

    yaml
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 2G

六、版本选择建议

  1. 生产环境建议使用特定版本而非latest标签
  2. Nacos 2.0+版本需要额外开放 9848 端口用于 gRPC 通信
  3. 不同版本可能有不同的兼容性要求,建议参考官方文档

通过以上步骤,您可以轻松地在各种环境中部署 Nacos 服务。根据实际需求选择合适的部署模式,并注意做好安全配置和性能优化。