Docker搭建:Nacos

12/31/2024 运维操作系统Docker

目录


参考:


# Docker搭建:Nacos

# Docker 方式

# 环境依赖

软件/系统 版本 架构 包名 备注
Docker

# 安装搭建

mkdir -p /data/nacos/{conf,logs,data}
1
docker run --name nacos \
           -p 8848:8848 \
           -e MODE=standalone \
           -d nacos/nacos-server:1.2.1
1
2
3
4
docker cp nacos:/home/nacos/conf /data/nacos/
docker cp nacos:/home/nacos/logs /data/nacos/
docker cp nacos:/home/nacos/data /data/nacos/
1
2
3
docker stop nacos
docker rm nacos
1
2
docker run --name nacos \
           -p 8848:8848 \
           -v /data/nacos/conf:/home/nacos/conf \
           -v /data/nacos/logs:/home/nacos/logs \
           -v /data/nacos/data:/home/nacos/data \
           -e MODE=standalone \
           -d nacos/nacos-server:1.2.1
1
2
3
4
5
6
7
docker restart nacos
1

# Docker Compose 方式

# 环境依赖

软件/系统 版本 架构 包名 备注
Docker Compose

# 安装搭建

# 创建数据文件夹

# nacos
sudo mkdir -p /data/docker_nacos/{data,conf,logs}
# mysql
sudo mkdir -p /data/docker_nacos_mysql/{sock,data,mysql-files,conf,logs,init}
sudo mkdir -p /data/docker_nacos_mysql/conf/{my.cnf.d,conf.d,mysql.conf.d}
1
2
3
4
5

# 复制MySQL配置

# 启动一个退出后自动删除的临时容器
sudo docker run --rm --name temp-mysql -d mysql:5.7.44 tail -f /dev/null
1
2
  • --rm:容器停止后自动删除,避免残留容器占用资源。
  • tail -f /dev/null:保持容器活跃但不启动MySQL服务,避免因配置缺失导致服务崩溃。
# 将容器内的配置文件复制到宿主机目录
sudo docker cp temp-mysql:/etc/my.cnf /data/docker_nacos_mysql/conf/
1
2
  • temp-mysql:容器名称(需与上一步的 --name 一致)。

  • /etc/mysql/my.cnf:容器内配置文件路径。

    MySQL 5.7官方镜像的默认配置文件通常位于以下路径:

    • /etc/mysql/my.cnf(主配置文件)
    • /etc/mysql/conf.d/(包含额外配置文件的目录)

    也可进入容器查找路径:

    docker exec -it temp-mysql bash
    find / -name my.cnf
    
    1
    2
  • /data/docker_nacos_mysql/conf/my.cnf:宿主机目标路径,根据需要自定义。

# 检查宿主机目标路径下是否生成 `my.cnf` 文件:  
cat /data/docker_nacos_mysql/conf/my.cnf
1
2
#停止并清理容器
sudo docker stop temp-mysql
1
2

# 复制Nacos配置

# 启动一个退出后自动删除的临时容器
sudo docker run --rm --name temp-nacos -e MODE=standalone -d nacos/nacos-server:v2.4.3 tail -f /dev/null
1
2
# 复制
sudo docker cp temp-nacos:/home/nacos/conf /data/docker_nacos/
sudo docker cp temp-nacos:/home/nacos/logs /data/docker_nacos/
sudo docker cp temp-nacos:/home/nacos/data /data/docker_nacos/
1
2
3
4
#停止并清理容器
sudo docker stop temp-nacos
1
2
#复制Nacos建表脚本 
sudo cp /data/docker_nacos/conf/mysql-schema.sql /data/docker_nacos_mysql/init/
1
2

# 编辑Docker Compose文件

sudo vi docker-compose.yaml
1
# 版本
#version: "3"

# 网络
networks:
  # 数据库隔离
  db_internal:
    # 网络类型
    driver: bridge
    # 网络策略:仅内网访问
    internal: true
  # 应用网络
  app_network:
    # 网络类型
    driver: bridge

# 服务
services:
  # nacos服务
  nacos:
    # 容器名称
    container_name: nacos_2.4.3
    # 镜像及版本
    image: nacos/nacos-server:v2.4.3
    # 自动重启
    restart: always
    # 网络环境
    networks:
      - app_network
      - db_internal
    # 主机名
    hostname: nacos_2.4.3
    # 端口映射
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    # 环境变量
    environment:
      # 部署模式:单机模式
      - MODE=standalone
      # 服务实例标识模式:主机名模式(默认IP模式)
      - PREFER_HOST_MODE=hostname
      # 时区:亚洲/上海
      - TZ=Asia/Shanghai
      # 总开关:启用鉴权
      - NACOS_AUTH_ENABLE=true
      # JWT的加密密钥,用于生成和验证访问令牌:自定义Base64密钥(需≥32字符),生成方式:openssl rand -hex 32 | base64
      - NACOS_AUTH_TOKEN=MmRiZGU5ZjFhMzJmODM0MzlmZDE3NjkzMmYxMjNjM2EzNjYwY2M2NDYyNTk4YTY4NTkyNzRkMmZiNTQ1MDAxZQo=
      # 服务端身份标识的键值对,用于区分合法请求来源
      - NACOS_AUTH_IDENTITY_KEY=serverAuthKey  # 服务端身份标识键
      - NACOS_AUTH_IDENTITY_VALUE=serverAuthValue  # 服务端身份标识值
      # 数据库类型:mysql
      - NACOS_DATASOURCE_PLATFORM=mysql
      # MySQL数据库连接信息
      # 主机
      - MYSQL_SERVICE_HOST=mysql
      # 端口
      - MYSQL_SERVICE_PORT=3306
      # 账户
      - MYSQL_SERVICE_USER=nacos
      # 密码
      - MYSQL_SERVICE_PASSWORD=ns@at3721
      # 库名
      - MYSQL_SERVICE_DB_NAME=nacos_config
      # 连接参数
      - MYSQL_SERVICE_DB_PARAM='characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai'
    # 数据持久卷
    volumes:
      # 数据文件
      - "/data/docker_nacos/data:/home/nacos/data"
      # 配置文件
      - "/data/docker_nacos/conf:/home/nacos/conf"
      # 日志文件
      - "/data/docker_nacos/logs:/home/nacos/logs"
    # 依赖条件
    depends_on:
      mysql:
        condition: service_healthy

  # MySQL服务
  mysql:
    # 容器名称
    container_name: nacos_2.4.3_mysql_5.7.44
    # 镜像及版本
    image: mysql:5.7.44
    # 自动重启
    restart: always
    # 高级权限
    privileged: true
    # 网络环境
    networks:
      - db_internal
    # 主机名
    hostname: nacos_2.4.3_mysql_5.7.44
    # 端口映射
    #ports:
    #  - "3306:3306"
    # 数据持久卷
    volumes:
      - "/data/docker_nacos_mysql/sock:/var/run/mysqld"
      - "/data/docker_nacos_mysql/data:/var/lib/mysql"
      - "/data/docker_nacos_mysql/mysql-files:/var/lib/mysql-files"
      - "/data/docker_nacos_mysql/conf/my.cnf:/etc/my.cnf"
      - "/data/docker_nacos_mysql/conf/my.cnf.d:/etc/my.cnf.d"      
      - "/data/docker_nacos_mysql/conf/conf.d:/etc/mysql/conf.d"
      - "/data/docker_nacos_mysql/conf/mysql.conf.d:/etc/mysql/mysql.conf.d"
      - "/data/docker_nacos_mysql/logs:/var/log/mysql"
      - "/data/docker_nacos_mysql/init:/docker-entrypoint-initdb.d"
    # 环境变量
    environment:
      # 时区:亚洲/上海
      - TZ=Asia/Shanghai
      # 账户root密码
      - MYSQL_ROOT_PASSWORD=rt@at3721
      # 允许root通过所有IP访问
      - MYSQL_ROOT_HOST=%  
      # 数据库名称
      - MYSQL_DATABASE=nacos_config
      # 数据库账户
      - MYSQL_USER=nacos
      # 数据库账号密码
      - MYSQL_PASSWORD=ns@at3721
      # 中文编码
      - LANG=C.UTF-8
    # 健康检测
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-prt@at3721"]
      # 间隔时间
      interval: 5s
      # 超时时间
      timeout: 10s
      # 重试次数
      retries: 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  • PREFER_HOST_MODE 是 Nacos 中用于控制服务实例注册时优先使用主机名(hostname)还是 IP 地址的关键配置参数。以下是其核心作用与典型场景:

    • 作用说明

      • hostname 模式: 当设置为 hostname 时,Nacos 会优先使用主机名作为服务实例的标识。这在动态网络环境(如 Kubernetes)中尤为重要,因为容器 IP 可能频繁变化,而主机名通常更稳定。
  • ip 模式: 默认使用 IP 地址注册服务实例,适用于静态 IP 环境或需要直接通过 IP 访问的场景。

    • 典型场景

      • Kubernetes 环境 :在 K8s 集群中,Pod 的 IP 会随重启或扩缩容变化,而主机名(如 nacos-0.nacos-headless.default.svc.cluster.local)是固定的。通过 PREFER_HOST_MODE=hostname 可确保服务发现不受 IP 变动影响。

      • 多网卡环境 :若服务器有多个网卡(如内网+公网),指定主机名可避免 Nacos 误选不期望的 IP 地址。

    • 配置方式

      • 1. Docker 启动时配置

        docker run -d \
          --name nacos \
          -e PREFER_HOST_MODE=hostname \  # 强制使用主机名
          -e MODE=standalone \            # 单机模式
          -p 8848:8848 \
          nacos/nacos-server
        
        1
        2
        3
        4
        5
        6
      • 2. 配置文件修改

        application.properties 中添加:nacos.inetutils.prefer-hostname-over-ip=true

    • 注意事项

      • 主机名解析:需确保网络环境中主机名能被正确解析(如通过 DNS 或 /etc/hosts 配置)。

      • 鉴权配置:若需安全访问,建议同时启用鉴权(如 NACOS_AUTH_ENABLE=true)。

# 启动Docker Compose文件

# 启动
sudo docker compose up -d
# 关闭
sudo docker compose down
1
2
3
4

# 访问验证

部署完成后访问http://ip:8848/nacos,使用默认账号nacos/nacos登录,建议首次登录后立即修改密码。

# 常见问题

  1. 默认localhost身份验证问题[Note] Access denied for user 'root'@'localhost' (using password: YES)

    解决方式:确保root用户权限覆盖localhost

    # 进入容器
    docker exec -it nacos_2.4.3_mysql_5.7.44 mysql -uroot -prt@at3721
    
    1
    2

    添加root@localhost权限,注意:确保root@localhost的密码与配置一致。

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'rt@at3721';
    FLUSH PRIVILEGES;
    
    1
    2

待学习如何实现多容器互联? (opens new window)

上次更新时间: 4/16/2025, 2:13:02 AM