Docker Compose 本地环境搭建:nacos
- [🔗 前言:Docker Compose 本地环境搭建相关文章](#🔗 前言:Docker Compose 本地环境搭建相关文章)
- [🐳 Docker Compose 本地环境搭建:nacos](#🐳 Docker Compose 本地环境搭建:nacos)
-
- [📚 目录结构设计](#📚 目录结构设计)
- [👣 使用 MySQL 持久化 Nacos 配置](#👣 使用 MySQL 持久化 Nacos 配置)
- [📄 docker-compose.yml](#📄 docker-compose.yml)
- [🚀 启动方式](#🚀 启动方式)
- [🌐 访问测试](#🌐 访问测试)
🔗 前言:Docker Compose 本地环境搭建相关文章
🐳 Docker Compose 本地环境搭建:nacos
📚 目录结构设计
推荐使用如下结构:
bash
infra/
├── .env
├── mysql/
│ └── docker-compose.yml
├── redis/
│ └── docker-compose.yml
├── elasticsearch/
│ └── docker-compose.yml
├── skywalking/
│ └── docker-compose.yml
├── nacos/
│ └── docker-compose.yml
👣 使用 MySQL 持久化 Nacos 配置
-
新建一个 Nacos 数据库及用户。
IDENTIFIED BY 'xxx'就是:数据库用户登录密码,必须和.env保持一致。sql-- ========================================================= -- Nacos 数据库初始化脚本 -- 命名规范:nacos / nacos_user -- ========================================================= -- 1️⃣ 创建数据库 CREATE DATABASE IF NOT EXISTS nacos DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci; -- 是 MySQL 8 的"标准现代 Unicode 排序规则" -- 2️⃣ 创建用户(已存在不会报错) CREATE USER IF NOT EXISTS 'nacos_user'@'%' IDENTIFIED BY 'Pass@8520'; -- 3️⃣ 授权 GRANT ALL PRIVILEGES ON nacos.* TO 'nacos_user'@'%'; -- 4️⃣ 刷新权限 FLUSH PRIVILEGES; -
执行数据库脚本
在 Nacos 官网 下载对应的版本包,数据库脚本在
nacos-server-3.2.0\nacos\conf下,以nacos-server-3.2.0为例bash/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /******************************************/ /* 表名称 = config_info */ /******************************************/ CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) DEFAULT NULL COMMENT 'group_id', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description', `c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage', `effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述', `type` varchar(64) DEFAULT NULL COMMENT '配置的类型', `c_schema` text COMMENT '配置的模式', `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='config_info'; /******************************************/ /* 表名称 = config_info since 2.5.0 */ /******************************************/ CREATE TABLE `config_info_gray` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `src_user` text COMMENT 'src_user', `src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip', `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create', `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `gray_name` varchar(128) NOT NULL COMMENT 'gray_name', `gray_rule` text NOT NULL COMMENT 'gray_rule', `encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key', PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`), KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`), KEY `idx_gmt_modified` (`gmt_modified`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='config_info_gray'; /******************************************/ /* 表名称 = config_tags_relation */ /******************************************/ CREATE TABLE `config_tags_relation` ( `id` bigint(20) NOT NULL COMMENT 'id', `tag_name` varchar(128) NOT NULL COMMENT 'tag_name', `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识', PRIMARY KEY (`nid`), UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='config_tag_relation'; /******************************************/ /* 表名称 = group_capacity */ /******************************************/ CREATE TABLE `group_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_group_id` (`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='集群、各Group容量信息表'; /******************************************/ /* 表名称 = his_config_info */ /******************************************/ CREATE TABLE `his_config_info` ( `id` bigint(20) unsigned NOT NULL COMMENT 'id', `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(128) NOT NULL COMMENT 'group_id', `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', `op_type` char(10) DEFAULT NULL COMMENT 'operation type', `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥', `publish_type` varchar(50) DEFAULT 'formal' COMMENT 'publish type gray or formal', `gray_name` varchar(50) DEFAULT NULL COMMENT 'gray name', `ext_info` longtext DEFAULT NULL COMMENT 'ext info', PRIMARY KEY (`nid`), KEY `idx_gmt_create` (`gmt_create`), KEY `idx_gmt_modified` (`gmt_modified`), KEY `idx_did` (`data_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='多租户改造'; /******************************************/ /* 表名称 = tenant_capacity */ /******************************************/ CREATE TABLE `tenant_capacity` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户容量信息表'; CREATE TABLE `tenant_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `kp` varchar(128) NOT NULL COMMENT 'kp', `tenant_id` varchar(128) default '' COMMENT 'tenant_id', `tenant_name` varchar(128) default '' COMMENT 'tenant_name', `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), KEY `idx_tenant_id` (`tenant_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='tenant_info'; CREATE TABLE `users` ( `username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username', `password` varchar(500) NOT NULL COMMENT 'password', `enabled` boolean NOT NULL COMMENT 'enabled' ); CREATE TABLE `roles` ( `username` varchar(50) NOT NULL COMMENT 'username', `role` varchar(50) NOT NULL COMMENT 'role', UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE ); CREATE TABLE `permissions` ( `role` varchar(50) NOT NULL COMMENT 'role', `resource` varchar(128) NOT NULL COMMENT 'resource', `action` varchar(8) NOT NULL COMMENT 'action', UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE ); /******************************************/ /* 表名称 = pipeline_execution */ /******************************************/ CREATE TABLE `pipeline_execution` ( `execution_id` varchar(64) NOT NULL COMMENT '执行ID', `resource_type` varchar(32) NOT NULL COMMENT '资源类型', `resource_name` varchar(256) NOT NULL COMMENT '资源名称', `namespace_id` varchar(128) DEFAULT NULL COMMENT '命名空间ID', `version` varchar(64) DEFAULT NULL COMMENT '版本', `status` varchar(32) NOT NULL COMMENT '执行状态', `pipeline` longtext NOT NULL COMMENT 'pipeline节点结果JSON', `create_time` bigint(20) NOT NULL COMMENT '创建时间', `update_time` bigint(20) NOT NULL COMMENT '修改时间', PRIMARY KEY (`execution_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI资源发布审核Pipeline执行记录'; /******************************************/ /* 表名称 = ai_resource */ /******************************************/ CREATE TABLE `ai_resource` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `name` varchar(256) NOT NULL COMMENT '资源名称', `type` varchar(32) NOT NULL COMMENT '资源类型', `c_desc` varchar(2048) DEFAULT NULL COMMENT '资源描述', `status` varchar(32) DEFAULT NULL COMMENT '资源状态', `namespace_id` varchar(128) NOT NULL DEFAULT '' COMMENT '命名空间ID', `biz_tags` varchar(1024) DEFAULT NULL COMMENT '业务标签', `ext` longtext DEFAULT NULL COMMENT '扩展信息(JSON)', `c_from` varchar(256) NOT NULL DEFAULT 'local' COMMENT '来源标识(导入/同步来源)', `version_info` longtext DEFAULT NULL COMMENT '版本信息(JSON)', `meta_version` bigint(20) NOT NULL DEFAULT 1 COMMENT '元数据版本(乐观锁)', `scope` varchar(16) NOT NULL DEFAULT 'PRIVATE' COMMENT '可见性: PUBLIC/PRIVATE', `owner` varchar(128) NOT NULL DEFAULT '' COMMENT '创建者用户名', `download_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '下载次数', PRIMARY KEY (`id`), UNIQUE KEY `uk_ai_resource_ns_name_type` (`namespace_id`,`name`,`type`,`c_from`), KEY `idx_ai_resource_name` (`name`), KEY `idx_ai_resource_type` (`type`), KEY `idx_ai_resource_gmt_modified` (`gmt_modified`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI资源元数据表'; /******************************************/ /* 表名称 = ai_resource_version */ /******************************************/ CREATE TABLE `ai_resource_version` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', `type` varchar(32) NOT NULL COMMENT '资源类型', `author` varchar(128) DEFAULT NULL COMMENT '作者', `name` varchar(256) NOT NULL COMMENT '资源名称', `c_desc` varchar(2048) DEFAULT NULL COMMENT '版本描述', `status` varchar(32) NOT NULL COMMENT '版本状态', `version` varchar(64) NOT NULL COMMENT '版本号', `namespace_id` varchar(128) NOT NULL DEFAULT '' COMMENT '命名空间ID', `storage` longtext DEFAULT NULL COMMENT '存储信息(JSON)', `publish_pipeline_info` longtext DEFAULT NULL COMMENT '发布流水线信息(JSON)', `download_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '下载次数', PRIMARY KEY (`id`), UNIQUE KEY `uk_ai_resource_ver_ns_name_type_ver` (`namespace_id`,`name`,`type`,`version`), KEY `idx_ai_resource_ver_name` (`name`), KEY `idx_ai_resource_ver_status` (`status`), KEY `idx_ai_resource_ver_gmt_modified` (`gmt_modified`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI资源版本表';
📄 docker-compose.yml
bash
# =========================================================
# 用于构建环境:Nacos(配置中心 + 注册中心)
# 宿主机挂载目录、端口、密码、版本号、环境后缀均通过 .env 文件管理
# =========================================================
###########################################################
# 网络配置
###########################################################
networks:
env_network: # 内部网络标识固定
driver: bridge
name: ${NETWORK_NAME} # Docker 实际网络名动态生成
ipam:
config:
- subnet: ${NETWORK_SUBNET} # 子网从 .env 获取
###########################################################
# 卷(Volume)配置
###########################################################
volumes:
# Nacos
nacos_logs:
driver: local
driver_opts:
type: none
device: ${HOST_VOLUME}/${ENV}/Nacos/logs
o: bind
nacos_data:
driver: local
driver_opts:
type: none
device: ${HOST_VOLUME}/${ENV}/Nacos/data
o: bind
###########################################################
# 服务定义
###########################################################
services:
# Nacos
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos_${NACOS_VERSION}_${ENV}
networks:
- env_network
ports:
- "${NACOS_PORT_UI}:8080"
- "${NACOS_PORT}:8848"
- "${NACOS_PORT_GRPC}:9848"
- "${NACOS_PORT_RAFT}:9849"
environment:
# =====================================================
# 启动模式
#
# standalone:
# - 单机模式(开发 / 测试使用)
#
MODE: standalone
# =====================================================
# MySQL 持久化配置
#
# ⚠ 注意:
# - 使用服务名 mysql
# - 使用容器内部端口 3306(不要用 ${MYSQL_PORT})
#
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: ${NACOS_DB_NAME}
MYSQL_SERVICE_USER: ${NACOS_DB_USER}
MYSQL_SERVICE_PASSWORD: ${NACOS_DB_PASSWORD}
# MYSQL_SERVICE_DB_PARAM:
# 解决 MySQL 8 报错 'Public Key Retrieval is not allowed'。
# MySQL 8.0 之后版本中默认将公钥验证功能关闭,而 nacos 系统使用的 JDBC 驱动程序需要启用公钥验证才能正常连接数据库。
MYSQL_SERVICE_DB_PARAM: useUnicode=true&characterEncoding=utf8&connectTimeout=2000&socketTimeout=3000&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
# =====================================================
# 鉴权配置
# 参考:https://www.nacos.io/docs/latest/manual/admin/auth/?spm=55c5c5db.2fe2adb0.0.0.d3a5568a2lawcG
# - NACOS_AUTH_TOKEN_EXPIRE_SECONDS:默认18000
#
NACOS_AUTH_ENABLE: ${NACOS_AUTH_ENABLE}
NACOS_AUTH_TOKEN: ${NACOS_AUTH_TOKEN}
NACOS_AUTH_TOKEN_EXPIRE_SECONDS: ${NACOS_AUTH_TOKEN_EXPIRE_SECONDS}
NACOS_AUTH_IDENTITY_KEY: ${NACOS_AUTH_IDENTITY_KEY}
NACOS_AUTH_IDENTITY_VALUE: ${NACOS_AUTH_IDENTITY_VALUE}
volumes:
- nacos_logs:/home/nacos/logs
- nacos_data:/home/nacos/data
restart: unless-stopped
labels:
env: ${ENV}
version: ${NACOS_VERSION}
service: nacos_${ENV}
🚀 启动方式
在 .env 同级目录下执行
bash
docker compose --env-file .env -f nacos/docker-compose.yml up -d
- -d 表示 后台运行
- Compose 会:
- 自动读取 .env 文件里的变量
- 根据 docker-compose.yml 配置创建网络、卷和容器
- 容器名、端口、挂载目录都会根据 .env 替换

🌐 访问测试
访问地址(改为你自己的映射端口) :http://localhost:28838/
