docker中启动nacos

操作流程

linux平台的操作流程见该博客(而且他的mysql数据库不是容器、如果是容器得先保证nacos和mysql同一个网络下)

  1. 拉取镜像

    1
    docker pull nacos/nacos-server:v2.4.1
  2. 创建宿主机中的目录(windows演示)

    1
    2
    mkdir E:\develop_tools\Docker_data\nacos-2.4.1\nacos\logs
    mkdir E:\develop_tools\Docker_data\nacos-2.4.1\nacos\conf
  3. 首次启动nacos并复制文件到宿主机

    由于首次启动时对nacos的配置没写好,所以肯定是启动失败的,这次启动只是为了得到他的logs和conf,使用宿主机的目录去映射(这样就可以通过修改宿主机中的配置更改nacos的配置)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 启动临时容器
    docker run -d --name nacos-temp -p 8848:8848 nacos/nacos-server:v2.4.1

    # 复制容器内文件到宿主机
    docker cp nacos-temp:/home/nacos/logs/ E:\develop_tools\Docker_data\nacos-2.4.1\nacos\
    docker cp nacos-temp:/home/nacos/conf/ E:\develop_tools\Docker_data\nacos-2.4.1\nacos\

    # 删除临时容器
    docker rm -f nacos-temp
  4. mysql中创建nacos所需要的数据库、表

    • 你的 MySQL 运行在 Docker 容器中,容器名为 mysql-8.0.44,需先进入容器执行 SQL。

    • 从 Nacos 官方获取 SQL 脚本,并复制到容器中执行。

      (获取方式是通过release拿到发布的zip压缩文件,找到里面数据库的sql脚本)

      这个脚本一定要根据nacos对应版本来拿,我拿到的叫mysql-schema.sql,所以下面指令也要把nacos-mysql.sql这个名字改一下

      文件内容为(或者直接用下面内容创建一个sql脚本文件):

      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
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      /*
      * 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=utf8 COLLATE=utf8_bin COMMENT='config_info';

      /******************************************/
      /* 表名称 = config_info_aggr */
      /******************************************/
      CREATE TABLE `config_info_aggr` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `data_id` varchar(255) NOT NULL COMMENT 'data_id',
      `group_id` varchar(128) NOT NULL COMMENT 'group_id',
      `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
      `content` longtext NOT NULL COMMENT '内容',
      `gmt_modified` datetime NOT NULL COMMENT '修改时间',
      `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


      /******************************************/
      /* 表名称 = config_info_beta */
      /******************************************/
      CREATE TABLE `config_info_beta` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `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',
      `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
      `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',
      `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
      `encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

      /******************************************/
      /* 表名称 = config_info_tag */
      /******************************************/
      CREATE TABLE `config_info_tag` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
      `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',
      `tag_id` varchar(128) NOT NULL COMMENT 'tag_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',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

      /******************************************/
      /* 表名称 = 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=utf8 COLLATE=utf8_bin 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=utf8 COLLATE=utf8_bin 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 '密钥',
      PRIMARY KEY (`nid`),
      KEY `idx_gmt_create` (`gmt_create`),
      KEY `idx_gmt_modified` (`gmt_modified`),
      KEY `idx_did` (`data_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin 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=utf8 COLLATE=utf8_bin 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=utf8 COLLATE=utf8_bin 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
      );


    • 如何将 SQL 脚本复制到容器:

      1
      2
      # 将本地 nacos-mysql.sql 复制到容器内的 /tmp 目录
      docker cp nacos-mysql.sql mysql-8.0.44:/tmp/
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 进入 MySQL 容器
    docker exec -it mysql-8.0.44 bash

    # 在容器内登录 MySQL(账号 root,密码 123456)
    mysql -u root -p123456

    # 创建数据库(假设数据库名为 `nacos_config`,可根据需要修改)
    CREATE DATABASE IF NOT EXISTS `nacos_config` DEFAULT CHARACTER SET utf8;

    # 使用数据库并执行 SQL 脚本
    USE `nacos_config`;
    SOURCE /tmp/nacos-mysql.sql; # 需先将脚本文件复制到容器内
  5. 再次启动nacos

    • 网络配置:确保 Nacos 容器与 MySQL 容器在同一个 Docker 网络中(默认 bridge 网络可通过容器名通信)。

    • 环境变量

      • MYSQL_SERVICE_HOST 改为 MySQL 容器名 mysql-8.0.44
      • 数据库名、用户名、密码根据你的配置调整(此处假设数据库名为 nacos_config,用户为 root,密码为 123456)。
    • 卷挂载路径:使用 Linux 风格的路径(Docker Desktop 支持),将 E:\ 转换为 /e/

    • docker run -d --name nacos --network nacos-network -p 8848:8848 -p 9848:9848 -p 9849:9849 --privileged=true -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=mysql-8.0.44 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos_config -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC" -v /e/develop_tools/Docker_data/nacos-2.4.1/nacos/logs:/home/nacos/logs -v /e/develop_tools/Docker_data/nacos-2.4.1/nacos/conf:/home/nacos/conf --restart=always nacos/nacos-server:v2.4.1
      
      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

      -

      ```bash
      # 1. 创建自定义网络
      docker network create nacos-network

      # 2. 将MySQL容器连接到自定义网络
      docker network connect nacos-network mysql-8.0.44

      # 3. 启动Nacos时也使用这个网络
      docker run -d \
      --name nacos \
      --network nacos-network \
      -p 8848:8848 \
      -p 9848:9848 \
      -p 9849:9849 \
      --privileged=true \
      -e JVM_XMS=256m \
      -e JVM_XMX=256m \
      -e MODE=standalone \
      -e SPRING_DATASOURCE_PLATFORM=mysql \
      -e MYSQL_SERVICE_HOST=mysql-8.0.44 \
      -e MYSQL_SERVICE_PORT=3306 \
      -e MYSQL_SERVICE_DB_NAME=nacos_config \
      -e MYSQL_SERVICE_USER=root \
      -e MYSQL_SERVICE_PASSWORD=123456 \
      -e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC" \
      -v /e/develop_tools/Docker_data/nacos-2.4.1/nacos/logs:/home/nacos/logs \
      -v /e/develop_tools/Docker_data/nacos-2.4.1/nacos/conf:/home/nacos/conf \
      --restart=always \
      nacos/nacos-server:v2.4.1
  6. 修改配置文件

    • 在 Windows 宿主机上修改 E:\develop_tools\Docker_data\nacos-2.4.1\nacos\conf\application.properties
    • 将数据库连接地址改为 MySQL 容器名 mysql-8.0.44

    用文本编辑器打开文件,修改以下内容:

    1
    2
    3
    4
    5
    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://mysql-8.0.44:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user=root
    db.password=123456

    文件修改内容(对应自己的mysql)

    1
    2
    3
    4
    5
    6
    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=30000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user=root
    db.password=root

关键注意事项:

  1. Docker 网络:确保 Nacos 和 MySQL 容器在同一个网络(默认 bridge 网络即可通过容器名通信)。

  2. 卷挂载路径:在 Docker 命令中,Windows 路径需转换为 Linux 风格(如 E:\/e/)。

  3. MySQL 连接:使用容器名 mysql-8.0.44 作为主机名,而不是 localhost 或 IP。

  4. 数据库名:请确保与步骤 4 中创建的数据库名一致(此处示例为 nacos_config)。

  5. windows宿主机访问: http://localhost:8848/nacos 即可进入 Nacos 控制台(默认账号/密码:nacos/nacos)。

报错问题:

image-20251103114939619

也就是有Public Key Retrieval is not allowed这一句报错

这个错误是由于 MySQL 连接问题导致的,具体是 “Public Key Retrieval is not allowed” 错误。这通常发生在 MySQL 8.0+ 版本中,与身份验证插件和 SSL 配置有关。

也就是nacos在启动时,必须要加上这一个参数,其中包含了allowPublicKeyRetrieval=true

1
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"